編集可能な診断ドキュメントと修復
SaveLoadedDocumentDiagnostic は、検査と制御されたテキスト編集のための決定的で展開された出力を生成し、RepairDiagnosticDocument は編集されたファイルを構造的に有効な PDF に戻します
往復ワークフロー
- ドキュメントをロードし、
SaveLoadedDocumentDiagnosticを呼び出します - オブジェクト辞書または非圧縮ストリームバイトを編集します。
/Length、xref 行、startxrefを手動で維持しようとしないでください - 境界付きオプションで
RepairDiagnosticDocumentを呼び出します THPDFDiagnosticRepairReportを検査し、メソッドがTrueを返した場合のみ修復済みターゲットを使用します
修復コントラクト
- ソースは PDF ヘッダーで始まり、HotPDF が出力する
%QDF-1.0マーカーを保持する必要があります - 検証済みの間接オブジェクトは、文字列、辞書、ストリームペイロードを再エンコードせずに物理順でコピーされます
- 直接、間接、欠落、古いストリーム
/Length値は、測定されたペイロード長で置き換えられます - 古典的な xref テーブル、正規の trailer、正確な
startxrefオフセットは、測定された出力位置から再構築されます - trailer は有効な
/Info、/ID、/Encrypt値を保持し、/Rootを単一の検証済み Catalog にバインドします - ターゲットは兄弟一時ファイルを通じて書き込まれ、すべてのチェックが成功した後にのみ要求されたパスを置き換えます
厳格な拒否
修復は、重複オブジェクト番号、複数または欠落した Catalog オブジェクト、壊れた trailer 参照、オブジェクト間の非コメントバイト、無効なオブジェクト文法、オブジェクトまたは入力の制限、10 桁を超える古典的な xref オフセット、厳格な再ロード検証失敗に対して閉方向に失敗します
検証済みオブジェクト内のマーカーはスキップされるため、文字列やエンコード済みストリームペイロード内のオブジェクト風テキストは xref エントリになりません
境界付きパフォーマンス
スキャナーは短いキャリー付きで 1 MiB ウィンドウを読み取り、オブジェクト範囲をファイルストリーム間で直接コピーし、検証済みオブジェクトメタデータと境界付き辞書プローブのみを保持します
MaxInputBytes、MaxObjectCount、MaxObjectNumber は、出力が公開される前にスキャン、保持メタデータ、出力 xref 行を制限します
Pascal の例
var
Options: THPDFDiagnosticRepairOptions;
Report: THPDFDiagnosticRepairReport;
begin
Options := THPDFDiagnosticRepairOptions.Default;
Options.MaxInputBytes := Int64(16) * 1024 * 1024 * 1024;
if not THotPDF.RepairDiagnosticDocument(
'edited-diagnostic.pdf',
'repaired.pdf',
Options,
Report
) then
raise Exception.Create(string(Report.Diagnostic));
end;