自分が取り組んでいることの範囲を理解するために、PDFコンテンツの「基本的な編集」はほとんどの場合重要です。
PDFのページコンテンツは、ページにペイントする短いRPNプログラムで表されます。これは、セマンティクスの点でPostScriptに似た小さな言語ですが、構造や関数の定義をループしません(したがって、停止の問題はありません)。正気の世界では、ページ上のテキストは次のように表されます。
BT /F1 12 Tf 72 720 Td (this is a text in a pdf document) Tj ET
これは、より身近なものに翻訳すると、次のようになります。
BeginText();
SetFont(F1, 12.0); // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a text in a pdf document");
EndText();
したがって、この場合、これを次のようなものに変換する必要があります。
BeginText();
SetFont(F1, 12.0); // Font 1, 12.0 pt
TextMoveTo(72, 720);
ShowText("this is a ");
SetFont(F2, 12);
ShowText("text");
SetFont(F1, 12);
ShowText(" in a pdf document");
EndText();
これは次のようになります:
BT /F1 12 Tf 72 720 Td (this is a ) Tj /F2 12 Tf (text) Tj /F1 12 Tf
( in a pdf document) Tj ET
同等のPDFで。問題は何倍もあります:
- ページとそのすべてのリソースを抽出する必要があります(重要)
- 新しいページを生成し、新しいリソースを挿入し(新しいフォントを追加します)、許可されている場合はフォントを埋め込む必要があります
- ページのコンテンツストリームを変更して、変更したコンテンツを含めます。
そして、3はあなたがハングアップする場所です。あなたが説明するコンテンツを含むページを生成する方法は無数にあり、まともなライブラリを使用しても、おそらく70を取得するのに苦労するでしょう。 % そのうちの。なぜこれが思ったほど悪いのかを簡単に説明しましょう。最初にすべてのプレーンテキストをページに配置し、次にすべてのイタリックテキストを配置し、次にすべての太字テキストを配置するPDF生成プログラム(私はあなたを見ています、troff)があります。私は誓います、私はこれを作り上げていません。一部のプログラムはテキストを非常に正確に配置したいので、運が良ければ、特定のカーニングでテキストを配置するTJ演算子を使用します。運が悪ければ(ほとんどの場合)、代わりに、ページ上のすべてのグリフの前に一連の動きでテキストをレイアウトします。そして、あなたのテキストが曲線や変わった向き(地図、広告)に置かれているとしたらどうでしょうか?誰かがフォントサイズを微妙に変更して大文字と小文字を区別したり、スモールキャップスをシミュレートしたりする場合はどうでしょうか。
そのため、Acrobat 1.0のテキスト検索ツールを作成したとき、多くのエッジケースを処理するのに2か月かかりました。これはテキストを編集するのではなく、1つの単語またはフレーズを見つけようとしているだけです。
私はあなたにライブラリを推薦するつもりはありません-申し訳ありませんが-私はxpdfを簡単に調べましたが、それがPDF生成機能を備えているかどうか、または単にPDFの消費者であるかどうかは明らかではありません。商用製品であるPdfLibはPDFを生成しているように見えますが、それを消費できるかどうかは明らかではありませんが、それらを接着することで確実に両面を得ることができます。
私の場合は、自分で開発したツールを使用しますが、それでもこの作業には少し恥ずかしがり屋です。私のライブラリは、私が働いている会社であるAtalasoftによって使用されており、布全体からPDFを生成し、非常に限られたドメイン(注釈、ドキュメントメタデータ)内で編集を行っています。最も難しいのは、PDFの複雑さをお客様から隠すために最善を尽くすことです。一般的に、お客様は私たちを望んでいますそれらの代わりに仕様を理解し、残りを簡単にする-しかし、このようなタスク(編集は別のものです)は、PDF仕様の深さを理解せずに行うのは本当に難しいです。PDF操作のライブラリの世界に入り始める場合は、仕様、特に第8章(グラフィックス)と第9章(テキスト)を読むことから始める必要があります。そうすれば、何をしなければならないかをよりよく理解できます。ライブラリで。