已載入 PDF 的 PDF/A-4 點陣化轉換

HPDFArchivalConversion 以嚴格的原生轉譯與呼叫端提供的 sRGB ICC 設定檔,從已載入 THotPDF 文件的可見頁面內容建立新的 PDF/A-4 文件

每個輸出頁面都包含一張以要求 DPI 無損壓縮的 RGB 點陣影像,原始的可見尺寸、裁切、旋轉與 UserUnit 都會反映在輸出頁面幾何中

當原始內嵌字型、文字運算子、向量路徑、影像、OCR 圖層以及可見註解或 widget 外觀必須保留時,請使用另一個文字與向量保留設定檔;點陣設定檔不保留這些結構

進入點

function HPDFConvertLoadedToPDFA4Raster(Source: THotPDF;
  Destination: TStream; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

function HPDFConvertLoadedToPDFA4RasterFile(Source: THotPDF;
  const TargetFileName: string; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

請先載入來源,並讓呼叫端自有的輸入串流保持存活,直到來源文件被銷毀為止

一般的封存發布請使用檔案版進入點:它會先探測既有目標是否為來源的別名,然後在目標目錄建立獨佔的暫存檔案、驗證完整轉換、排清檔案,最後以 MoveFileEx 搭配 MOVEFILE_REPLACE_EXISTING 與 MOVEFILE_WRITE_THROUGH 取代目標

轉換、轉譯、驗證、取消或發布失敗時,既有的目標檔案會保持原樣,暫存輸出則會被移除

串流版進入點要求目的端是位置 0 上、空的可定位串流,並透過 IsLoadedSourceStreamAlias 拒絕輸入的已知別名;只有完整的暫存輸出通過原生驗證之後,才會寫出位元組

目的端寫入失敗時會盡力重設回空串流,但任意裝置或自訂串流可能拒絕該重設而留下部分寫入;若檔案發布必須是原子操作,請使用檔案版進入點

選項與資源上限

選項預設意義
DPI150要求的實體解析度,可接受範圍為 36 到 1200
MaxPages1000已載入來源頁面的數量上限
MaxPixelsPerPage40,000,000單頁像素與單一來源影像像素的上限
MaxTotalPixels500,000,000累計輸出點陣像素上限
MaxRasterBytes256 MiB單頁或單一來源影像的點陣配置上限,以每像素 4 位元組保守估算
MaxOutputBytes256 MiB暫存 PDF 大小上限,在串流配置與寫入之前強制執行
MaxDecodedStreamBytes64 MiB約束每條篩選鏈、每頁合計的內容預檢、單次原生串流讀取回呼、單一編碼來源影像串流,以及原生輸出驗證器
MaxTotalDecodedBytes256 MiB約束整個轉換過程中額外的原生篩選解碼工作、跨頁面合計的內容預檢,以及跨頁面累計的原生串流讀取回呼
MaxInputObjects200,000已載入間接物件數量上限
CancellationTokennil借用的權杖,會在工作開始前、原生轉譯與解碼期間以及發布之前檢查
Checkpointnil借用的同步回呼,在轉換與原生資源檢查點以 nil sender 呼叫;不要重新進入來源文件

解碼限制計算的是解碼器工作量,同一條篩選串流可能在預檢、顯示清單編譯與轉譯期間被重複計費;提高預算是呼叫端的明確決定

像素預檢同時涵蓋要求的實體解析度與原生轉譯器在 UserUnit 縮放後的整數 DPI;極小的單位可能需要額外的點陣像素,而含小數的頁面尺寸在影像映射回實體頁面時可能引入次像素重新取樣

轉換上限在來源載入之後才生效;接受不受信任的輸入時,請設定載入器自身的資源限制

來源物件圖會保留,讀取快取與解碼統計則可能被填入;無論成功或失敗,轉譯設定、取消權杖、後端與解碼預算設定都會還原

轉換器暫時套用這些設定期間,請讓它獨佔存取來源文件

轉譯與色彩

每一頁都必須在沒有原生後援診斷、被捨棄診斷或資源遺失失敗的情況下完成轉譯;不支援的內容會直接拒絕轉換,而不是發布不完整的頁面

ICC 引數必須以可辨識的 matrix/TRC 表示法、標準的 D50 調適原色與 IEC sRGB 轉換函數來描述 sRGB;無關的 RGB 設定檔、CMYK 設定檔、格式錯誤的設定檔與以 LUT 為基礎的設定檔都會被拒絕

輸出會宣告 sRGB OutputIntent 與 PDF/A-4 XMP 中繼資料;來源上已設定的自訂打樣或輸出 ICC 工作流程會被拒絕,因為其影像解碼器設定無法安全地重新解讀為 sRGB

FPC 版本需要具備 LittleCMS 的原生 codec 橋接,缺少該色彩管理後端時會拒絕轉換

JPEG 與 JPX 影像串流(含編碼的內嵌影像)會在原生像素解碼之前檢查實際的 codestream 尺寸,且必須與 PDF 影像字典一致

JPEG 接受有界的 8-bit 基線、延伸循序與漸進式標頭;JPX 接受有界的 J2K SIZ 標頭,以及至多四個分量、分量精度至多 16 bits 且長度正常的 JP2 box

編碼 codec 另有每來源像素 64 位元組的保守工作預算,JPX 瓦片中繼資料同時受 MaxInputObjects 以及 MaxRasterBytes 內每瓦片 1024 位元組限制;因此預設 256 MiB 的點陣預算最多允許 4,194,304 個編碼來源像素,影像更大時呼叫端可以明確調高

JBIG2 轉換會被拒絕,因為其內部區域與符號配置無法透過現有的標頭 API 限定範圍;非終端影像 codec、延伸長度 JP2 box、不支援的包裝格式,以及帶有 DecodeParms 的包裝 codec 串流也一併拒絕

CCITT 傳真參數必須維持宣告的正數影像尺寸;DecodeParms.Columns 與 Rows 覆寫值若與字典不同(包含未知的 Rows=0),會在原生解碼之前被拒絕

這些檢查限定的是此轉換器接受的已知標頭與配置型態,並不承諾為每個原生解碼器提供完整的處理程序記憶體沙盒

資訊與品質損失

THPDFArchivalConversionReport 提供成功與取消狀態、來源與已轉譯頁數、點陣像素、輸出位元組、移除的註解/表單/附件數量、失敗診斷,以及原生驗證的發現

FailureKind 區分 afkNone、afkConversion、afkBudget 與 afkCancelled;具型別的轉換器預算失敗還會提供 BudgetMetric、BudgetObserved 與 BudgetLimit

檢查點例外會中止轉換並透過原生失敗結果回報;需要在原始回呼例外類別上做判斷的包裝層,必須在轉換器攔截之前先保留它

archive.pdfa4.raster JSON 與 C ABI 操作要求明確接受資訊損失、保留來源控制代碼、交付通過驗證的 PDF 與損失報告,並套用保守的工作預算上限

一致性驗證

轉換器會重新載入暫存輸出,並要求在發布之前以基礎 PDF/A-4 設定檔通過 ValidatePDFA4;原生驗證器涵蓋的是其文件記載的有界規則集,並不等同於證明符合 ISO 19005-4 的每一項要求

獨立驗收可使用 veraPDF 搭配 --flavour 4;內含未內嵌文字、透明度、RGB 影像、連結、簽署 widget 與附件的迴歸測試檔,已通過 veraPDF 1.30.2 且無任何失敗的規則或檢查

非 GUI 的專屬迴歸套件請執行 Tests/Delphi/Run-HotPDFArchivalTests.bat