これは1年前にここで議論されています:
多くのPDFファイルのバッチOCR(まだOCRedではありません)?
まだOCRedになっていないOCR PDFをバッチ処理する方法はありますか?これは、次の2つの問題に対処する現状です。
バッチOCR PDF
窓
Acrobat –これは、OCRをバッチ処理する最も簡単なocrエンジンです。唯一の問題は1)すでにOCRedであるファイルをスキップしないこと2)それにPDFの束を投げてみて(古い)クラッシュを監視することです。それは少しバグです。エラーが発生するたびに警告を表示します(ただし、ソフトウェアに通知しないように指示することはできます。ただし、特定の種類のPDFではひどく死に至るため、走行距離が異なる場合があります。
ABBYY FineReader(バッチ/スキャンスナップ)、Omnipage –これらは、人間に知られている最悪のプログラムされたソフトウェアの一部でなければなりません。同じ名前で保存するPDFのバッチOCR を完全に自動化する(プロンプトを表示しない)方法を見つけることができる場合は、ここに投稿してください。私が見つけることができる唯一の解決策はどこかで失敗したようです-完全に自動化されていないなど、名前を変更するなどです。
ABBYY FineReader Engine、ABBYY認識サーバー -これらは実際にはエンタープライズソリューションです。おそらく、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、** –これらは機能する可能性がありますが、いくつかの問題があります。
- OCRの結果は、たとえば、これらの一部のアクロバットほど優れていません(上記のリンクを参照)。
- どのプログラムもPDFファイルを取り込んでPDFファイルを出力しません。スクリプトを作成し、最初にPDFを分解し、それぞれに対してプログラムを実行してから、ファイルをPDFとして再構成する必要があります
- 実行すると、私がしたように、(tesseract)がOCRレイヤーを作成し、それが上にシフトすることがわかります。そのため、「the」という単語を検索すると、その隣の単語の一部がハイライトされます。
バッチDjVu →PDFに変換–まだ検討していませんが、恐ろしいラウンドアラウンドソリューションのようです。
オンライン
- PDFcubed.com –バッチソリューションではありません。
- ABBYY Cloud OCR-これが本当にバッチソリューションであるかどうかはわかりませんが、いずれにしてもページごとに支払う必要があり、これはかなり高価になる可能性があります。
非OCRed PDFの識別
これはやや簡単な問題で、Linuxでは簡単に解決できますが、Windowsではそれほど解決できません。pdffont
どのファイルがOCRedではないかを判断するためにフォントが埋め込まれているかどうかを識別するために使用するperlスクリプトをコーディングできました。
現在の「解決策」
スクリプトを使用して非OCRed pdfを識別し(数千のOCRed PDFを再実行しないようにします)、これらを一時ディレクトリにコピーし(正しいディレクトリツリーを保持)、Windows上のAcrobatを使用してこれらを実行しますバッチはクラッシュしません。
同じスクリプトを使用しますが、Linux ocrツールの1つを適切に機能させると、ocr品質が低下します。
私は#1を試すつもりだと思う、私はLinux OCRツールの結果についてあまりにも心配しているだけだ(誰かが比較をしたとは思わない)、ファイルをバラバラにして再びつなぎ合わせるようだAdobeがディレクトリをチョークせずにOCRを実際にバッチ処理できる場合、コーディングは不要です。
完全に無料のソリューションが必要な場合は、スクリプトを使用して非OCRed pdfを識別する(またはOCRedで再実行する)必要があります。次に、Linuxツールの1つを使用してOCRを試行します。Teseractが最良の結果を持っているように見えますが、これらのツールのいくつかはUbuntuの最新バージョンでは十分にサポートされていませんが、セットアップしてテキストマッチングレイヤーと一致しないイメージレイヤーの問題を解決できる場合は( tesseractを使用すると)かなり実用的なソリューションが得られ、もう一度Linux> Windowsができます。
OCR PDFを完全に自動化し、同じ名前を保持しているOCRedファイルをスキップして高品質で完全に自動化する実用的なソリューションはありますか?もしそうなら、私は入力を本当に感謝します。
非OCRedファイルを一時ディレクトリに移動するPerlスクリプト。これが動作することを保証することはできず、おそらく書き直す必要がありますが、誰かがそれを動作させる(動作しないと仮定して)または動作を改善する場合は、お知らせください。
#!/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\'`;
}
}
}
}
}