PDFストリームからいくつかの情報を抽出する必要があります。
次のようなものなので、関連するテキストを抽出するのは非常に簡単です。
BT /Fo0 7.20 Tf 67.81 569.38 Td 0.000 Tc (TOTAL AMOUNT) Tj ET
yの位置は固定されていると考えることができますが、xの位置はギスタリゼーションのために可変です。しかし、私の問題は、ページの始まりと終わりを認識することです。
「情報抽出機能」で遭遇するすべてのPDFが非常にうまく動作していることを確認する必要はありません。またはあなたは彼らがそうであることを知っているので、あなたはそうすることができますか?
そうしないと、遭遇するPDFコードが次のようになる可能性が非常に高くなります。
BT
/Fo0 7.20 Tf
67.81 569.38 Td
0.000 Tc
(TO)12(T)13(AL A)11(M)14(OUNT) TJ
ET
あれは、 ...
TJ
の代わりに使用して、個々のTj
グリフの配置を可能にします。ページのテキストコンテンツに確実にアクセスするには、PDFの構造を解析する必要があります。
/Type /Page
;のすべてのオブジェクトを検索します。/Contents
。
/Contents
ストリームを指す場合があります、または/Contents
配列を指す場合があります。実際には、上記の最初の手順はもう少し複雑になる可能性があります。
trailer <<...>>
セクションを見つけて移動します/Root
トレーラーで、ドキュメントのオブジェクトに関する情報を見つけます/Pages
からに関する情報を抽出します/Root
/Pages
中間ページツリーノード)に移動します。/Kids
オブジェクトの検査から、このページツリーノードのすべての子孫を検索します/Kids
;
でリストされたそれぞれのオブジェクトに移動します。/Type /Pages
別のページツリーノードであり、ツリーをさらに追跡する必要があります)。/Type Page
(この場合、ページツリーリーフに到達しました。これは、実際にページに到達したことを意味します)。この時点で、この旅の後に見つけた最初のページは1ページ目です。次は2ページ目などです。「私はページ番号Nです」というメタデータが含まれているページはないことに注意してください。すべて依存しています。ルートオブジェクトから見つめているページツリーを解析する順序で。
コンテンツストリームを実際に見つけたので、さらに2つの問題に直面しています。
探しているコンテンツストリームは、(コードが示しているように)クリアテキストではない可能性があります。コンテンツストリームは、許可されている圧縮スキームの1つによって非常に頻繁に圧縮されるため、テキストコンテンツを解析する前に、コンテンツストリームを拡張する必要があります。
ストリームが圧縮されているかどうかを確認するには、それぞれの* Decodeキーワード(非常に頻繁にとして表示される /Filter /FlateDecode
)に注意してください。
ページのコンテンツストリームを正常に解凍すると、テキストを説明するまったく直感的でない文字コードに遭遇する可能性があります。これは、サンプルコードで想像して示したものと同じタイプの正常に動作するASCIIではない場合があります。
フォント(CIDのようなマルチバイトフォントでも)、それらのエンコーディング、CMapなどを調べる必要があります。
私が最初の文で質問したように、あなたがそれがあなたの特定のユースケースで起こっていないことを知っていない限り...