如果我djvu
从tiff
文件中创建一个新文件,我可以使用djvubind
它使该djvu
文件可以使用例如tesseract-ocr
.
但是假设我已经给出了djvu
文件。我怎样才能使其可搜索?
对于 pdf,我知道pdfsandwich
djvu 有类似的东西吗?
答案1
“简单”的方法是将 .djvu 文件转换回多个.tiff
文件(而不是多页 TIFF),然后将它们与 .djvu 文件重新组合djvubind
。然而,这会在一定程度上降低文件的图像质量,.djvu
因为这是一种有损转换(几乎可以肯定,当您使用.
所以你最好在原文中插入 OCR 文本.djvu
,这就是
这个脚本做。该脚本依赖于一些二进制文件,您可以在djvulibre-bin
包中找到这些二进制文件,以防您尚未安装它们。
这是脚本:
#!/usr/bin/perl
$lang = "eng";
if ( $#ARGV < 0 ) {
print "give a DJVU file as 1st argument \n" ;
exit 0 ;
}
$inputdjvu = $ARGV[0] ;
$imagetmp = "/tmp/temp.tif" ;
$djvutmp = "/tmp/outdjvu" ;
print "processing of $inputdjvu\n" ;
# calculate the number of pages
$nbpages = `djvused "$inputdjvu" -e 'n'` ;
print "number of pages: $nbpages" ;
for ($i=1 ; $i <= $nbpages ; $i++) {
print "OCR de la page $i\n" ;
# page extraction as an image
`ddjvu -format=tiff -mode=black -page="$i" "$inputdjvu" $imagetmp` ;
`tesseract $imagetmp /tmp/outocr -l $lang` ;
print "OCR done\n" ;
open(TXT, '/tmp/outocr.txt') ;
open(TXTDJVU, ">$djvutmp") ;
print TXTDJVU "(page 0 0 1 1\n" ;
while ($line=<TXT>) {
$line =~ s/\"/\\\"/g ;
print TXTDJVU "(line 0 0 1 1 \"$line\")\n" ;
}
print TXTDJVU ")\n" ;
close (TXT) ;
close (TXTDJVU) ;
# writing the text in the DJVU file
`djvused "$inputdjvu" -e 'select $i; remove-txt' -s` ;
`djvused "$inputdjvu" -e 'select $i; set-txt $djvutmp' -s` ;
}
# note: structure which works
# print TXTDJVU "(page 0 0 1 1\n" ;
# print TXTDJVU " (line 0 0 1 1 \"toto\")\n" ;
# print TXTDJVU " (line 0 0 1 1 \"toto la la\")\n";
# print TXTDJVU ")\n" ;