web-dev-qa-db-ja.com

PHP用のPDFパーサーはありますか?

こんにちは、いくつかのPDF Generators for php(fpdf、dompdfなど)について知っています。)私が知りたいのはパーサーについてです。

私が制御できない理由から、必要な特定の情報はpdf内のテーブルにのみあり、そのテーブルを抽出して配列に変換する必要があります。

助言がありますか?

41
elviejo79

私は以前に(同様のニーズのために)書いたことがあり、これを言うことができます:楽しんでください。それは非常に複雑なタスクです。 PDF仕様 は大きくて扱いにくい。内部にテキストを保存する方法はいくつかあります。そして、キッカーは、各PDFジェネレーターの動作が異なるということです。したがって、TFPDFやDOMPDFのようなものは非常に読みやすいPDFを(マシンの観点から)作成します。 。

その理由は、テキストの書き方です。私が使用したほとんどのDOMベースのレンダラーは、行全体を1つの文字列として記述し、1回配置します(読みやすくなっています)。 Acrobatは、一度に1つまたは数個の文字のみを記述し、それらを独立して配置することにより、より効率的に(そして実際に)しようとします。これにより、レンダリングが本当に簡単になりますが、読み取りが非常に難しくなります。

ここでの利点は、PDFの形式自体は非常に単純です。通常の構文に従う「オブジェクト」があります。次に、それらをリンクしてコンテンツを生成できます。仕様ではファイル形式を説明するのは良い仕事ですが、現実世界の読書には少し頭の力が必要です...

あなたがそれを自分で書くつもりなら難しい方法を学ばなければならなかったアドバイスのいくつかの有用な部分:

  1. Adobeはフォントの再マッピングを好みます。したがって、文字_65_はAではない可能性があります...マップオブジェクトを見つけて、そこにある文字に基づいてそれが何をしているのかを推測する必要があります。また、そのフォントのドキュメントに文字が表示されない場合は含まれないため、効率的です(プログラムでPDFを編集しようとすると、生活が難しくなります)。
  2. できるだけ抽象的に書いてください。各オブジェクトタイプ、および各ネイティブタイプ(文字列、数字など)のクラスを記述します。これらのクラスを解析してみましょう。そこにはかなりの繰り返しがありますが、特定のタイプのみに対して何かを微調整する必要があることに気付いた場合、最後に自分自身を救います)...
  3. PDF仕様の特定のバージョンまたは2つについて記述し、それを実施します。バージョン番号を確認し、予想より高い場合は、保釈します...新しいバージョンをサポートしたい場合は、仕様から抜け出し、そこからパーサーをアップグレードしてください。試行錯誤をしないでください(面白くありません)...
  4. 圧縮ストリームで頑張ってください。通常、長さの引数を信頼して、圧縮解除されているものを検証することはできません。時々(一部のジェネレーターでは)うまく動作します...その他は1バイト以上ずれています。フィルターが一致した場合は収縮させ、長さを強制します...
  5. 長さをテストするときは、strlenを使用しないでください。 mb_strlen($string, '8bit')を使用します。異なる文字セットを補正するためです(また、他の文字セットで潜在的に無効な文字を許可します)。

そうでなければ、幸運を...

29
ircmaxell

そのためにPDFBoxを使用します( http://pdfbox.Apache.org/ )。このソフトウェアはjavaベースであり、プラットフォームに依存しません。それは高速で信頼性があります。 execまたはShell executeまたはPHP/Java-Bridge( http://php-Java-bridge.sourceforge.net/ )経由で使用できます。

17
Timo

すでに xPDF を見ましたか?そこには、変換を行うpdftotextと呼ばれるプログラムがあります。これをPHPから呼び出して、PDFのテキストバージョンを読み込むことができます。phpからexec()またはsystem()を実行する必要があるため、これが機能しない可能性がありますただし、すべてのホスト型ソリューションで。

また、 PHPサイト にはいくつかの例があり、PDFはかなり荒いですが、テキストに変換します。これらの例も試してみてください。 PHPページ で、phpt dot orgでlucを検索します。

3
ryanday

GhostScriptまたはITextSharpをご覧ください。両方のクロスプラットフォームバージョンがあります。

1
Mark Redman

Zend_PdfZend Framework の一部です。マニュアルの状態:

Zend_PdfコンポーネントはPDF(Portable Document Format)操作エンジンです。ドキュメントをロード、作成、変更、保存できます。したがって、任意のPHPアプリケーションPDFドキュメントを動的に作成します。既存のドキュメントを変更するか、新しいドキュメントを最初から生成します。

1
Bill Karwin

PDFはそのような情報を失うため、実際にはPDF内のテーブルではない可能性があります...

0
mark stephens

これはPHP =PDFパーサー、次の2つのフレーバーがあります。

  1. 無料版では、PDFを最大PDF 1.5
  2. 商用アドオンは、任意のPDF形式(現在の1.9まで)を解析できます。
0
lubosdz