8

多数の PDF ファイルがあり、Perl プログラムで全文検索を実行して、特定の文字列を含むファイルを返す必要があります。今日まで、私はこれを使用しています:

my @search_results = `grep -i -l \"$string\" *.pdf`;

$string は検索するテキストです。ただし、ファイル形式が明らかに ASCII ではないため、これはほとんどの pdf では失敗します。

一番簡単にできることは何ですか?

明確化:名前が事前にわからない約300のpdfがあります。PDF::Core はおそらくやり過ぎです。私はpdfの名前がわからないため、pdftotextとgrepをうまく連携させようとしています。正しい構文はまだ見つかりません。

以下のAdam Bellaireの提案を使用した最終的な解決策:

@search_results = `for i in \$( ls ); do pdftotext \$i - | grep --label="\$i" -i -l "$search_string"; done`;
4

6 に答える 6

9

ここのPerlMonksスレッドは、この問題について説明しています。

あなたの状況では、 pdftotext(コマンドラインツール)を取得するのが最も簡単かもしれません、そしてあなたは次のようなことをすることができます:

my @search_results = `pdftotext myfile.pdf - | grep -i -l \"$string\"`;
于 2008-09-26T12:21:51.023 に答える
3

私のライブラリCAM::PDFは、テキストの抽出をサポートしていますが、PDF 構文のグラフィカルな方向性を考えると、本質的に難しい問題です。そのため、出力が意味不明になることがあります。CAM::PDF にはgetpdftext.plプログラムがバンドルされています。または、次のように機能を呼び出すこともできます。

my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n";
for my $pagenum (1 .. $doc->numPages()) {
   my $text = $doc->getPageText($pagenum);
   print $text;
}
于 2008-09-30T05:52:26.463 に答える
2

2 番目の Adam Bellaire ソリューションです。pdftotext ユーティリティを使用して、電子ブック ライブラリのフルテキスト インデックスを作成しました。それはやや遅いですが、その仕事をします。全文については、全文索引を保存するために PLucene または KinoSearch を試してください。

于 2008-09-26T12:31:56.303 に答える
2

PDF::Coreを見たいと思うかもしれません。

于 2008-09-26T12:50:25.883 に答える
1

私が使用した最も簡単なフルテキストインデックス/検索はmysqlです。適切なインデックスを付けてテーブルに挿入するだけです。フィールドの相対的な重みを計算するのに時間を費やす必要があります(タイトルの一致は本文の一致よりもスコアが高くなる可能性があります)が、これはすべて可能です。

Pluceneは非推奨になり(過去2年間、アクティブな作業は行われていません)、KinoSearchが優先されます。KinoSearchは、Pluceneのアーキテクチャ上の制限を理解することから部分的に成長しました。

300個までのPDFがある場合は、PDFからテキストを抽出したら(PDFにテキストの画像だけでなくテキストが含まれていると仮定します;)、クエリの量によってはgrepで十分な場合があります。

ただし、mysql / kinosearchルートは、行き詰まってしまうことでメリットが得られない多くの領域(ステミング、ストップワード、用語の重み付け、トークンの解析)をカバーしているため、強くお勧めします。

KinoSearchはおそらくmysqlルートよりも高速ですが、mysqlルートはより広く使用されている標準のソフトウェア/ツール/開発者エクスペリエンスを提供します。また、SQLの機能を使用して、フリーテキスト検索クエリを拡張することができます。

したがって、巨大なデータセットと非常識なクエリボリュームについて話しているのでない限り、私のお金はmysqlにあります。

于 2008-09-26T13:14:01.850 に答える
0

Lucene を試すことができます (Perl ポートは Plucene と呼ばれます)。検索は信じられないほど高速で、PDFBox はすでに Lucene で PDF ファイルをインデックス化する方法を知っています。PDFBox は Java ですが、CPAN のどこかに非常に似たものがある可能性があります。PDF ファイルを Lucene インデックスに既に追加しているものが見つからない場合でも、数行のコードでそれを自分で行う必要があります。Lucene は、単にファイル内の文字列を検索するだけでなく、さらに多くの検索オプションを提供します。

非常に迅速で汚い方法もあります。PDF ファイル内のテキストは、実際にはプレーン テキストとして保存されます。テキスト エディターで PDF を開くか、「文字列」を使用すると、そこにテキストが表示されます。バイナリ ジャンクは通常、埋め込まれたフォント、画像などです。

于 2008-10-02T15:24:46.353 に答える