日本語

ドキュメント · PDF ツールキット

PDF ファイル内: ヘッダー、オブジェクト、外部参照テーブル、およびトレーラーの説明

· 背景

pdf ファイル構造 pdf-lib

リンクされた PDF ページ オブジェクトが解析され、新しいファイルにシリアル化されます
オリジナル ToolAcre ベクトル イラスト

テキスト エディタで PDF を開くと、ヘッダー、番号付きオブジェクト、相互参照テーブル、およびトレーラーが表示されます。この記事では、各部分が何を行うのか、増分更新と暗号化がどのように適合するのか、そしてなぜこの構造がローカルの書き換えを可能にするのかについて説明します。

バイナリのように見える PDF バイトはライブラリによって解析されます。固定ヘッダーの例はアサートされていません

任意の PDF をテキストとして開くと、圧縮データまたはバイナリ データが混在した読み取り可能な断片が表示される可能性がありますが、ツールキットはテキスト エディターを介してファイルを検査しません。選択されたバイトを pdf-lib または pdf.js に渡し、不正な形式の暗号化されたドキュメント エラーを捕捉し、これらのライブラリが公開する解析されたドキュメント インターフェイスと連携します。

アウトラインは `%PDF-1.7` の例を修正していますが、受け入れられたファイルは他の有効な形式を保持することができ、ソースは 1 つのバージョン ヘッダーを保証しません。有益な事実は動作に関するものです。署名チェックとパーサーが PDF を識別すると、操作はバイト シーケンス全体を連結可能なテキストとして扱うのではなく、ページについて推論します。

オブジェクトと参照 — 辞書、ストリーム、配列、およびそれらをグラフにリンクする間接参照

この実装では、API を介してリンクされた構造を示します。ドキュメントはページを公開します。ページは寸法と回転を公開します。ページをコピーすると、表示されるコンテンツに必要なリソースが移動します。画像アセンブリはページを作成して画像オブジェクトを一度埋め込みますが、透かしは計算された位置に再利用可能なリソースを描画します。

アプリケーション コード内のすべてのディクショナリ、ストリーム、配列、または間接参照を手動で実行するわけではありません。 pdf-lib はその下位レベルの解釈を所有します。形式をオブジェクト グラフとして記述することは、ページ コピーの動作と一致しますが、この記事では、ツールキットが一般的なオブジェクト インスペクターを実装しているかのように見せかけたり、生の参照をユーザーに公開したりすることは避けています。

相互参照実装の詳細は pdf-lib および pdf.js に委譲されます。

相互参照テーブル、ストリーム、およびトレーラーは、このプロジェクトのライブラリの問題です。アプリケーション ソースは `PDFDocument.load` を呼び出し、ドキュメントを作成し、ページをコピーし、バイトを保存します。すべての入力が従来のテーブルを使用するか別の表現を使用するかについては文書化されておらず、読者が信頼できるバイト オフセット アルゴリズムも公開されていません。

その抽象化には価値があります。この操作では、アプリケーション コードでオブジェクトの番号を手動で再設定することなく、有効な入力をマージできます。出力は、ライブラリが生成する正しいシリアル化です。正確なオフセットやトレーラー チェーンに関するフォレンジックな質問については、高レベルのページ ツールから詳細を推測するのではなく、専用のパーサーと関連仕様を使用してください。

ページ ツリーとコンテンツ ストリーム - ドキュメント カタログから単一ページの描画命令まで

ページレベルの操作は、完全な文法を明らかにすることなく、カタログからページへの概念を明らかにします。 Merge はすべてのソース ページ インデックスを取得し、それらのページを新しいドキュメントにコピーします。選択したグループを分割コピーします。 Reorder は明示的な順序配列を提供します。 Rotate はページを取得し、その正規化された角度を更新します。選択したページの表面に透かしを描画します。

