0

PDFストリームからいくつかの情報を抽出する必要があります。
次のようなものなので、関連するテキストを抽出するのは非常に簡単です。

BT /Fo0 7.20 Tf 67.81 569.38 Td 0.000 Tc (TOTAL AMOUNT) Tj ET

yの位置は固定されていると考えることができますが、xの位置はギスタリゼーションのために可変です。しかし、私の問題は、ページの始まりと終わりを認識することです。

4

1 に答える 1

2

「情報抽出機能」で遭遇するすべての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の構造を解析する必要があります。

  1. /Type /Page;のすべてのオブジェクトを検索します。
  2. これらの各ページオブジェクトに移動し、それぞれがどのオブジェクトであるかに関する情報を取得します/Contents
    • 単一の/Contentsストリームを指す場合があります、または
    • ストリームの/Contents配列を指す場合があります。
  3. このコンテンツオブジェクトに移動し、そのストリームを抽出します。

実際には、上記の最初の手順はもう少し複雑になる可能性があります。

  • trailer <<...>>セクションを見つけて移動します
  • /Rootトレーラーで、ドキュメントのオブジェクトに関する情報を見つけます
  • ルートオブジェクトに移動します
  • オブジェクト/Pagesからに関する情報を抽出します/Root
  • オブジェクト(子と親を持つ/Pages中間ページツリーノード)に移動します。
  • /Kidsオブジェクトの検査から、このページツリーノードのすべての子孫を検索します
  • /Kids; でリストされたそれぞれのオブジェクトに移動します。
    • それは可能性があります(この場合、それはツリーリーフではなく、/Type /Pages別のページツリーノードであり、ツリーをさらに追跡する必要があります)。
    • それは可能性があります/Type Page(この場合、ページツリーリーフに到達しました。これは、実際にページに到達したことを意味します)。

この時点で、この旅の後に見つけた最初のページは1ページ目です。次は2ページ目などです。「私はページ番号Nです」というメタデータが含まれているページはないことに注意してください。すべて依存しています。ルートオブジェクトから見つめているページツリーを解析する順序で。

コンテンツストリームを実際に見つけたので、さらに2つの問題に直面しています。

  1. 探しているコンテンツストリームは、(コードが示しているように)クリアテキストではない可能性があります。コンテンツストリームは、許可されている圧縮スキームの1つによって非常に頻繁に圧縮されるため、テキストコンテンツを解析する前に、コンテンツストリームを拡張する必要があります。

    ストリームが圧縮されているかどうかを確認するには、それぞれの* Decodeキーワード(非常に頻繁にとして表示される /Filter /FlateDecode)に注意してください。

  2. ページのコンテンツストリームを正常に解凍すると、テキストを説明するまったく直感的でない文字コードに遭遇する可能性があります。これは、サンプルコードで想像して示したものと同じタイプの正常に動作するASCIIではない場合があります。

    フォント(CIDのようなマルチバイトフォントでも)、それらのエンコーディング、CMapなどを調べる必要があります。

    私が最初の文で質問したように、あなたがそれがあなたの特定のユースケースで起こっていないことを知っていない限り...

于 2012-10-02T09:50:29.730 に答える