JBIG2 區段圖驗證

HotPDF 會在原生或外部解碼器收到內嵌 JBIG2 影像與 JBIG2Globals 串流之前先加以驗證

驗證器先做一次有界的區段走訪,再進行迭代式的相依圖遍歷,並以索引化的區段編號查詢取代重複掃描

自訂處理前先行驗證

Options := DefaultJBIG2SegmentGraphValidationOptions;
Options.MaxSegments := 32768;
Options.MaxTotalReferences := 131072;
Options.MaxReferenceDepth := 512;
Options.MaxSymbols := 500000;

if not HPDFValidateJBIG2SegmentGraph(ImageData, GlobalData,
  Options, Info) then
  raise Exception.Create(string(
    HPDFJBIG2SegmentGraphValidationStatusName(Info.Status)));

TJBIG2SegmentGraphValidationInfo 回報區段與邊的數量、宣告的新符號數、最大相依深度,以及第一個失敗所在的串流、位元組位移、區段編號與參考編號

預算放在 TJBIG2SegmentGraphValidationOptions 記錄裡,MaxSegments、MaxReferencesPerSegment、MaxTotalReferences、MaxReferenceDepth 與 MaxSymbols 欄位為每一次走訪設下上限

終態是一個 TJBIG2SegmentGraphValidationStatus 值,從未檢查、有效,一路涵蓋拒絕選項、標頭與參考失敗、循環,以及符號字典違規,HPDFJBIG2SegmentGraphValidationStatusName 會把它轉成文字

FailureStreamKind 用 TJBIG2SegmentStreamKind 說明第一個失敗是在 globals 串流(jbsskGlobals)還是影像串流(jbsskImage)裡找到

THPDFJBIG2Decoder.LastSegmentGraphValidationInfo 在 LoadFromByteArray 或 LoadRegionFromByteArray 之後保留相同的回報

失敗關閉條件

驗證會拒絕格式錯誤或被截斷的標頭、內嵌串流中的獨立檔案標頭、被禁止的過短與過長參考表、重複或遺失的區段識別碼、實體上向前的相依、相依循環、過深的層數,以及超出設定的區段或邊預算

影像區段必須使用頁面關聯 1,全域區段必須使用頁面關聯 0,而全域區段不能相依於影像區段

內嵌的頁面結束、檔案結束與色彩調色盤區段都會被拒絕,放在 JBIG2Globals 裡的頁面專屬區域與頁面資訊區段也一樣

符號字典標頭會在解碼前先行檢查,讓宣告的新符號與匯出符號數量、彙總輸入符號池以及不可能的匯出總數,在點陣圖配置之前就先失敗

解碼器與 globals 快取邊界

THPDFJBIG2Decoder、HPDFJBIG2NativeMMRDecode、HPDFJBIG2NativeRegionDecode 與內嵌的 HPDFJBIG2DecDecodeEx 呼叫共用同一套原則

已註冊的原生與外部後端使用已驗證的內部路徑,一般解碼時不會重複走訪圖形

THPDFJBIG2GlobalsPool.Register 只接受有效的僅全域區段串流,避免格式錯誤的共享字典進入文件層級的重用

以 Embedded = False 傳入的獨立 JBIG2 檔案仍保留其檔案導向的獨立解碼路徑

參見 JBIG2 壓縮支援、THPDFJBIG2Decoder.LoadFromByteArray 與 THPDFJBIG2Decoder.LoadRegionFromByteArray