表示されるコンテンツ ストリームは、これらの構造操作中にラスタライズされず、選択可能なテキストとベクトルの品質が維持されます。 PDF-to-image は意図的に異なります。pdf.js はページをキャンバス ピクセルにレンダリングします。その後、テキストはテキストではなくなります。 PDF の内部構造の一般化された図を暗記するよりも、どのパスが実行されたかを理解することが重要です。

このツールキットは、増分更新を約束するのではなく、新しい出力を保存します。

概要では増分更新について説明していますが、ToolAcre でサポートされている編集では新しい出力ファイルが保存されます。このソースは、以前のバイト リビジョンを保持しながら更新を追加するモードを提供しておらず、増分履歴処理を通じて以前に保存されたコンテンツを安全に削除できるとも主張していません。

これはプライバシーと署名にとって重要です。新しいページコピーの出力は、いくつかの文書レベルの構造を削除し、デジタル署名を無効にしますが、専用の証拠なしに法医学的サニタイザーとして宣伝すべきではありません。ソースと出力の役割を明確にし、以前のリビジョンや削除されたコンテンツを評価する必要がある場合は専門ツールを使用します。

暗号化されたファイル — パスワードと許可フラグがツールで開くことができるものをどのように変えるか、またそれらがページ操作とは別の問題である理由

暗号化またはパスワードで保護された入力は、通常のページ編集とは別の境界になります。コントローラーは保護されたドキュメントのエラーを報告して停止します。このツールキットはパスワードを要求したり、権限をバイパスしたり、アクセス制御を削除したりすることはありません。ユーザーは、これらの操作を使用する前に、許可された保護されていないコピーを別の場所に作成する必要があります。

拒否すると、誤解を招く部分的な結果も防止されます。ユーザーが完全な契約を期待している場合、空白または不正な出力は危険です。実装では暗号化が明示的に検出されますが、構成では制限が繰り返されます。 PDF 暗号化や権限セマンティクスに関する一般的なチュートリアルを提供しなくても、製品の動作を説明するにはこれで十分です。

圧縮、フォント、および色については、この実装レベルの説明の範囲外にあります。

圧縮フィルター、フォント エンコーディング、およびカラー スペースは、PDF の忠実度にとって依然として重要ですが、アプリケーション コードはそれらをライブラリとソース ドキュメントに委任します。この説明では、フィルター アルゴリズムや標準フォントの歴史については列挙しません。代わりに、テストと構成によって検証された目に見える結果を記録します。

ページのコピーではページの外観と選択可能なテキストが保持されますが、ラスター出力ではテキスト レイヤーが失われます。テキストの透かしは、組み込みのラテン語エンコーディングに限定されます。画像の準備では、サポートされていないブラウザー画像形式を PNG として再エンコードできます。これらの具体的な境界は、ツールキットが公開も検証もしないサブシステムの広範なツアーよりも実用的です。

要点 — ページレベルの操作はこの構造に対する編集であり、PDF ツールキットはブラウザーで解析して書き換えることによって操作を実行します。

ToolAcre は、ライブラリ API を通じて解析されたドキュメント構造を編集し、新しいファイルをシリアル化します。したがって、マージ、分割、並べ替え、回転、ウォーターマークは、バイト連結ではなく、操作固有の保存ルールを備えた構造操作です。 PDF-to-image はレンダリング操作であり、忠実度の結果が異なります。

作業はローカルで (主に専用ワーカー内で) 行われ、Blob ダウンロードがユーザーに返されます。このモデルを使用して動作を予測します。コピーされたページは外観を維持し、新しいドキュメントはサポートされていないドキュメントレベルの機能と署名を失い、暗号化されたソースは停止し、ラスタライズされたページは画像になります。より詳細な形式のクレームには、仕様または専用の検査ツールが必要です。予期しない結果をデバッグする場合は、まず操作をコピー、メタデータ調整、描画、またはラスタライズとして分類します。これにより、損失の可能性が即座に狭まる可能性があります。次に、問題が残っている最小の非機密ファイルを使用して問題を再現し、必要に応じてバイトレベルの調査のために入力と出力の両方を保存します。