已載入 PDF 轉 PDF/A-4 並保留文字與向量

HPDFArchivalConversion 為已載入文件提供保留型設定檔:當其可見字型、色彩空間與轉譯資源能滿足 PDF/A-4 時,不必替換頁面內容

轉換器保留原始文字運算元、向量路徑、影像、頁面幾何與既有 OCR 文字層,把可見的正常註解與 widget 外觀平面化為向量 Form XObject,修復受支援的中繼資料與結構問題,並在發布前驗證序列化結果

此設定檔絕不把頁面點陣化:RasterizedPages 恆為零,包括 OCR 轉譯暫存辨識點陣並附加不可見可搜尋文字時

執行期驗收涵蓋 Delphi Win32 與 Win64;Windows FPC 從全新原始碼編譯實作,產生的公開標頭可在 C++Builder Win32 與 Win64x 下編譯

進入點

function HPDFConvertLoadedToPDFA4Preserving(Source: THotPDF;
  Destination: TStream; const SRGBProfile: TBytes;
  const Options: THPDFArchivalPreservationOptions;
  out Report: THPDFArchivalPreservationReport): Boolean;

function HPDFConvertLoadedToPDFA4PreservingFile(Source: THotPDF;
  const TargetFileName: string; const SRGBProfile: TBytes;
  const Options: THPDFArchivalPreservationOptions;
  out Report: THPDFArchivalPreservationReport): Boolean;

先載入來源,保持呼叫端自有的輸入串流存活,並在作業期間讓轉換器獨佔存取文件

Options := THPDFArchivalPreservationOptions.Default;
if not HPDFConvertLoadedToPDFA4PreservingFile(Source, TargetFileName,
  SRGBProfile, Options, Report) then
  raise Exception.Create(Report.Conversion.Diagnostic);

保留證明

轉換器在圖形交易下快照目前編輯過的來源圖形,序列化後回溯來源,然後在獨立的已載入複本上執行所有轉換工作

輸出重新載入後,原始已解碼頁面內容串流必須 byte 級相同,且可從原始頁面按原始順序到達

頁面資源樹與保留的正常外觀資源樹在物件與遞迴上限內遍歷;內嵌字型程式、ToUnicode 對應、影像、ICC 設定檔與巢狀 Form XObject 保留原始編碼負載,以串流 SHA-256 驗證,並檢查仍可從輸出頁面到達

獨立的內容串流以圖形狀態防護包住原始頁面運算元,並容納附加的外觀運算元,避免會重寫原始內容串流的原生單串流附加路徑

TextAndVectorContentPreserved 只在原生輸出驗證與保留檢查通過後為 true;轉換或檔案發布失敗時會清除

外觀處理

提供既有正常外觀時,支援該外觀中已正確表達的任意內嵌字型文字,包括 Unicode;轉換器保留該外觀,不以系統字型替代

平面化會移除註解互動、可編輯欄位、計算、action 與簽章欄位,同時保留可見外觀;每個受影響的註解與每個合成外觀都產生損失條目,附來源頁面、註解索引與(可得時)物件編號

色彩、字型與明確損失

必要的 ICC 參數是既有封存驗證器接受的 sRGB matrix/TRC 設定檔;每個既有輸出設定檔的解碼 bytes 必須與提供設定檔完全相同,否則拒絕轉換,以免重新解讀既有輸出條件

轉換器只在需要時加入 sRGB PDF/A 輸出意圖,把實際序列化器同步到 PDF 2.0 標頭,並叫用有界的基礎 PDF/A-4 中繼資料與結構修復

它不內嵌缺少的可見字型程式、不重新編碼原始文字、不重新著色 DeviceCMYK 運算元、不取代既有輸出條件,也不把頁面透明度平面化成點陣;未解決的原生 preflight 發現會拒絕發布

加密來源必須先解密;簽章欄位需要明確 AllowSignatureInvalidation,既有內嵌檔案需要明確 RemoveEmbeddedFiles,因為此設定檔以基礎 PDF/A-4 為目標

Losses 也回報簽章失效、內嵌檔案移除、舊式 Info 字典移除,以及被禁止的 catalog 或呈現中繼資料移除

受支援時保留既有 XMP;產生中繼資料時,受支援的標題、作者、主旨與關鍵字資訊會轉移,任意舊式 Info 欄位則不保證存活

OCR 與預算

AddOCRToImagePages 預設 false;啟用後會辨識沒有可抽取文字的頁面並附加不可見文字,不取代原始內容或既有 OCR 層

把 OCREngine 設為應用程式引擎,或留 nil 使用內建有界 ASCII OCR 引擎,其語言與排版涵蓋範圍即內建辨識設定檔的範圍

OCROptions 控制辨識解析度與文字預算;轉換器則強制跳過含文字頁面、保留既有 OCR 層,並省略新的 optional-content 群組

Limits 用 THPDFArchivalConversionOptions.Default 約束頁數、物件數、暫存輸出 bytes、單串流工作量、累計串流工作量、取消與同步檢查點;點陣像素上限只在 OCR 轉譯辨識點陣時適用

其他預設為 1,024 個損失條目、1,048,576 個抽取或預期文字 code unit,以及每次原生驗證 4,000,000 個內容 token

資源負載雜湊把編碼 bytes 計入相同的串流工作量預算;來源與輸出驗證都消耗累計工作量,因此大型掃描合集可能需要明確調高 MaxTotalDecodedBytes,即使資源驗證使用固定的 64 KiB 雜湊緩衝

預算在來源載入後套用,分別約束轉換器自有的快照與暫存輸出;接受不受信任輸入時請設定載入器上限

發布與驗證

串流 API 要求目的地為空、可 seek 且位置在零,並拒絕來源別名;只有重新載入、原生驗證、保留檢查與取消檢查都成功後,才複製暫存 bytes

目的地寫入失敗會觸發盡力重置;任意自訂串流可能拒絕該重置,因此原子檔案發布請使用檔案進入點

檔案 API 探測來源別名,在目標旁建立獨佔暫存檔,沖寫,並只在所有檢查通過後以 MoveFileEx 取代目標;較早的失敗保留既有目標並移除暫存檔

InitialValidationIssues、Repair、Conversion.ValidationIssues、OCR 明細、串流計數、抽取文字計數與明確損失都可供檢視

原生驗證涵蓋受支援的 HotPDF PDF/A-4 規則,不是對任意 PDF 的一攬子認證;迴歸驗收另外使用獨立的 pypdf 與 MuPDF 檢查,加上對產生外觀與原生 OCR 產物的 veraPDF PDF/A-4 驗證

真實語料迴歸包含內嵌字型的 Word 與圖書館指南,以及一份 380 頁中文掃描合集;未內嵌字型且含 DeviceCMYK 內容的商業報告則是明確的拒絕案例

迴歸命令

powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win32
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win64
python Tests/Delphi/Fixtures/ArchivalPreservation/verify_preserving_output.py
verapdf --format xml --flavour 4 Tests/Delphi/generated/ArchivalPreservation/appearance.pdf Tests/Delphi/generated/ArchivalPreservation/ocr.pdf Tests/Delphi/generated/ArchivalPreservation/native-appearance.pdf

Delphi 執行器抑制檢視器啟動,並包含保留與既有點陣兩類迴歸 fixtures;獨立 veraPDF 驗收使用實際的 PDF/A-4 驗證設定檔

相關主題

點陣封存轉換提供獨立設定檔,在支援原生轉譯時明確損失原始文字與向量