#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