批量 OCR 许多 PDF

Joe*_*Joe 22 windows linux pdf ocr adobe-acrobat

这已经在一年前在这里讨论过:

许多 PDF 文件的批处理 OCR(尚未 OCR)?

有没有办法批量处理尚未经过 OCR 处理的 OCR PDF?我认为,这是处理两个问题的当前状态:

批量 OCR PDF

视窗

  • Acrobat – 这是最直接的 OCR 批处理引擎。唯一的问题似乎是 1)它不会跳过已经被 OCR 处理过的文件 2)尝试向它扔一堆 PDF(一些旧的)并看着它崩溃。这是一个小马车。它会在遇到的每个错误时向您发出警告(尽管您可以告诉软件不要通知。但同样,它在某些类型的 PDF 上会死得很惨,因此您的里程可能会有所不同。

  • ABBYY FineReader (Batch/Scansnap)、Omnipage——这些一定是人类已知的一些最糟糕的编程软件。如果您能找到如何完全自动化(无提示)批量 OCR保存同名PDF,请在此处发帖。似乎我能找到的唯一解决方案在某处失败了——重命名、不完全自动化等。充其量,有一种方法可以做到,但是文档和编程太糟糕了,你永远不会发现。

  • ABBYY FineReader EngineABBYY Recognition Server - 这些确实是更多的企业解决方案,您可能最好让 acrobat 运行一个文件夹并尝试清除给您带来错误/崩溃程序的 pdf,而不是经历尝试的麻烦安装评估软件(假设您是一个简单的最终用户)。对于小用户来说似乎没有成本竞争力。

  • ** Autobahn DX 工作站** 这个产品的成本太高了,你大概可以买6个acrobat。不是真正的最终用户解决方案。如果您是企业设置,这对您来说可能是值得的。

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, ** - 这些可能有效,但有一些问题:

    1. OCR 结果不如其中一些的 acrobat 好(见上面的链接)。
    2. 没有任何程序接收 PDF 文件并输出 PDF 文件。您必须创建一个脚本并首先分解 PDF 并在每个程序上运行程序,然后将文件重新组合为 pdf
    3. 一旦你这样做了,你可能会发现,就像我所做的那样,(tesseract)创建了一个移动的 OCR 层。因此,如果您搜索“the”这个词,您将获得该词旁边部分的突出显示。
  • Batch DjVu → Convert to PDF – 没有研究过,但似乎是一个可怕的回合解决方案。

在线的

  • PDFcubed.com – 来吧,不是真正的批处理解决方案。
  • ABBYY Cloud OCR - 不确定这是否真的是批处理解决方案,无论哪种方式,您都必须按页面付费,这可能会变得非常昂贵。

识别非 OCRed PDF

这是一个稍微简单的问题,可以在 Linux 中轻松解决,而在 Windows 中则不然。我能够编写一个 perl 脚本pdffont来识别是否嵌入了字体以确定哪些文件不是 OCR 的。


当前的“解决方案”

  1. 使用脚本识别非 OCRed pdf(这样您就不会重新运行数千个 OCRed PDF)并将它们复制到一个临时目录(保留正确的目录树),然后在 Windows 上使用 Acrobat 运行这些希望较小的批次不会崩溃。

  2. 使用相同的脚本,但要让 linux ocr 工具之一正常工作,冒着 ocr 质量的风险。

我想我要尝试 #1,我只是太担心 Linux OCR 工具的结果(我认为没有人做过比较)并且将文件分开并再次将它们拼接在一起似乎如果 Adob​​e 实际上可以在不窒息的情况下对目录进行 OCR 批处理,那么这是不必要的编码。

如果您想要一个完全免费的解决方案,则必须使用脚本来识别非 OCRed pdf(或只是重新运行 OCRed pdf),然后使用其中一种 linux 工具尝试对它们进行 OCR。Teseract 似乎有最好的结果,但同样,这些工具中的一些在现代版本的 Ubuntu 中并没有得到很好的支持,尽管如果你可以设置它并解决我遇到的图像层与文本匹配层不匹配的问题(使用 tesseract),那么您将有一个非常可行的解决方案,再次是 Linux > Windows。


您是否有一个有效的解决方案来完全自动化、批量 OCR PDF,跳过已经 OCR 文件并保持相同名称的高质量文件?如果是这样,我将非常感谢您的投入。


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\'`;
                }
            }

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

我也一直在寻找一种以自动方式对许多 PDF 进行批量 OCR 的方法,但运气不佳。最后,我想出了一个类似于你的可行的解决方案,使用 Acrobat 和一个脚本,如下所示:

  1. 将所有相关的 PDF 复制到特定目录。

  2. 删除已经包含文本的 PDF(假设它们已经是 OCRd 或已经是文本 - 我知道不理想,但现在已经足够了)。

  3. 使用AutoHotKey自动运行 Acrobat,选择特定目录,并对所有文档进行 OCR,在文件名后附加“-ocr”。

  4. 将 OCRd PDF 移回其原始位置,使用“-ocr.pdf”文件的存在来确定它是否成功。

这有点像Heath Robinson,但实际上效果很好。


小智 3

我相信您需要认识到 ABBYY FineReader 是一个最终用户解决方案,旨在提供快速、准确的开箱即用 OCR。

根据我的经验,OCR 项目每次都有明显不同的细节,并且无法为每个独特的案例创建开箱即用的灵魂。但我可以建议您更专业的工具来为您完成这项工作:

我是上述云服务前端开发团队的一员,如有必要,可以提供更多相关信息。

考虑到在 PDF 中查找文本层,我对此无法给出任何建议,因为这项任务有点超出我的专业 OCR 的范围,所以我发现您使用外部脚本的方法非常合理。也许您会发现此讨论很有帮助:http://forum.ocrsdk.com/questions/108/check-if-pdf-is-scanned-image-or-contains-text