#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