已載入 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;轉換或檔案發布失敗時會清除
外觀處理
- 可見的正常
AP/N外觀會以原生註解平面化,從其 Form BBox 與 Matrix 映射到註解 Rect,保留其自有字型與資源 - Invisible、Hidden 與 NoView 旗標阻止繪製,即使已有正常外觀;Popup 註解直接移除,不繪製
- 沒有正常外觀的無框連結,只在明確的零寬度邊框確立其無可見邊框時,才移除而不繪製
SynthesizeMissingAppearances預設 true,叫用原生 markup 或欄位外觀產生;不支援的子類型、無效矩形或產生失敗會拒絕轉換- 缺少文字外觀時支援相容原生字型編碼的 ASCII 值;十六進位、Unicode 或遮罩文字值需要明確的正常外觀
- 合成的文字外觀會在空白正規化後,與重新載入的可搜尋文字中的來源值比對;不相容的字型編碼會拒絕發布
提供既有正常外觀時,支援該外觀中已正確表達的任意內嵌字型文字,包括 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 驗證設定檔
相關主題
點陣封存轉換提供獨立設定檔,在支援原生轉譯時明確損失原始文字與向量