5

座標に基づいて PDF ドキュメントからテキストを抽出しようとしているため、Adobe PDF リファレンス(第 5.3 章)で 2 つの概念に遭遇しました。

  1. テキスト配置演算子
  2. 演算子を示すテキスト

今のところ、私は Td & Tm ポジショニング演算子に興味があります.Tdを使用している間、PDFドキュメントで明確に指定されている現在の行の開始に対して txtytx ty Tdがあります: 、私はこの方法を使用してtxty座標。問題は、 txtyのみを提供しながら、その位置に基づいて PDF からテキストを抽出する方法がわからないことです。

a b c d e f Tm

これは、Tm の使用法の「公式」です。af値は何を表していますか? これはTmの私の入力になります:

BT
/F1 8.88 Tf
0 0 0 rg
0.9998 0 0 1 401.52 448.08 Tm
[<0014>-11<0015>-11<0013>-11<000F>-19<0014>-11<0019>] TJ
ET

4 つの各グループの先頭に 00 があるのはなぜですか? これは16進数ですか?16進数からintおよび対応する文字に変換する必要がありますか?

これはTdの私の入力になります:

BT 43.20 421.90 Td 0 Tw /C001 10.00 Tf 0.00 Tw <BlablablaTextInHexThatICanProcess>Tj ET

これははるかに明確で、座標はより明確です。単純な X 座標と Y 座標に基づいて、Tm に配置された PDF テキスト オブジェクトからテキストを抽出するにはどうすればよいでしょうか? 私は c++ と PoDoFo ライブラリを使用しています

4

2 に答える 2

4

このタスクの規模を過小評価しないでください。テキスト マトリックス ビットは非常に単純で簡単です。難しいのはテキストそのものです。

質問から始めましょう。なぜ 4 つの各グループの先頭に 00 が付いているのでしょうか?

PDF には標準のテキスト エンコーディングがありません。テキストをデコードする前に、フォントのエンコーディングを知る必要があります。

あなたの例では:

BT
/F1 8.88 Tf
0 0 0 rg
0.9998 0 0 1 401.52 448.08 Tm
[<0014>-11<0015>-11<0013>-11<000F>-19<0014>-11<0019>] TJ
ET

フォントは /F1 ビットです。これは、フォントに関連するページ (またはその親) に存在する名前です。フォントを調べて、エンコーディングが何であるかを調べる必要があります。

あなたの例のコンテンツを考えると、エンコーディングはアイデンティティであり、4桁の16進数はフォント内のグリフIDであると思われます. この場合、フォントには、グリフ ID を検索して Unicode 文字を取得できるようにする ToUnicode エントリが必要です。

他のフォントには ToUnicode エントリがある場合とない場合があります。この場合、さまざまな方法で Unicode テキストを抽出できます。方法が異なれば結果も異なる可能性があるため、PDF 仕様には「テキスト コンテンツの抽出」というタイトルのセクション全体があり、これらを試行する順序を詳述しています。

うまくいけば、あなたの PoDoFo ライブラリには、この種の変換を行うためのメソッドが含まれているはずです。そうでない場合、タスクは非常に困難になるため、他のオプションを検討する必要があると思います。ABCpdf .NET ライブラリのテキスト抽出コードを書きましたが、コーディングに数か月かかり、その後数年かけて微調整しました。

于 2013-05-13T10:55:46.807 に答える