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

Необходимые файлы:
pdftoxml.exe  http://pdftoxml.sourceforge.net, based on Xpdf  
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.)

Скрипт можно свободно копировать, модифицировать и распространять без каких-либо ограничений.
Автор не несет ответственности за использование скрипта, а также за вред и убытки из-за возможных ошибок.
                                                             27.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 "pdftoxml.exe" -f 1 -l 9999 -noImage "'&$pdffile&'" pdfxml2.xml', '', @SW_HIDE)
ToolTip ( "Create pdfxml file",0,0 )
InsertCRLF3()
;MsgBox(0, "jj", "kkkk")
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, 12) = '<PAGE width=' Then
            $str = StringSplit($line, '"')
            $page = Int($str[6])
            ToolTip ( "page:"&@CRLF&$page,0,0 )
            $k1 = $DjvuPageSize[0] / (Int($str[4])); коэффициент по высоте
            $k2 = $DjvuPageSize[1] / (Int($str[2])); коэффициент по ширине
        EndIf
        If StringLeft($line, 6) = '<TEXT ' Then FileWriteLine($djvunewxml, '            <LINE>')
        If StringLeft($line, 7) = '</TEXT>' Then
        FileWriteLine($djvunewxml, '            </LINE>')
        If StringRight($textline, 1)='-' Then   $wrap=StringTrimRight($textline, 1); убираем перенос
        EndIf
        If StringLeft($line, 7) = '<TOKEN ' Then
            $str = StringSplit($line, '"')
            $top = Round($k1 * Int($str[$str[0]-7]))
            $left = Round($k2 * Int($str[$str[0]-9]))
            $width = Round($k2 * Int($str[$str[0]-3]))
            $height = Round($k1 * Int($str[$str[0]-1]))
            $x1 = $left
            $y1 = $top + $height
            $x2 = $left + $width
            $y2 = $top
            $textline = $str[$str[0]]
            $textline = StringTrimLeft($textline, 1)
            $textline = StringTrimRight($textline, 8)
            FileWriteLine($djvunewxml, '              <WORD coords="' & $x1 & ',' & $y1 & ',' & Round($x2) & ',' & $y2 & '">' & $wrap&$textline & '</WORD>')
            $wrap=''
        EndIf
        If $line = '</PAGE>' Then ExitLoop
    WEnd
    ;write close tags
    FileWriteLine($djvunewxml, '          </PARAGRAPH>'&@CRLF&'        </REGION>'&@CRLF&'      </PAGECOLUMN>'&@CRLF&'    </HIDDENTEXT>')
EndFunc   ;==>writedata

Func InsertCRLF()
    Local $pdfxmlfile, $pdfxmlfileCRLF, $symb, $pred, $data
    $pdfxmlfile=FileOpen("pdfxml2.xml",0)
    $pdfxmlfileCRLF=FileOpen("pdfxml.xml",2)
    $pred=""
    $data=''
    While 1
        $symb = FileRead($pdfxmlfile, 1)
        If @error = -1 Then ExitLoop
       If $symb="<" And $pred=">" Then FileWrite($pdfxmlfileCRLF, @CRLF)
        FileWrite($pdfxmlfileCRLF, $symb)
        $pred=$symb
        ;$data=$data&$symb
    WEnd
    ;FileWrite($pdfxmlfileCRLF, $data)
    FileClose($pdfxmlfileCRLF)
    FileClose($pdfxmlfile)
EndFunc

Func InsertCRLF3()
    Local $pdfxmlfile, $pdfxmlfileCRLF, $symb, $pred, $data
    $pdfxmlfile=FileOpen("pdfxml2.xml",0)
    $pdfxmlfileCRLF=FileOpen("pdfxml.xml",2)
    $pred=""
    $data=''
    While 1
        $line = FileRead($pdfxmlfile, 32768)
        If @error = -1 Then ExitLoop
        If StringRight($line, 1)=">" Then $line=$line&FileRead($pdfxmlfile,1)
        $line=StringReplace($line, "><", ">"&@CRLF&"<")
        FileWrite($pdfxmlfileCRLF, $line)
        ;$pred=$symb
        ;$data=$data&$symb
    WEnd
    ;FileWrite($pdfxmlfileCRLF, $data)
    FileClose($pdfxmlfileCRLF)
    FileClose($pdfxmlfile)
EndFunc

Func InsertCRLF2()
    Local $pdfxmlfile, $pdfxmlfileCRLF, $line, $i, $data
    $pdfxmlfile=FileOpen("pdfxml2.xml",0)
    $pdfxmlfileCRLF=FileOpen("pdfxml.xml",2)
    $pred=""
    While 1
        $line = FileReadLine($pdfxmlfile)
        If @error = -1 Then ExitLoop
        $data=StringSplit($line, "><", 1)
        FileWriteLine($pdfxmlfileCRLF, $data[1])
        For $i=2 To $data[0]-1
        FileWriteLine($pdfxmlfileCRLF, "<"&$data[$i]&">")   
    Next
        FileWriteLine($pdfxmlfileCRLF, $data[$data[0]]) 
    WEnd   
    FileClose($pdfxmlfileCRLF)
    FileClose($pdfxmlfile)
EndFunc
Hosted by uCoz