一年前已经在这里讨论过:
有没有办法批处理尚未使用OCRed的OCR PDF?我认为这是当前处理两个问题的状态:
批量OCR PDF
视窗
Acrobat –这是将对OCR进行批处理的最直接的ocr引擎。唯一的问题似乎是1)它不会跳过已经是OCRed的文件2)尝试向其扔一些PDF(有些旧)并看着它崩溃。这有点越野车。它会警告您遇到的每个错误(尽管您可以告诉软件不通知。但是,同样,它会在某些类型的PDF上严重死亡,因此您的行程可能会有所不同。
ABBYY FineReader(批处理/扫描快照),Omnipage –这些必须是人类已知的最差的编程软件。如果您可以找到如何完全自动化(无提示)批处理具有相同名称的PDF的 OCR,请在此处发布。看来,我能找到的唯一解决方案在某个地方失败了-重命名,不完全自动化等。充其量,有一种方法可以做到这一点,但是文档和编程是如此恐怖,以至于您永远找不到。
ABBYY FineReader Engine,ABBYY识别服务器 -这些确实是更多的企业解决方案,您可能最好让acrobat在文件夹上运行并尝试清除会给您带来错误/崩溃程序的pdf文件,而不是像尝试那样麻烦安装评估软件(假设您是简单的最终用户)。对于小型用户而言,似乎没有成本竞争力。
** Autobahn DX工作站**该产品的价格是如此昂贵,您可能可以购买6份杂技演员。并不是真正的最终用户解决方案。如果您是企业设置,这对您来说值得。
的Linux
- WatchOCR –不再开发,基本上不可能在现代Ubuntu发行版上运行
- pdfsandwich –不再开发,基本上不可能在现代Ubuntu发行版上运行
- ** ABBY LINUX OCR **-这应该可以编写脚本,并且似乎有一些不错的效果:
http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison
但是,就像它们按页面收费的许多其他这些ABBYY产品一样,您最好使Acrobat Batch OCR正常工作。
** Ocrad,GOCR,OCRopus,tesseract,** –这些可能有用,但存在一些问题:
- 对于其中的一些,OCR结果不如acrobat好(请参见上面的链接)。
- 这些程序均不接受PDF文件并输出PDF文件。您必须创建一个脚本并首先分解PDF,然后在每个脚本上运行程序,然后将文件重新组合为pdf。
- 完成后,您可能会像我一样发现(tesseract)创建了一个移过的OCR层。因此,如果您搜索单词“ the”,则会在该单词旁边看到一个突出的部分。
批处理DjVu →转换为PDF –尚未研究,但似乎是一个可怕的解决方案。
线上
- PDFcubed.com –来了,不是真正的批处理解决方案。
- ABBYY Cloud OCR-不确定这是否真的是一个批处理解决方案,无论哪种方式,您都必须按页面付费,这可能会变得很昂贵。
识别非OCRed PDF
这是一个稍微容易一些的问题,可以在Linux中轻松解决,而在Windows中则更容易解决。我能够编写一个Perl脚本pdffont
来识别是否嵌入了字体,以确定哪些文件不是OCRed。
当前的“解决方案”
使用脚本来识别非OCRed PDF(这样就不会重新运行成千上万的OCRed PDF)并将其复制到临时目录(保留正确的目录树)中,然后在Windows上使用Acrobat在这些目录上运行以希望较小的批次不会崩溃。
使用相同的脚本,但是获得Linux OCR工具之一才能正常工作,这会降低OCR的质量。
我想我将尝试#1,我只是过于担心Linux OCR工具的结果(我想没有人做过比较),将文件拆开再重新拼接在一起似乎如果Adobe实际上可以在不使目录阻塞的情况下对OCR进行批处理,则无需进行编码。
如果您想要一个完全免费的解决方案,则必须使用脚本来识别非OCRed的pdf(或仅在OCRed上重新运行),然后使用一种Linux工具尝试对其进行OCR。Teseract似乎取得了最佳效果,但是,再次说明,在现代版本的Ubuntu中,其中一些工具不被很好地支持,尽管如果您可以对其进行设置并解决我遇到的图像层与文本匹配层不匹配的问题(使用tesseract),那么您将拥有一个非常可行的解决方案,然后再次选择Linux> Windows。
您是否有一个可行的解决方案,可以完全自动化,批量处理OCR PDF,并以高质量跳过已经存在相同名称的OCRed文件?如果是这样,我将非常感谢您的投入。
Perl脚本将非OCRed文件移动到临时目录。无法保证可以正常工作,并且可能需要重写,但是如果有人使它正常工作(假设它不工作)或效果更好,请告诉我,我将在此处发布更好的版本。
#!/usr/bin/perl
# move non-ocred files to a directory
# change variables below, you need a base dir (like /home/joe/), and a sourcedirectory and output
# direcotry (e.g books and tempdir)
# move all your pdfs to the sourcedirectory
use warnings;
use strict;
# need to install these modules with CPAN or your distros installer (e.g. apt-get)
use CAM::PDF;
use File::Find;
use File::Basename;
use File::Copy;
#use PDF::OCR2;
#$PDF::OCR2::CHECK_PDF = 1;
#$PDF::OCR2::REPAIR_XREF = 1;
my $basedir = '/your/base/directory';
my $sourcedirectory = $basedir.'/books/';
my @exts = qw(.pdf);
my $count = 0;
my $outputroot = $basedir.'/tempdir/';
open( WRITE, >>$basedir.'/errors.txt' );
#check file
#my $pdf = PDF::OCR2->new($basedir.'/tempfile.pdf');
#print $pdf->page(10)->text;
find(
{
wanted => \&process_file,
# no_chdir => 1
},
$sourcedirectory
);
close(WRITE);
sub process_file {
#must be a file
if ( -f $_ ) {
my $file = $_;
#must be a pdf
my ( $dir, $name, $ext ) = fileparse( $_, @exts );
if ( $ext eq '.pdf' ) {
#check if pdf is ocred
my $command = "pdffonts \'$file\'";
my $output = `$command`;
if ( !( $output =~ /yes/ || $output =~ /no/ ) ) {
#print "$file - Not OCRed\n";
my $currentdir = $File::Find::dir;
if ( $currentdir =~ /$sourcedirectory(.+)/ ) {
#if directory doesn't exist, create
unless(-d $outputroot.$1){
system("mkdir -p $outputroot$1");
}
#copy over file
my $fromfile = "$currentdir/$file";
my $tofile = "$outputroot$1/$file";
print "copy from: $fromfile\n";
print "copy to: $tofile\n";
copy($fromfile, $tofile) or die "Copy failed: $!";
# `touch $outputroot$1/\'$file\'`;
}
}
}
}
}