5

pypdf を使用して、pdf のページ内のすべてのオブジェクトを反復処理したいと考えています。

また、テキストかグラフィックかにかかわらず、オブジェクトのタイプを確認したいと思います。

コード スニペットは非常に役立ちます。

どうもありがとう

4

2 に答える 2

5

PyPDFはその仕事に適したツールではないと思います。必要なのは、ページ自体を解析し(PyPDFのサポートが制限されているため、APIドキュメントを参照)、一部のオブジェクトを変更した後、結果を別のPDFオブジェクトに保存できるようにすることです。

を使用してPDFを解凍すると、 pdfrwpdftkを使用できるようになります。

しかし、あなたが書いたものから、

私の最終的な目標は、各テキストオブジェクトに異なる色を付けることです。

「テキストオブジェクト」は、(たとえば)異なる段落の異なる行で構成される非常に複雑なオブジェクトである場合があります。これは単一のエンティティである可能性があり、単一のエンティティとして表示される場合があります。このエンティティには、すでにいくつかの異なるテキストカラーコマンドが存在する可能性があります。

たとえば、この一連のテキストを含む単一のストリームがあるとします(これは「内部」言語で書かれています)。

12.84 0 Td(S)Tj
0.08736 Tc
9 0 Td(e)Tj
0.06816 Tc
0.5 g
7.55999 0 Td(qu)Tj
0.08736 Tc
1 g
16.5599 0 Td(e)Tj
0.06816 Tc
7.55999 0 Td(n)Tj
0.08736 Tc
8.27996 0 Td(c)Tj
-0.03264 Tc
0.13632 Tw
7.55999 0 Td(e )Tj
0.06816 Tc
0 Tw

これは「シーケンス」と書くかもしれませ。これは実際には7つのテキストサブオブジェクトで構成されており、ストリームをそのコンポーネントサブオブジェクトに「復号化」できるライブラリはありません。ましてや、適切な属性を割り当てることはできません(PDFではグラフィックス状態から派生しますが、階層構造ではありません)。 XMLなどの構造は、おそらく継承を通じて、単一ノードに関連付けられる可能性があります)。

詳細:ストリームには、テキスト以外のコマンド(行など)が含まれる場合があります。次に、「テキスト」ストロークの色を変更すると、実際には非テキストオブジェクトの色も変更されます。

ライブラリは、テキストストリームを直接読み取ることによって達成されるのと同様の詳細レベルのアクセスを提供する必要があります。したがって、ライブラリを介してこれを行うことはありそうにありません。

これはワードプロセッシング作業であるため、PDFをOpenOfficeに変換し( PDFインポート拡張機能を使用)、OOo pythonを使用して操作し、OpenOffice自体からPDFにエクスポートして戻す可能性を検討することができます。

ただし、ドラゴンがいることに注意してください。ドキュメントは大雑把であり、インターフェイスが不安定な場合があります。「テキスト」へのアクセスは実用的でない場合があります(テキストは1行ずつしか利用できないため)。

もう1つの可能性(ここでも、気の弱い人向けではありません)は、PDFを自分でデコードすることです。を介して非圧縮形式で取得することから始めますpdftk。これにより、ヘッダーとそれに続くフォーム内のオブジェクトのストリームが生成されます

INDEX R obj
<<
COMMANDS OR DATA
>>
[ stream 
STREAM OF TEXT
endstream ]
endobj

ストリームを読み取ることができ、オブジェクトごとに次のようになります。

  1. COMMANDS OR DATAが/Length 長さのみの場合は、テキストストリームである可能性があります。それ以外の場合GOTO3。
  2. オブジェクトを解析します(以下を参照)。/Length長さが変わる場合は、適切に更新することを忘れないでください。
  3. 現在の出力ファイルのオフセットをメモし、XREF [i](「i番目のオブジェクトの参照オフセット」)に保存して、出力ファイルに保存します。

オブジェクトの最後にXREFオブジェクトがあり、各オブジェクトは、それが存在するファイルオフセットで示されます。これらのオフセット(10桁の数字)は、XREFに保存した新しいオフセットに従って書き換える必要があります。このオブジェクトの先頭は、PDFファイルの最後にあるstartxrefに入ります。

(デバッグするには、変更なしですべてのオブジェクトをコピーするルーチンを作成することから始めます。外部参照とオフセットを再計算し、元のオブジェクトと同じPDFオブジェクトを生成する必要があります)。

このようにして得られたPDFは、pdftkスペースを節約するために再圧縮することができます。

PDFテキストオブジェクトの解析に関しては、基本的に1行ずつチェックして、テキスト出力コマンドを探します(PDFリファレンス5.3.2を参照)。ほとんどの場合、表示されるコマンドは次のようになりますTj

9.95999 0 Td(Hello, world)Tj

および色変更コマンド(#4.5.1を参照。ここでも、最もよく使用されるのはgとrgです。)

1 g             # Sets color to black (1 in colorspace Gray)
1 0 0 rg        # Sets color to red (1,0,0 in colorspace RGB)

次に、使用している色を追跡します。たとえば、選択Tjした2つのコマンドの間に各コマンドを含めることができRGます。1つはテキストの色を設定し、もう1つは元の色を復元します。このようにして、グラフィックの状態が近くのオブジェクトや線などに「こぼれる」ことがないようにします。オブジェクトが増え、Length結果のPDFが少し遅くなります(ただし、それほどではありません。気付かないかもしれません)。

于 2012-10-20T15:47:21.750 に答える
0

PDFの構造は非常に複雑です。別の方法は、テキストのみが必要な場合は、テキストを解析するよりもエクスポートすることです。

各ページで繰り返し、extractTextを使用します

于 2012-10-20T08:19:29.523 に答える