可編輯診斷文件與修復
SaveLoadedDocumentDiagnostic 產生確定性、未壓縮的輸出供檢查與受控的文字編輯,而 RepairDiagnosticDocument 則把編輯過的文件轉回結構上有效的 PDF
往返工作流程
- 載入文件並呼叫
SaveLoadedDocumentDiagnostic - 編輯物件字典或未壓縮的串流位元組,而無須手動維護
/Length、xref 列或startxref - 以有界的選項呼叫
RepairDiagnosticDocument - 檢查
THPDFDiagnosticRepairReport,並只在方法傳回True時使用修復後的目標
修復契約
- 來源必須以 PDF 頁首開始,並攜帶 HotPDF 發出的
%QDF-1.0標記 - 已驗證的間接物件會依實體順序複製,而不重新編碼字串、字典或串流載入內容
- 直接、間接、缺失與過時的串流
/Length值會被取代為量測的載入長度 - 經典 xref 表、正規的尾隨資料與精確的
startxref偏移會從量測的輸出位置重建 - 尾隨資料保留有效的
/Info、/ID與/Encrypt值,並把/Root綁定到單一已驗證的 Catalog - 目標會透過同層級的暫存檔寫入,並只在所有檢查成功後取代要求的路徑
嚴格拒絕
對於重複的物件編號、多個或缺失的 Catalog 物件、中斷的尾隨參照、物件之間的註解外位元組、無效的物件文法、物件或輸入限制、超過十位數的經典 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;