#comments-start
TransferOcrLayer v.1. (alpha)
Скрипт предназначен для переноса скрытого текстового слоя из PDF файла
(текст под изображением) в в текстовой слой DJVU файла.

Необходимые для работы файлы должны находится в той же папке, что и скрипт,
путь к папке не должен содержать пробелов или  быть слишком длинным.

Необходимые файлы:
pdftohtml.exe v. 0.39 http://pdftohtml.sourceforge.net, based on Xpdf version 3.00
(в следующих версиях скрипта возможно будет использоватся утилита pdftoxml.exe).
djvutoxml.exe из DjVuLibre http://djvu.sourceforge.net
djvuxmlparser.exe из DjVuLibre 3.5.19 http://djvu.sourceforge.net
+ дополнительные dll из DjVuLibre
(Внимание: НЕ использовать djvuxmlparser.exe (660кб) из DjVuLibre 3.5.17, т.к. возникает проблема с кодировкой.
Вместо djvuxmlparser.exe можно использовать более быструю djvuparsexml.exe от LizardTech.)

Скрипт можно свободно копировать, модифицировать и распространять без каких-либо ограничений.
Автор не несет ответственности за использование скрипта, а также за вред и убытки из-за возможных ошибок.

25.05.08
U235 (alexrey036\<at>\gmail.com)

#comments-end
$djvufile=FileOpenDialog("Open DJVU file", "",  "DJVU (*.djv*)", 1)
$pdffile=FileOpenDialog("Open PDF file", "",  "PDF (*.pdf)", 1)
ToolTip ( "Create pdfxml file",0,0 )
RunWait(@ComSpec & " /c ""pdftohtml.exe"" -f 1 -l 9999 -xml -enc UTF-8 -hidden "&$pdffile&" pdfxml", "", @SW_HIDE)
ToolTip ( "Create djvuxml file",0,0 )
RunWait(@ComSpec & " /c ""djvutoxml.exe"" "&$djvufile&" djvu.xml", "", @SW_HIDE)
ToolTip ( "",0,0 )
If Not (FileExists("pdfxml.xml") And FileExists("djvu.xml")) Then Exit
$pdfxml = FileOpen("pdfxml.xml", 0)
$djvuxml = FileOpen("djvu.xml", 0)
$djvunewxml = FileOpen("djvunew.xml", 2)
Dim $DjvuPageSize[2]
Dim $wrap=""
While 1
    $djvuline = FileReadLine($djvuxml)
    If @error = -1 Then ExitLoop
    If StringLeft($djvuline, 13) = '<OBJECT data=' Then Sizedjvu($djvuline, $DjvuPageSize)
    If $djvuline = "<HIDDENTEXT/>" Then
        writedata()
    Else
        FileWriteLine($djvunewxml, $djvuline)
    EndIf
WEnd
FileClose($pdfxml)
FileClose($djvuxml)
FileClose($djvunewxml)
ToolTip ( "Transfer ocr layer to djvu",0,0 )

RunWait(@ComSpec & " /c ""djvuxmlparser.exe"" djvunew.xml", "", @SW_HIDE)



Func Sizedjvu(Const $djvuline, ByRef $DjvuPageSize)
    Local $data
    $data = StringSplit($djvuline, '"')
    $DjvuPageSize[0] = Int($data[6]) ;height
    $DjvuPageSize[1] = Int($data[8]) ;width
EndFunc   ;==>Sizedjvu

Func writedata()
    Local $line, $page, $k1, $k2, $str, $top, $left, $width, $height, $i, $x1, $x2, $y1, $y2, $x1w, $x2w, $y1w, $y2w, $textline, $wsymb, $allsymbol
    ;write open tags
    FileWriteLine($djvunewxml, '    <HIDDENTEXT>'&@CRLF&'      <PAGECOLUMN>'&@CRLF&'        <REGION>'&@CRLF&'          <PARAGRAPH>')
    While 1
        $line = FileReadLine($pdfxml)
        If @error = -1 Then ExitLoop
        If StringLeft($line, 13) = '<page number=' Then
            $str = StringSplit($line, '"')
            $page = Int($str[2])
            ToolTip ( "page:"&@CRLF&$str[2],0,0 )
            $k1 = $DjvuPageSize[0] / (Int($str[10]) - Int($str[6])); коэффициент по высоте
            $k2 = $DjvuPageSize[1] / (Int($str[12]) - Int($str[8])); коэффициент по ширине
        EndIf
        If StringLeft($line, 10) = '<text top=' Then
            $str = StringSplit($line, '"')
            $top = Round($k1 * Int($str[2]))
            $left = Round($k2 * Int($str[4]))
            $width = Round($k2 * Int($str[6]))
            $height = Round($k1 * Int($str[8]))
            $x1 = $left
            $y1 = $top + $height
            $x2 = $left + $width
            $y2 = $top
            FileWriteLine($djvunewxml, '            <LINE>')
            $textline = $str[11]
            $textline = StringTrimLeft($textline, 1)
            $textline = StringTrimRight($textline, 7)
            $textline = StringReplace($textline, "<b>", "")
            $textline = StringReplace($textline, "</b>", "")
            $textline = StringReplace($textline, "<i>", "")
            $textline = StringReplace($textline, "</i>", "")
            $word = StringSplit($textline, " ")
            $allsymbol = $word[0] - 1;
            For $i = 1 To $word[0]
                $allsymbol = $allsymbol + StringLen($word[$i])
            Next
            $wsymb = $width / $allsymbol
            $x1w = $left
            $y1w = $top + $height
            $x2w = $left + $wsymb * StringLen($word[1])
            $y2w = $top
            FileWriteLine($djvunewxml, '              <WORD coords="' & $x1w & ',' & $y1w & ',' & Round($x2w) & ',' & $y2 & '">' & $wrap&$word[1] & '</WORD>')
            For $i = 2 To $word[0]
                $x1w = $x2w + $wsymb
                $x2w = $x1w + $wsymb * StringLen($word[$i])
                FileWriteLine($djvunewxml, '              <WORD coords="' & Round($x1w) & ',' & $y1w & ',' & Round($x2w) & ',' & $y2 & '">' & $word[$i] & '</WORD>')
            Next
           
            If StringRight($word[$word[0]], 1)='-' Then
            $wrap=StringTrimRight($word[$word[0]], 1)
            Else
            $wrap=''
            EndIf
           
            FileWriteLine($djvunewxml, '            </LINE>')
        EndIf
        If $line = '</page>' Then ExitLoop
    WEnd
    ;write close tags
    FileWriteLine($djvunewxml, '          </PARAGRAPH>'&@CRLF&'        </REGION>'&@CRLF&'      </PAGECOLUMN>'&@CRLF&'    </HIDDENTEXT>')

EndFunc   ;==>writedata
Hosted by uCoz