依 PDF 版本儲存的相容性
自 3.23.0 版起,選定的 PDF 儲存版本會被視為完整儲存的嚴格輸出契約。應用程式呼叫 SetInformation(0, "1.2")、"1.3"、"1.4"、"1.5"、"1.6" 或 "1.7" 時,SaveToFile、SaveToString 和 SaveToStream 會寫出符合所選目標版本的輸出,或在寫入輸出前失敗
完整儲存會移除 Catalog /Version 覆寫項目,使已載入文件不能悄悄把有效版本提高到所選檔頭之上。較低版本目標也會移除不支援的 Catalog /Extensions 項目,PDF 1.3 目標會省略 Catalog /Metadata 和 XMP Metadata 串流,同時保留文件資訊字典
儲存預檢會拒絕已知的較高版本功能,而不是產生混合版本檔案。檢查邊界包括 PDF 1.3 頁面框、嵌入檔案串流、JavaScript 動作、ICCBased 和 DeviceN 色彩空間以及 ToUnicode CMaps;PDF 1.4 透明度、Tagged PDF 結構、output intents 和註解鍵;PDF 1.5 object streams、選用內容、XFA、page tabs、簽章欄位 append-only 旗標和進階表單欄位旗標;PDF 1.6 UserUnit、OpenType 字型程式、3D 字典、NChannel 色彩空間和 viewport 資料;以及 PDF 1.7 RichMedia、Projection、Redaction、進階註解和 ETSI 簽章子過濾器; 同一規則集也涵蓋 annotation /CA 不透明度、JBIG2Decode、Metadata 串流、文件層級 EmbeddedFiles 名稱樹、JPXDecode、xref streams、Crypt filters、AESV2 crypt filters 和 PDF 1.7 Requirements
PDF 1.7 的 Adobe extension-level 要求會獨立於 PDF 1.7 檔頭檢查。AESV3、AES-256、RichMedia、Projection、地理空間字典和 ETSI 簽章子過濾器必須具備足夠的 Catalog /Extensions /ADBE /ExtensionLevel 宣告,所選儲存目標才會被接受。發出這些 extension-level 功能的 writer 進入點,會在所選儲存目標可提升到 PDF 1.7 時自動加入相符的擴充宣告
自 v3.67.0 起,載入端內容功能偵測改為惰性執行。已載入文件不會立即掃描;只有當 GetInformation(0/101/103)、GetPDFUADiagnostics、SaveToFile、SaveToString、SaveToStream 或相關 append-save 路徑首次使用有效版本或載入時功能診斷時,偵測才會執行。從不查詢這些診斷且從不儲存的唯讀流程可以完全跳過掃描
自 v3.67.1 起,偵測掃描會淺層解析 stream 物件。它檢查物件字典和 stream 分類,同時跳過大型 stream 內容,因此過濾器、子類型、色彩空間和版本限制鍵的偵測結果保持等價,大型影像串流不再主導掃描耗時。一般物件讀取以及所有儲存路徑在輸出需要時仍會讀取完整 stream 內容
自 v3.67.2 起,明確的儲存版本選擇優先於惰性偵測。對已載入文件,SetInformation(0, ...) 和 LockSaveVersion 會先執行待處理的偵測快照,再套用要求的版本,因此後續儲存或診斷查詢不能在呼叫端背後抬高所選目標版本。新建文件不會為載入端偵測 armed,這與早期僅由 writer 控制版本的行為一致
當所選目標版本低於文件中仍存在的某項功能時,TPDFlib 呼叫端會收到 LastErrorCode 602。請在儲存前選擇較新的目標版本,或移除不相容的功能