更新日誌
版本釋出歷史
PDFlibPas 庫的版本歷史。條目按時間倒序排列,每個版本遵循專案釋出策略中的語義化版本規範。
語言:English (US)English (UK)Español (España)Español (Latinoamérica)DeutschFrançaisItaliano日本語Português (Brasil)NederlandsSvenskaPolskiTürkçe한국어العربيةРусский简体中文繁體中文
v3.56.42 2026-05-27
- 修復 v3.56.41 引入的基於緩衝區的 AES-256 解密路徑,使呼叫端可以把解密結果重新指定給提供密文緩衝區的同一個
AnsiString,而不會觸發存取違規。 - 普通 API 的
LoadFromFile、Encrypt、SaveToFile、重新載入、Decrypt、SaveToFile流程現在可再次在已載入的大型 PDF 上完成,同時保留減少複製的 AES-CBC 解密最佳化。 - 新增 AES 回歸覆蓋,驗證儲存時回復加密 stream 所用的輸入緩衝區/回傳結果別名場景,包括此前暴露故障的 504 KB 大 payload。
v3.56.41 2026-05-27
- 新增
TPDFlib.DACopyFile,面向只需要頁數和原樣檔案副本、但不想建構完整普通物件圖的 Direct Access 工作流程。 - 透過新增基於緩衝區的 AES-CBC 解密路徑並在載入後的字串和 stream 解密中重用它,最佳化 AES-256 解密,減少大型加密 stream 上的額外密文複製。
- Delphi
HugeFileBenchmarkdemo 新增direct-copy列,並加入--ops與--skip篩選器,便於聚焦執行大型檔案測試。
v3.56.40 2026-05-26
- Delphi 和 C++Builder 的
HelloWorld範例現在會建立更完整的入門 PDF,包含文件資訊、選定標準字型輸出、樣式化標題區、簡單向量繪圖和後續範例指引,同時保持原有的建置並執行流程。 - 所有 Delphi 和 C++Builder 範例說明都已替換為適合瀏覽器閱讀的
Readme.html頁面,包括密碼、受限檔案和簽章結果等輔助說明;兩個範例索引現在也會引導使用者查看 HTML 說明。
v3.56.39 2026-05-26
- 直接檔案 API 的儲存路徑現在以線性方式建構交叉引用查詢表,使
DASaveAsFile和相關直接儲存路徑在物件數量極高或頁樹密集的 PDF 上明顯更快。 - 最佳化後的 writer 保持相同的自由物件鏈語義,同時避免完整 xref 產生過程中的重複物件號碼掃描,在不改變公開 API 或輸出契約的情況下改善大型直接儲存工作流程。
v3.56.38 2026-05-26
- 修復普通 API 的加密輸出,使
Encrypt在寫入 AES-256 安全資料前建立或保留 trailer/ID,從而讓加密後的 PDF 在重新載入時仍可透過EncryptionStatus識別為加密狀態。 - 普通 API 的
LoadFromFile、Encrypt、SaveToFile、重新載入、Decrypt、SaveToFile工作流現在會在明確Decrypt前保留加密狀態,與直接檔案 API 處理大型舊版 PDF 的行為一致。
v3.56.37 2026-05-26
- 新增
TPDFlib.ComparePreflightReports,用於逐行比較純文字 preflight 報告;它會忽略易變的Generated:時間戳行,並在穩定報告內容一致時返回空字串。 - Delphi
PreflightReport示例現在支援單檔案模式下的--compare <file>,當生成的文字報告與 baseline 不同時,會寫出 UTF-8.diff.txt報告並返回退出碼 2。
v3.56.36 2026-05-26
- Delphi
PreflightReport示例現在支援使用--input-dir、--output-dir和--recursive進行目錄批處理,併為每個 PDF 寫出一個<basename>.preflight.<ext>報告。 - 批處理模式會寫出 UTF-8
preflight-summary.csv,記錄每個源 PDF、通過/失敗狀態、問題數量和生成的報告路徑,同時保留現有退出碼約定,便於自動化使用。
v3.56.35 2026-05-26
ReportFormat = 3為TPDFlib.CreatePreflightReportEx和TPDFlib.SavePreflightReportEx增加 CSV 輸出,生成 UTF-8 行來表示報告後設資料、每個選中的合規檢查、單項問題程式碼與訊息,以及最終摘要。- Delphi
PreflightReportdemo 現在支援--format csv和--csv,命令列 preflight 執行結果可直接供電子表格或簡單 CI 解析器使用,無需後處理 JSON 或擷取文字。
v3.56.34 2026-05-26
- 新增支援格式選擇的
TPDFlib.CreatePreflightReportEx與TPDFlib.SavePreflightReportExAPI,可在保留現有純文字報告 API 的同時,將 PDF/A 與 PDF/UA-1 preflight 報告生成為純文字、JSON 或獨立 HTML。 - Delphi
PreflightReport例程現在支援--format text|json|html,並提供--json與--html快捷選項,同一套命令列流程既能輸出面向人工閱讀的報告,也能生成便於 CI 消費的機器可讀產物。
v3.56.33 2026-05-26
- 新增
TPDFlib.CreatePreflightReport和TPDFlib.SavePreflightReport,應用程式可以基於內建 PDF/A 與 PDF/UA-1 合規檢查生成可複用的純文字報告,不再需要手動列舉字串列表控制代碼。 - Delphi
PreflightReport例程現在直接呼叫庫級報告 API,使示例聚焦於命令列流程、選擇檢查項、首個問題模式以及便於自動化使用的退出碼。
v3.56.32 2026-05-26
- 新增 Delphi 控制台示例
PreflightReport,使用CheckFileCompliance執行 PDF/A 與 PDF/UA-1 檢查,透過GetStringListCount和GetStringListItem列舉問題列表,並寫出純文字 preflight 報告。 - 該示例支援
--input、--output、--pdfa、--pdfua、--both和--first-issue選項,並提供便於自動化判斷的通過、發現問題和執行錯誤退出碼。
v3.56.31 2026-05-25
GetCustomKeys(2)現在能夠一致地隱藏由庫管理的 Catalog 系統條目,包括 /OutputIntents、 /Extensions、 /Requirements、 /Collection 和 /NeedsRendering。- 使用
SetPDFAMode建立的 PDF/A 輸出意圖不再顯示為自定義 Catalog 鍵,從而將應用程式後設資料列舉與 PDF 合規性結構分開。
v3.56.25 2026-05-23
- Writer端 GetPDFUADiagnostics 修復了匹配
MULTIPLE-H-CHILDREN:N的問題,與 reader端10044在 v3.56.24 方面保持一致。 ISO 14289-1 §7.4.4 禁止每個標籤樹節點擁有超過一個直接的H子節點——writer端檢查會在記憶體中的 FStructElems 樹包含此類違規時觸發。 - 一個新的巢狀 CountMultipleHChildren 輔助函式以深度優先方式遍歷樹,計算每個級別的H子節點數量。此檢查與現有的 LIST-STRUCT / LIST-NO-NUMBERING 遍歷並行執行,並共享相同的 FStructElems 遍歷模式。
v3.56.24 2026-05-23
- PDF/UA-1 審計增加了 ISO 14289-1 §7.4.4 H標籤唯一性檢查。
10044報告任何結構節點,如果該節點攜帶超過一個直接的H子節點,則違反規範(在強結構文件中,此操作是被禁止的),並且相同的約束適用於任何標籤樹節點,無論整體結構模式如何。 另一個 § 7.4.4 SHALL(文件應要麼是強結構,要麼是弱結構,而不能兩者兼有)需要文件範圍的啟發式方法,並且有意地未包含在此次審計中。 - 一個新的前序結構樹遍歷器(UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness)計算每個節點的直接H子節點數量,並以深度優先方式遞迴。它重用與現有的標題/列表/註釋遍歷器相同的K形解碼器。
v3.56.23 2026-05-23
- PDF/UA-1 審計增加了兩個 ISO 14289-1 §7.21.6 字型程式檢查,這些檢查原本需要 v3.56.10 在一個 TrueType 解析器可用時才能完成。
10034報告非符號 TrueType 程式,這些程式的嵌入式 SFNT cmap 表僅包含符號條目 (platformID=3, encodingID=0)。 — § 7.21.6 段落要求至少有一個非符號 cmap 子表,以便程式可以渲染其 /Encoding. 定義的程式碼點。10035報告非符號 TrueType 陣列,這些陣列的字形名稱不是 Adobe Glyph List 的成員 (.notdef除外)。 — § 7.21.6 段落要求每個 Differences 條目都位於 AGL 中。 - 新的
Lib/PDFlibPDFUAFontInspect.pas實現了對 SFNT 表目錄的容錯掃描器和 cmap 子表目錄解析器。 在上一個基礎設施提交中新增的包含 4281 個名稱的 Adobe Glyph List 表現在已透過 Differences 檢查連線到系統中。 無法解析為 SFNT (Type 1 PFB / PFA, OpenType 集合,任意垃圾) 的程式將被靜默跳過。 在審計層,優先考慮避免誤報,而不是漏報。
v3.56.22 2026-05-23
- PDF/UA-1 審計增加了對 ISO 14289-1 §7.18.6 媒體剪輯資料檢查。
10042報告缺少必需的/CTcontent-type 條目的媒體剪輯資料字典(由/S /MCD,可選/Type /MediaClip標識)。10043報告相同的字典缺少必需的/Alt陣列。 ISO 32000-1 表 274 將這兩個鍵都列為可選,但 ISO 14289-1 §7.18.6 將它們提升為必需,以便螢幕閱讀器可以為嵌入式多媒體提供有意義的描述。 - 這是 PDF /UA 深度審計計劃的第 6 階段 (
.superpowers/plans/2026-05-23-pdfua-deep-audit-plan.md)。 它不需要任何字型程式或內容流解析器,因此是 v3.56.0..v3.56.13 系列的第一個後續子類。
v3.56.21 2026-05-23
- 新的
SetSignProcessCommitmentType會發出 CAdEScommitment-type-indication簽名屬性 (OID 1.2.840.113549.1.9.16.2.16, ETSI EN 319 122-1 v1.2.1 §5.2.3) 到 PAdES-B-B 路徑。它接受 1..6 的整數程式碼,這些程式碼對映到已知的 ETSI 承諾 OIDsid-cti-ets-proofOfOrigin到id-cti-ets-proofOfCreation;傳入 0 以清除。超出範圍的程式碼將被拒絕。 - 新的
SetSignProcessSignaturePolicy會發出 CAdESsignature-policy-identifier簽名屬性 (OID 1.2.840.113549.1.9.16.2.15, §5.2.9)。它接受點分十進位制策略 OID,策略文件的雜湊值(以大寫十六進位制字串表示),以及摘要演算法程式碼(1=SHA-1,2=SHA-256,3=SHA-384,4=SHA-512,0=自動/SHA-256)。該屬性攜帶SignaturePolicyIdSEQUENCE,其值為sigPolicyId+sigPolicyHash(OtherHashAlgAndValueSEQUENCE)。 - 這兩個屬性僅在 SubFilter 為
ETSI.CAdES.detached時才生效(即 PAdES-B-B 路徑);它們擴充套件現有的rgAuthAttr陣列,並與content-type和signing-certificate-v2協同工作。 PAdES 表 1 的 d) 行禁止將commitment-type-indication與 PDF 簽名字典/Reason條目結合使用;呼叫者負責確保不要同時設定這兩個屬性。
v3.56.20 2026-05-23
- 新的
AddPAdESDSSVRI為正在建構的 DSS 新增一個簽名 VRI 子字典條目,完成了 ETSI EN 319 142-1 v1.2.1 條款 5.4.2.3 驗證相關資訊結構。該條目以大寫十六進位制 SHA-1 作為簽名 ' 的/Contents位元組的鍵;其Cert/CRL/OCSP子陣列透過引用相應的父 DSS 流來填充,這些流的索引以逗號分隔的列表形式提供(例如"0,2,5")。 - 底層
TSmartPDFDocument.AddPAdESDSSWithVRI跟蹤為每個證書 / CRL / OCSP 發出的流物件編號,並使用這些編號將 VRI 子陣列作為間接引用寫入到與父 DSS 陣列已經指向的同一流中,以滿足規範要求,即 VRI 條目應與父 DSS 字典共享儲存。原始AddPAdESDSS入口點繼續以不變的方式工作,適用於不需要 VRI 的呼叫者。 - 每個簽名 VRI 子字典都帶有可選的
/Type /VRI標記,以便可以根據Type標籤遍歷目錄的工具能夠識別該結構,而無需重新解析父路徑。
v3.56.19 2026-05-23
- 新的 PAdES-B-T 工作流程,用於將 RFC 3161 / RFC 5816 簽名時間戳 (id-aa-signatureTimeStampToken, OID 1.2.840.113549.1.9.16.2.14) 附加到現有的 PAdES-B-B 簽名。
NewPAdESSignatureTimeStampProcessFromFile/FromStream/FromString開啟一個已簽名 PDF,SetPAdESSignatureTimeStampField指定欄位名稱,GetPAdESSignatureValueHashHex返回簽名者的 SHA-256 (或 384 / 512) 雜湊值,用於提交到 TSA,GetPAdESSignatureCMSBytes暴露現有的 CMS 負載,SetPAdESSignatureCMSBytes接受呼叫者透過其首選 CMS 庫建置的增強 CMS 位元組,以及EndPAdESSignatureTimeStampProcessToFile/ToStream/ToString將新的 CMS 插入到原始/Contents佔位符中。 BuildPAdESSignatureTimeStampAttribute是一個無狀態的輔助函式,它將 TSA 發出的 TimeStampToken 封裝在 CMS 屬性 SEQUENCE 中,SignerInfo.unsignedAttrs期望該屬性,因此已經擁有 CMS 庫的呼叫者可以跳過 OID + SET 的配置。- 新的
SetSignProcessReserveContentsBytes在初始簽名時擴充套件/Contents佔位符,以便在簽名後增強的 CMS 可以放入,而不會超出原始預留的空間。 通常,TSA 發出的 TimeStampTokens 會在 SignerInfo 上增加 2-6 位元組;此處傳遞 1024-8192 以保留空間。 如果沒有足夠的預留空間,增強呼叫將返回13(輸出溢位)。 - 該庫不包含 TSA HTTP 用戶端;呼叫者會獲取 TimeStampToken (通常是 TSP 請求的 30-50 行 + HTTP POST,例如,針對 FreeTSA 或 DigiCert)。 理論上,Windows ⟦P0010⟧
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR可以將 CMS 注入到庫中,但由於返回CRYPT_E_INVALID_INDEX(0x80091008) 表示分離的 SignedData 形狀 PAdES,因此使用呼叫者提供的 CMS 位元組路徑。
v3.56.18 2026-05-23
- PAdES 屬性現在嵌入了 RFC 5035 (ESSCertIDv2) 定義的可選
IssuerSerial欄位。 簽名證書的頒發者 Distinguished Name 被封裝在一個GeneralName [4] EXPLICIT directoryNameCHOICE 中,位於GeneralNames中,然後是證書序列號,作為 ASN.1 INTEGER。 序列號位元組來自 Windows CryptoAPI (CRYPT_INTEGER_BLOB),並且被反轉為大端,並在最高位設定為正整數時新增填充位元組,這與 OpenSSL 和 BouncyCastle 如何發出相同的欄位相同。 - 驗證器會交叉檢查頒發者名稱 + 序列對與它們的路徑建構候選集 (特別是 EU DSS 的嚴格模式),現在會在簽名證書 v2 屬性中找到這兩個識別符號;以前的 v3.56.17 輸出僅提供
certHash引用。 - 新的 ASN.1 輔助函式
DER_IntegerFromLittleEndian(處理 Win32CRYPT_INTEGER_BLOB位元組順序) 和DER_ContextTagExplicit(將負載封裝在構造的上下文特定標記中) 完善了PDFlibASN1微編碼器。PDFlibCryptoAPI中的新的CERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXT宣告為簽名路徑提供了訪問解析的證書欄位。
v3.56.17 2026-05-23
- 內建的
ETSI.CAdES.detached簽名路徑現在生成結構上符合 PAdES-B-B 的簽名。庫自己建構 CMS authenticated attributes ——content-type(id-data)和 RFC 5035 / RFC 5816 定義的signing-certificate-v2(攜帶簽名證書的 SHA-256 雜湊),再透過rgAuthAttr交給CryptSignMessage。一旦該欄位為 non-NULL,Windows CryptoAPI 就會停止自動注入 PAdES(ETSI EN 319 142-1 v1.2.1 Table 1)所禁止的signing-time屬性,因此最終的SignerInfo只攜帶必需的屬性。 - 新增
PDFlibASN1單元,提供一個聚焦的 DER (X.690) 微編碼器 —— length prefix、OCTET STRING、SEQUENCE、SET、OBJECT IDENTIFIER —— 用於構造SigningCertificateV2屬性值。該編碼器遵循 base-128 OID 弧的標準規則,並在可選的hashAlgorithm欄位只是重複 SHA-256 預設值時省略該欄位,與 OpenSSL 和 BouncyCastle 的輸出一致。 ApplySignature現在把ETSI.CAdES.detached路由到 raw-byte 路徑(與adbe.pkcs7.detached使用的相同路徑),不再傳入預先計算的 digest。CryptoAPI 現在會基於實際簽名內容計算messageDigestauthenticated attribute,這正是驗證者所期望的。- 構造 signing-certificate-v2 屬性時同樣會尊重 SHA-384 和 SHA-512:
hashAlgorithm欄位會帶上匹配的AlgorithmIdentifier發出,而不再依賴預設值。在此上下文中 SHA-1 會被靜默升級為 SHA-256,因為 PAdES-B-B 不允許 SHA-1(clause 6.2.1)。
v3.56.16 2026-05-23
- 新增
SetSignProcessDigestAlgorithm,用於選擇簽名的 message-digest 演算法:1= SHA-1(deprecated),2= SHA-256(現代預設值),3= SHA-384,4= SHA-512,0= auto(除 legacy 的adbe.pkcs7.sha1路徑外,所有 SubFilter 均使用 SHA-256;該 legacy 路徑繼續使用 SHA-1 以保持位元組級向後相容)。ETSI EN 319 142-1 v1.2.1 §6.2.1 禁止 MD5 並將推薦密碼套件交由 ETSI TS 119 312 規定,因此 PAdES 簽名者應選擇 SHA-256 或更強演算法。 - 在既有的
SHA1StreamRange旁新增SHA256StreamRange、SHA384StreamRange和SHA512StreamRange雜湊輔助函式;簽名路徑會使用它們按所選演算法對 PDF ByteRange 求 digest。PKCS#7 的SignerInfo.digestAlgorithmOID 與實際寫入的雜湊位元組現在保證一致(之前的程式碼無論協商出哪種演算法都始終傳入 SHA-1 digest)。 TPDFlibPFXFile.SignData現在接受DigestAlgorithm引數,併為每個 (SubFilter, algorithm) 組合選擇正確的 OID:detached 與 custom SubFilter 走2.16.840.1.101.3.4.2.1/.2/.3對應 SHA-256/384/512(RFC 5754),legacy 的adbe.pkcs7.sha1路徑走匹配的sha256WithRSAEncryption系列 OID。
v3.56.15 2026-05-23
- 新增
SetSignProcessDocTimeStamp,按 ETSI EN 319 142-1 v1.2.1 §5.4.3 把簽名流程切換到 PAdES Document Time-stamp 模式。生成的 Signature Dictionary 攜帶/Type /DocTimeStamp與/SubFilter /ETSI.RFC3161,省略不允許的/M、/Reason、/Location、/ContactInfo、/Name鍵,並在/Contents中為外部獲取的 RFC 3161 TimeStampToken 預留 8192 位元組(或呼叫方指定大小)的十六進位制佔位符。 - 選擇 DocTimeStamp 模式時自動啟用 passthrough,因為 TimeStampToken 來自外部 TSA。切換到 DocTimeStamp 模式後再呼叫
SetSignProcessInfo會被靜默忽略,以保持簽名字典符合 spec。 - v3.56.8 新增的 PAdES
/Extensions /ESIC自動注入已經覆蓋 DocTimeStamp,因為其 SubFilter 以ETSI.開頭,所以 Document Time-stamp PDF 無需額外接線即可宣告所需的 catalog extension。
v3.56.14 2026-05-23
- 新增 PAdES Document Security Store (DSS) 增量 API。
NewPAdESDSSProcessFromFile/NewPAdESDSSProcessFromStream/NewPAdESDSSProcessFromString開啟已簽名的 PDF,AddPAdESDSSCertificate/AddPAdESDSSCRL/AddPAdESDSSOCSP暫存 DER 編碼的驗證材料,EndPAdESDSSProcessToFile/EndPAdESDSSProcessToStream/EndPAdESDSSProcessToString寫入增量更新,包含 ETSI EN 319 142-1 v1.2.1 §5.4.2.2 規定的/DSS << /Type /DSS /Certs [...] /CRLs [...] /OCSPs [...] >>字典。這是把 PAdES-B-B / B-T 簽名升級到 PAdES-B-LT 長期驗證的基礎構件。 - 新增驗證材料時,DSS 流程會自動把 catalog
/Extensions /ESIC項升級到至少ExtensionLevel 1,匹配 §5.6 的要求;重複呼叫時新證書、CRL 和 OCSP 響應會合並進既有的/Certs//CRLs//OCSPs陣列,讓修訂內容累積而非覆蓋。 GetPAdESDSSProcessResult/ReleasePAdESDSSProcess完成生命週期管理,映象既有的SignProcessAPI 介面。
v3.56.8 2026-05-23
- PAdES baseline 一致性:當簽名以 PAdES SubFilter(
ETSI.CAdES.detached或ETSI.RFC3161)建立時,文件目錄現在會自動收到 ETSI EN 319 142-1 v1.2.1 §5.6 要求的/Extensions /ESIC <</BaseVersion /1.7 /ExtensionLevel 2>>項。該項透過承載簽名的同一次增量更新寫入,永遠不會降級既有的更高/ExtensionLevel,並在源 PDF 已經把/Extensions或/ESIC存為單獨物件時跟隨其間接引用。 - SetSignProcessCustomSubFilter 為透過
TPDFlib編寫的 PDF 寫入的 Adobe 等價 extension 標記現在是/ADBE /BaseVersion /1.7 /ExtensionLevel 8(之前是ExtensionLevel 5),與 PAdES baseline 簽名可使用的備選宣告匹配;級別 5 只覆蓋了 ISO 32000-2 forms / 3D / RichMedia 特性,實際並不標識 PAdES extensions。
v3.56.13 2026-05-23
- 當 SetPDFUAMode 啟用並儲存文件時,任何缺失明確
ListNumbering屬性的 L(列表)結構元素現在會自動收到/O = List /ListNumbering = None。ISO 14289-1 §7.6 要求每個 L 標籤宣告其編號樣式;新的ApplyPDFUAListNumbering儲存時修復加入既有的ApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship/ApplyPDFUAStripTrapNet家族。 - 在意特定列表樣式的作者仍應在 EndTag 之前呼叫 SetStructElemListNumbering;自動修復只在儲存時檢測不到 ListNumbering 屬性時觸發,因此明確值會被保留。
- writer 端的
LIST-NO-NUMBERING:N診斷訊息現在會提示自動修復將在儲存時掩蓋該問題,讓使用者既瞭解缺失的屬性也瞭解自動修復行為。
v3.56.12 2026-05-23
- PDF/UA-1 審計新增三項 ISO 14289-1 檢查。
10031報告 URI action 字典攜帶/IsMap = true的 Link 註解(§7.18.5 禁止此項,除非內容他處提供等效功能;有正當 IsMap 使用場景的作者可自行抑制該診斷)。10032報告缺少/ID項的Note結構元素 — §7.9 要求每個 Note 標籤宣告唯一 ID。10033報告兩個或以上 Note 標籤共享同一/ID值時的重複配對數。 - Note ID 衝突檢測透過把 ID 收集到排序的 TStringList 並遍歷相鄰配對完成,因此三個共享同一 ID 的 Note 計為兩對重複。
- URI action 檢查遍歷每頁的
/Annots陣列,按/Subtype /Link過濾,然後檢視/A /S /URI和/IsMap布林值。間接引用在每一步都會解引用,因此拆分出的 action dict 與內聯形式行為一致。
v3.56.11 2026-05-23
- ISO 14289-1 §7.6 要求每個 L(列表)結構元素攜帶明確
ListNumbering屬性。10030(reader 端)與LIST-NO-NUMBERING:N(writer 端)報告省略該屬性的 L 標籤。reader 端遍歷器解碼兩種/A形式(單一屬性字典,或字典與 revision 整數混合的陣列),並不區分 owner 尋找/ListNumbering鍵。writer 端檢查在已最終化的結構列表和仍開啟的標籤棧中檢視TPDFStructElem.Attributes中同名條目。 - ISO 32000-1 Table 347 規定的有效
ListNumbering值為None、Disc、Circle、Square、Decimal、UpperRoman、LowerRoman、UpperAlpha、LowerAlpha。審計只檢查鍵的存在,不關心選了哪個值 —— 每個 L 標籤都需要其中之一。
v3.56.10 2026-05-23
- PDF/UA-1 審計新增 ISO 14289-1 §7.21.6 TrueType 編碼規則。
10028報告/Encoding(或 Encoding 字典內的/BaseEncoding)既不是MacRomanEncoding也不是WinAnsiEncoding的非符號 TrueType 字型。10029報告攜帶任何/Encoding項的符號 TrueType 字型(§7.21.6 第四段禁止此項)。 - 符號 vs. 非符號透過 FontDescriptor
/Flagsbit 3(mask4)判定,複用子類 4 既有的UAFontDescriptorSymbolichelper。§7.21.6 第一段全文(嵌入的 TrueType 程式必須包含匹配的 cmap 項)需要解析 TrueType 字型程式,仍待實現;以上字典級規則是無需 TrueType 解析器即可驗證的實際層面。 - §7.21.6 中的 Differences 陣列規則(僅 AGL 字形名、Microsoft Unicode cmap 必須存在)出於同樣原因仍不在範圍內 —— 它們需要字型程式檢視。
v3.56.9 2026-05-23
- PDF/UA-1 審計新增完整的 ISO 14289-1 §7.18.4 檢查。
10027報告/StructParent透過結構樹的/ParentTree解析但未落到/S = Form結構元素上的 Widget 註解。之前 v3.56.7 的部分檢查(10026)只能捕獲完全缺少/StructParent的 Widget;新檢查透過跟隨 number-tree 指標並校驗目標標籤來完成規則。 - 新增的
NumberTreeLookuphelper 實現 ISO 32000-1 §7.9.7 的 number-tree 結構(扁平/Nums根、被/Limits限定範圍的中間/Kids)。未來需要解析/StructParents頁項或/PageLabels標籤的審計可以複用它。 - Widget 註解 Form-tag 驗證採用兩層模型:缺少
/StructParent的 Widget 報告為10026;/StructParent存在但未解析為/S = Form的 Widget 報告為更具體的10027。這避免了同一違規在兩個程式碼下被重複計數。
v3.56.7 2026-05-23
- 當 SetPDFUAMode 啟用並儲存文件時,任何
TrapNet註解項現在會從每頁的/Annots陣列中自動刪除。ISO 14289-1 §7.18.2 禁止TrapNet註解;新的ApplyPDFUAStripTrapNet儲存時修復加入既有的ApplyPDFUATabOrder/ApplyPDFUAFormFieldTU/ApplyPDFUAAnnotContents/ApplyPDFUAEmbeddedAFRelationship家族,使 PDF/UA 模式文件不再靜默吐出TrapNet殘留。 - PDF/UA-1 審計新增部分 §7.18.4 檢查。
10026報告缺少/StructParent的 Widget 註解 — 沒有/StructParent的 Widget 無法從結構樹訪問,因此無法巢狀在Form結構標籤中。完整的結構性驗證(透過ParentTree解析/StructParent並確認父級/S為Form)留到後續 release。 - writer 端 GetPDFUADiagnostics 新增對應的
WIDGET-NO-STRUCTPARENT:Nissue。既有的 TRAPNET-ANNOT 訊息現在也會提示 SetPDFUAMode 在儲存時自動剝除它們。
v3.56.6 2026-05-23
- PDF/UA-1 審計新增兩項 ISO 14289-1 §7.4.2 標題層級檢查。
10024報告文件順序中第一個標題元素不是 H1(或 H)的情況。10025報告下降序列中標題級別跳躍的次數(例如 H1 後直接跟 H3 而沒有 H2)。兩項檢查共享單次結構樹先序遍歷,解碼巢狀的/K形式(單個 StructElem、StructElem / IndRefs / MCRs 陣列)。 - writer 端 GetPDFUADiagnostics 新增對應的
FIRST-HEADING-NOT-H1issue,與 reader 端10024平齊。之前存在的 HEADING-LEVEL-SKIP writer 檢查現在有了配套,也能捕獲“首個標題是 H2”這類問題。
v3.56.5 2026-05-23
- 當 SetPDFUAMode 啟用且文件隨後被加密時,加密許可權鍵(encrypt 字典中的
/P)現在會自動置位 bit 10(mask$200,“為無障礙提取文字和圖形”),即使呼叫方未在傳給 Encrypt 的TPDFExtraPermissions中包含ppCanCopyAccess。ISO 14289-1 §7.16 要求每個加密合規檔案都允許無障礙提取,否則該位很容易遺漏。設定該位始終安全 —— 它僅授予輔助技術額外訪問許可權,不影響其他提取路徑。 - writer 端 GetPDFUADiagnostics 新增
ENCRYPT-NO-ACCESSissue,當 PDFUAMode 開啟且 encrypt 字典的/Pbit 10 被清除時觸發。這能捕捉呼叫順序邊界情況:使用者先呼叫Encrypt()然後才呼叫 SetPDFUAMode —— 診斷會提示使用者重新呼叫Encrypt(),以便用修正後的/P重新 emit encrypt 字典。
v3.56.4 2026-05-23
- writer 端 GetPDFUADiagnostics 新增五項 ISO 14289-1 檢查,使記憶體中的文件審計能捕獲與 reader 端 CheckFileCompliance ComplianceTest=2 審計相同的違規。
SUSPECTS-TRUE標記 MarkInfo/Suspects=true(§7.1:PDF/UA 合規檔案要求 Suspects=false)。ROLEMAP-STANDARD-REMAP:N標記會重對映標準結構標籤的 AddRoleMap 呼叫 —— §7.1 禁止重對映標準標籤。DC-TITLE-MISSING標記空的 XMP dc:title(獨立於 DOCINFO-TITLE-MISSING,後者檢查 /Info /Title)。TRAPNET-ANNOT:N標記 TrapNet 註解(§7.18.2 禁止)。ANNOT-PAGE-NO-TABS-S:N標記攜帶註解但頁字典 /Tabs 不是 /S 的頁(§7.18.3 要求這些頁採用基於結構樹的 tab 順序)。 - writer 端與 reader 端的 PDF/UA-1 審計現在大致平齊:reader 端審計在儲存檔案上丟擲的每個 issue 也可從記憶體診斷訪問,僅在每個函式的格式約定上有差異(換行分隔文字 vs. NNNNN-code 字串列表)。
v3.56.3 2026-05-23
- PDF/UA-1 審計新增 §7.21 字型檢查。
10020報告任何 FontDescriptor 缺少FontFile/FontFile2/FontFile3的非 Standard-14 字型(§7.21.4.1:每個被渲染的字型必須嵌入其程式)。10021報告缺少/CIDToGIDMap項的 CIDFontType2 後代(§7.21.3.2)。10022指出在未嵌入程式的情況下被引用的 Standard 14 字型(Helvetica、Times、Courier、Symbol、ZapfDingbats 及粗體 / 斜體變體)—— §7.21.4 NOTE 5 明確這些字型不豁免嵌入。10023報告缺少/ToUnicodeCMap 且不匹配 §7.21.7 豁免列表(預定義 MacRoman / MacExpert / WinAnsi encodings、採用 Adobe-GB1 / CNS1 / Japan1 / Korea1 字元集合的 Type 0、非符號 TrueType)的字型。 - Composite Type 0 字型在兩個層面檢視:Type 0 父字典自身的
/ToUnicode,以及第一個後代 CIDFont 上的嵌入 //CIDToGIDMap。Type 3 字型跳過嵌入檢查(其字形為內聯 CharProcs),但仍參與/ToUnicode檢查。 - 用於類似字型工作的 PDFlibPDFA helper 有意未共享 —— 六七個短例程(subset 字首剝離、Standard-14 名稱表、FontFile 存在性、Symbolic flag)作為
UA*helper 在本地複製,讓 PDF/A 審計能繼續演進而不破壞 PDF/UA,反之亦然。
v3.56.2 2026-05-23
- PDF/UA-1 審計新增五項 ISO 14289-1 檢查,覆蓋註解、嵌入檔案和可選內容。
10015報告缺少非空/Contents替代描述的 Link 註解(§7.18.5),以便螢幕閱讀器宣告連結目標。10016與10017標記缺少必需/F或/UF檔名鍵的嵌入檔案 FileSpec 字典(§7.11)。10018標記省略非空/Name文字字串的可選內容配置字典(§7.10)。10019標記含有停用/AS鍵的可選內容配置字典(§7.10)。 - 已經驅動 TrapNet 和
/Tabs /S檢查的逐頁註解遍歷現在在同一次遍歷中收集 Link //Contents資料,保持審計在物件數上的 O(N)。
v3.56.1 2026-05-23
- PDF/UA-1 審計新增五項 ISO 14289-1 檢查。
10010校驗加密檔案上的無障礙提取許可權(加密/P鍵的 bit 10)(§7.16)。10011透過 XFA XDP 包內的<dynamicRender>required</dynamicRender>元素檢測動態 XFA 表單(§7.15)。10012標記攜帶/Ref項的 Form XObject —— reference XObject 被停用(§7.20)。10013標記TrapNet註解(§7.18.2)。10014遍歷每頁並報告任何攜帶註解但頁字典未設定/Tabs /S的頁(§7.18.3),以便 tab 順序跟隨結構樹。 - 全部五個新程式碼透過上一 release 新增的同一對 CheckFileCompliance + GetStringListItem handle 流動 —— 無新增公開 API 介面。
v3.56.0 2026-05-23
- 新增 reader 端審計
CheckCompliancePDFUA,針對 ISO 14289-1(PDF/UA-1)驗證外部 PDF。它透過接受任意輸入 PDF(自身輸出、掃描器輸出、第三方內容)並按 CheckFileCompliance 已有的 PDF/A 報告方式列出 PDF/UA-1 違規,補充既有的 GetPDFUADiagnostics writer 端檢查。 - CheckFileCompliance 現在接受
ComplianceTest = 2來執行新的 PDF/UA-1 審計。ComplianceTest = 1下的 PDF/A 測試保持不變,issue 列表仍透過既有的 GetStringListCount / GetStringListItem handle 對迴流。 - 首版覆蓋 §5(XMP
pdfuaid:part標識)與 §7.1(Catalog/Metadata流、tagged-PDF 標記、結構樹、viewer title 偏好、文件語言、XMPdc:title、/Suspects值,以及禁止重對映標準結構標籤)的基礎 PDF/UA-1 合規門檻。發出八個診斷程式碼 ——10001至10009—— 在數字範圍上與 PDF/A00xxx程式碼視覺區分。 - 更深的 PDF/UA-1 條款(安全、註解、XObject、字型子集化)追蹤到基於同一審計框架的後續補丁 release。
v3.55.6 2026-05-22
- 每個新生成的 XMP 包現在都攜帶 xmpMM:InstanceID 屬性,格式為 uuid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。識別符號透過 Win32 CoCreateGuid 生成,按 ISO 19005-1 §6.7.2 (Cor2) 與 PDF/A 最佳實踐指南的推薦,為每個生成的文件賦予一個唯一、版本無關的指紋。非 Windows 建置(其 XMP 包保持為空)不受影響。
- xmpMM 名稱空間(http://ns.adobe.com/xap/1.0/mm/)現在是 XMP 包 SelectionNamespaces 的一部分;新的 SetXMPMM 與 GenerateInstanceID helper 支撐 InstanceID 發射,併為未來的 xmpMM:History / xmpMM:DerivedFrom 支援奠定基礎。
- 本 release 未新增 PDF/A Extension Schema description schema(pdfaExtension / pdfaSchema / pdfaProperty / pdfaType / pdfaField)。編寫自定義 extension schema 需要超出當前 SetDublinCore / SetXMPBasic 形狀的多步 bag / seq / 結構化屬性構造;這項工作追蹤到未來 release。需要宣告自定義 XMP 屬性的文件繼續回退到 LoadFromString 路徑。
v3.55.5 2026-05-22
- PDF/A 文件的註解 /F 標誌現在在儲存時被規範化。ISO 19005-1 §6.5.3 要求每個註解的 Print 位為 1 且 Hidden / Invisible / NoView 位為 0;writer 現在在儲存時應用該掩碼,呼叫方無需記憶位佈局。/Subtype /Popup 情況豁免 —— popup 是其他註解的子項,傳統上不列印。
- 當文件處於任何 PDF/A 模式時,AcroForm /NeedAppearances 標誌現在在儲存時強制設為 false。ISO 19005-1 §6.9 要求該標誌缺失或為 false;之前 writer 保留呼叫方設定的任何值,產生的文件會要求 viewer 在開啟時重新生成 appearances,並在呼叫方將其設為 true 時靜默違反 spec。該修復同樣作用於之前缺失該標誌的文件 —— writer 明確 emit /NeedAppearances false,給驗證器留下零歧義。
v3.55.4 2026-05-22
- AddStandardFont 現在在 PDF/A 模式下拒絕呼叫。ISO 19005-1 §6.3.4 撤銷了 PDF reference 中 “Standard 14 可不嵌入” 的豁免:合規檔案中的每個字型程式都必須嵌入,且本庫不打包 Standard 14 輪廓。門面層靜默返回 0;呼叫方應改用 AddTrueTypeFont 或 AddType1Font 配真實字型檔案。
- AddTrueTypeFont 現在在 PDF/A 模式啟用時把 Embed=0(不嵌入)靜默升級為 Embed=1(嵌入完整字型)。非嵌入引用路徑產生的 PDF 依賴 viewer 對系統 Arial / Times / Courier 安裝的字型回退,違反 ISO 19005-1 §6.3.4。已請求嵌入(Embed=1 或 2)的既有呼叫方不受影響。
- 非符號 TrueType /Encoding 合規檢查(ISO 19005-1 §6.3.7 Cor2 要求 WinAnsi 或 MacRoman 作為 encoding 名或 BaseEncoding,不帶 /Differences)本 release 未新增,因為本庫對非符號 TrueType subset 已經 emit /WinAnsiEncoding,而更深的執行需要跟蹤 subset 路徑上的 symbolic-vs-non-symbolic 派發。CheckCompliancePDFA 00034 / 00035(v3.51.0 新增)會在驗證時標記任何不合規的輸出。
v3.55.3 2026-05-22
- TrueType 支援的 CIDFontType2 字型字典現在明確攜帶 /CIDToGIDMap /Identity。ISO 19005-1 §6.3.3.2 (Cor2) 要求每個嵌入的 Type 2 CIDFont 必須存在該項;PDF reference 允許隱式 Identity 預設,但 PDF/A 要求明確值。writer 之前完全省略該鍵,導致 veraPDF(以及 v3.51.0 新增的 CheckCompliancePDFA 00033)標記檔案。/Identity 名稱匹配 writer 已經隱式產生的 GID-as-CID 佈局,所以既有文件渲染完全一致。
- FontDescriptor /CharSet(用於 Type 1 subset)與 /CIDSet(用於 CIDFont subset)仍為 TODO;writer 需要跟蹤哪些字形名 / CID 進入 subset 才能準確填充它們。CheckCompliancePDFA 00031 與 00032(同樣在 v3.51.0 新增)會標記其缺失,讓使用者在驗證時看到問題。
v3.55.2 2026-05-22
- AddImageDirectFromString 現在在入口拒絕與 PDF/A 不相容的 filter。傳入 Filter = 'LZWDecode' 在每個 PDF/A 部分都被拒絕(ISO 19005-1 §6.1.10 加上等價的 ISO 19005-2 / -3 規則)。傳入 Filter = 'JBIG2Decode' 或 'JPXDecode' 在 PDF/A-1(模式 1 和 2)下被拒絕。PDF/A-2 與 PDF/A-3 在 ISO 19005-2 §6.2.8.3 下允許 JPXDecode,但有子規範約束(顏色通道數、位深一致性、METH/APPROX 要求)writer 端門禁不強制 —— 這些模式下的呼叫方仍需自行確保 JPEG 2000 流合規。請求停用 filter 時門面層靜默返回 0。
- 透過 AddImageFromFile / AddImageFromStream 載入的 TIFF、PNG、JPEG 和 JPEG 2000 輸入不受影響:匯入器解壓源位元組並用 FlateDecode(JPEG 負載用 DCTDecode)重新編碼,因此 LZW 輸入永遠不會傳播到輸出 Filter 鏈。v3.50.0 新增的 CheckCompliancePDFA 驗證器(00004)和 v3.52.0 新增的(00022、00023)為任何仍把停用 filter 間接滑入輸出的路徑提供驗證時的第二道防線。
v3.55.1 2026-05-22
- AddLinkToHideField 現在在 PDF/A 模式下拒絕呼叫。上一 release 留有註釋聲稱該 action 相容 PDF/A,但 ISO 19005-1 Cor2 已把 /Hide 加入停用 action 列表(§6.6.1),ISO 19005-2 / -3 繼承該限制。門面層在 PDF/A 模式被呼叫時靜默返回 0,與 AddLinkToJavaScript 和 AddLinkToImportData 一致。
- AddSWFAnnotationFromFile 現在在 PDF/A 模式下拒絕呼叫。SWF / RichMedia 註解封裝了 Flash 媒體,被 ISO 19005-1 §6.5.2 禁止(不允許 Movie / Sound 子型別),並被 ISO 19005-2 §6.3.1 加強(不允許 3D / Sound / Screen / Movie)。門面層靜默返回 0。
- AddEmbeddedFile 與 AddLinkToEmbeddedFile 現在在 PDF/A-1 與 PDF/A-2 模式下拒絕呼叫。ISO 19005-1 §6.1.11 禁止 /EF,ISO 19005-2 §6.8 僅允許嵌入 PDF/A 檔案;與其遞迴驗證附加負載的 PDF/A 合規性,writer 在這些模式下直接拒絕呼叫。PDF/A-3(SetPDFAMode 5 或 6)仍被允許 —— 見 v3.55.0 的自動 /AFRelationship 注入。
- SetOpenActionMenu 現在在文件處於 PDF/A 模式時拒絕 {NextPage, PrevPage, FirstPage, LastPage} 白名單外的 MenuItem 值。ISO 19005-1 §6.6.1 把命名 action 限制在該集合,因此之前 API 靜默產生 veraPDF 會拒絕的不合規 Find / Print / FullScreen Open-Action 字典。
- NewOptionalContentGroup 現在在 PDF/A-1 模式(SetPDFAMode 1 或 2)下拒絕呼叫。ISO 19005-1 §6.1.13 禁止 Catalog /OCProperties 鍵。PDF/A-2(模式 3/4)與 PDF/A-3(模式 5/6)在各自 §6.9 的約束下允許可選內容,因此門禁僅對 PDF/A-1 觸發。
v3.55.0 2026-05-22
- PDF/A-3 文件現在自動在每個嵌入檔案上接收 /AFRelationship 項。之前用本庫建立的 PDF/A-3 檔案可能因 ISO 19005-3 Annex E, Table E.1 要求每個嵌入檔案規範上必須有 AFRelationship 而驗證失敗。writer 現在在儲存時給任何缺少該項的 FileSpec 字典注入配置的預設值(開箱即 'Unspecified'),映象之前引入的 PDF/UA AFRelationship 自動注入。僅 PDF/A-3 模式(SetPDFAMode 5 = PDF/A-3b 或 6 = PDF/A-3a)觸發自動注入;PDF/A-1 與 PDF/A-2 仍按 ISO 19005-1 §6.1.11 與 ISO 19005-2 §6.8 直接拒絕嵌入檔案。
- SetPDFA3DefaultAFRelationship 是新增 API,覆蓋 writer 在嵌入檔案缺少 /AFRelationship 項時寫入的預設值。接受 ISO 19005-3 Table E.1 的值 'Source'(嵌入檔案是產生 PDF 內容的源材料)、'Data'(檔案是支撐視覺表格或圖表的結構化資料)、'Alternative'(替代呈現,例如音訊版本)、'Supplement'(補充呈現,例如方程的 MathML 形式)、'Unspecified'(關係無法由上述描述),或任何已註冊的二類名。空字串重置為 'Unspecified'。每檔案覆蓋仍可透過 SetEmbeddedFileAFRelationship 使用。
- 新 API 在 Delphi 門面上以 TPDFlib.SetPDFA3DefaultAFRelationship 暴露,並透過 DLL 以 DLSetPDFA3DefaultAFRelationship(PWideChar)與 DLSetPDFA3DefaultAFRelationshipA(PAnsiChar)暴露。
v3.54.0 2026-05-22
- LoadOutputIntentProfile 是新增 API,用從磁碟載入的外部 ICC profile 替換打包的 sRGB OutputIntent profile。在 DeviceCMYK 或 DeviceGray 顏色空間下生產 PDF/A 文件時必需,因為本庫僅打包 sRGB profile。典型用法是先呼叫 SetPDFAMode(初始化 OutputIntent 骨架),然後 LoadOutputIntentProfile('C:\\path\\to\\FOGRA39.icc', 'DeviceCMYK') 來替換 profile 位元組並把文件標記為新顏色空間。成功返回 1,檔案未找到或未知顏色空間返回 0。在 Delphi 門面上以 TPDFlib.LoadOutputIntentProfile 暴露,並透過 DLL 以 DLLoadOutputIntentProfile(PWideChar 形式)與 DLLoadOutputIntentProfileA(PAnsiChar 形式)暴露。ISO 19005-1 §6.2.2 允許 DestOutputProfile 流中使用任何註冊的 ICC profile。
- SetFillColorCMYK、SetTextColorCMYK、SetTextHighlightColorCMYK、SetTextUnderlineColorCMYK、AddSeparationColor、SetFillColorSep、SetLineColorSep、SetTextHighlightColorSep 與 SetTextColorSep 現在在文件 OutputIntent profile 為 DeviceCMYK 時在 PDF/A 模式下成功。之前這些 API 在 PDF/A 模式下無論 OutputIntent 如何都拒絕每個呼叫,導致無法生產合規的 CMYK 文件。門禁現在是 PDFAMode = 0 或 OutputIntentColorSpace = 'DeviceCMYK',匹配 ISO 19005-1 §6.2.3.3 關於 OutputIntent 使用 CMYK profile 時允許 DeviceCMYK 的規則,以及 ISO 19005-1 §6.2.3.4 允許基礎顏色空間也合規的 Separation 替代色。
- SetTextShader 現在在 OutputIntent profile 為 DeviceRGB 或 DeviceCMYK 時在 PDF/A 模式下成功。shader 本身並未被 PDF/A 禁止;驗證器(reader 端)校驗 shader 的內部顏色空間與 OutputIntent 匹配。之前的嚴格拒絕行為拒絕了合規的 shader 使用。
- CMYK / Separation / Shader 解封依賴 AddOutputIntent 與 LoadOutputIntentProfile(v3.53.0 引入)設定的 OutputIntentColorSpace 標籤。呼叫 SetPDFAMode 而不呼叫 LoadOutputIntentProfile 保持顏色空間為 DeviceRGB(打包的 sRGB profile),因此 CMYK 呼叫仍預設拒絕 —— 新行為透過 LoadOutputIntentProfile 主動啟用。
v3.53.0 2026-05-22
- OutputIntent 字典現在攜帶 ISO 19005-1 §6.2.2 與 Adobe Acrobat preflight 推薦的完整 PDF/A 骨架欄位:/OutputCondition(人類可讀的顏色條件描述)、/Info(長形識別文字)、/RegistryName(註冊中心 URL,預設為 http://www.color.org)。這些值對遺留單引數呼叫點預設為 "sRGB IEC61966-2.1" / "sRGB IEC61966-2.1" / "http://www.color.org";新的 AddOutputIntent 過載直接接受這四個自定義欄位,讓呼叫方為自己的顏色條件填充。
- AddOutputIntent 新增五引數過載:AddOutputIntent(ColorSpace, OutputConditionIdentifier, OutputCondition, Info, RegistryName)。遺留單引數形式繼續工作不變;現在它委託給新過載並傳入 sRGB 預設。ColorSpace 引數也選擇寫入嵌入 ICC profile 字典的 /N 分量數(DeviceRGB 為 3,DeviceCMYK 為 4,DeviceGray 為 1);嵌入的 profile 本身仍是打包的 sRGB 流,直到即將到來的 LoadOutputIntentProfile API 在 v3.54.0 釋出。
- TPDFDocument 暴露 OutputIntentColorSpace 作為讀/寫屬性,跟蹤最後一次 AddOutputIntent 呼叫的顏色空間。這成為 v3.54.0 中 CMYK / Separation / Shader writer 端限制的門禁條件,今天在 PDF/A 模式下拒絕每個呼叫的顏色 API 將只在顏色空間與 OutputIntent 不匹配時拒絕。
v3.52.0 2026-05-22
- CheckCompliancePDFA 現在審計註解、graphics-state、action 和 form XObject,完成 PDF/A 讀端驗證器對 ISO 19005-1 第 6.2-6.6 章節與等價 PDF/A-2/-3 差異規則的覆蓋。驗證器報告 14 個新 issue 類(00050-00067):停用的註解子型別(00050;ISO 19005-1 §6.5.2 在 PDF/A-1 下禁止 FileAttachment / Sound / Movie,ISO 19005-2 §6.3.1 在 PDF/A-2 與 PDF/A-3 下禁止 3D / Sound / Screen / Movie)、註解 /CA 不等於 1.0(00051;§6.5.3)、註解 /F 缺失或 Print=0 / Hidden=1 / Invisible=1 / NoView=1(00052;§6.5.3,/Subtype /Popup 豁免)、註解 /AA(00054;§6.6.2)、註解 appearance dict 包含 /N 以外的鍵或不合規的 /N 值(00055;§6.5.3 Cor2)、Widget 註解帶 /A(00056;§6.9)、ExtGState /TR(00058;§6.2.8)、ExtGState /TR2 不等於 /Default(00059;§6.2.8),僅 PDF/A-1:ExtGState /SMask 不等於 /None(00061;§6.4)、/BM 不為 Normal 或 Compatible(00062;§6.4)、/CA 或 /ca 不等於 1.0(00063;§6.4)。
- Action-anywhere 審計(00064、00065)以全面掃描替代 v3.50.0 中僅檢查 OpenAction 的做法,無論 action 位於何處(註解 /A、widget /A、outline /A、catalog /OpenAction 等),都標記停用的 /S action 值(Launch、Sound、Movie、ResetForm、ImportData、JavaScript、Hide、SetState、NOP、Trans、GoTo3DView、Rendition、SetOCGState)以及 /N 不在 {NextPage, PrevPage, FirstPage, LastPage} 集合內的命名 action。ISO 19005-1 §6.6.1。
- XObject 審計(00066、00067)報告 PostScript 和 Reference XObject,外加 Form XObject 的停用鍵(/OPI、/PS、/Subtype2 = /PS)和 Image XObject 的停用鍵(/Alternates、/OPI、/Interpolate true)。ISO 19005-1 §6.2.4 - §6.2.7。
v3.51.0 2026-05-22
- CheckCompliancePDFA 現在除 v3.50.0 新增的結構性檢查外,還審計字型與顏色空間一致性。驗證器報告九個新 issue 類:至少一個字型程式未嵌入(00030;ISO 19005-1 §6.3.4 要求每個字型程式,包括 Standard 14 替代,必須嵌入)、Type 1 subset 在其 FontDescriptor 中缺少 /CharSet(00031;§6.3.5)、CIDFont subset 缺少 /CIDSet(00032;§6.3.5)、CIDFontType2 缺少 /CIDToGIDMap(00033;§6.3.3.2 Cor2)、非符號 TrueType 帶不合規 /Encoding(00034;§6.3.7 Cor2 要求 WinAnsi/MacRoman 直接作為名稱或 BaseEncoding,不帶 /Differences)、符號 TrueType 仍攜帶 /Encoding(00035;§6.3.7 Cor2)、PDF/A-Na 或 PDF/A-Nu 文件中至少一個字型缺少 /ToUnicode(00036;應用 §6.3.8 四類豁免)、ICCBased 顏色空間未嵌入其 profile 流(00037;§6.2.3.2)、檔案同時使用 DeviceRGB 與 DeviceCMYK(00038;§6.2.3.3 禁止混用)。
- /ToUnicode 檢查(00036)僅對一致性級別 A 與 U 生效,因為只有這些級別按 ISO 19005-1 §6.3.8 與 ISO 19005-2 §6.2.11.7 要求 Unicode 對映。Level B 檔案(PDF/A-1b、PDF/A-2b、PDF/A-3b)不被標記。四類豁免識別預定義 encoding(MacRomanEncoding、MacExpertEncoding、WinAnsiEncoding)、Standard 14 Type 1 BaseFonts 作為 Adobe Standard Latin / Symbol 字形名字型的代理,以及後代 CIDFont 使用 Adobe-GB1、Adobe-CNS1、Adobe-Japan1 或 Adobe-Korea1 註冊中心的 Type 0 字型。
- 字型審計遍歷每個 Font 字典,按 Subtype(Type1、MMType1、TrueType、Type3、Type0 及其後代 CIDFontType0 或 CIDFontType2)分類,然後派發相關檢查。Type 0 composite 字型把嵌入和 subset 檢查委託給其後代 CIDFont,同時把 /ToUnicode 保留在 Type 0 包裝層。Subset 檢測使用標準的六個大寫字母字首約定。
v3.50.0 2026-05-22
- CheckCompliancePDFA 現在報告驗證器之前漏掉的 15 項 PDF/A 不合規問題:缺少 trailer /ID 陣列(00013)、缺少 Document Catalog /Metadata 流(00014)、/Filter 應用到 /Metadata 流(00015)、流字典透過 /F、/FFilter 或 /FDecodeParms 引用外部檔案(00016)、PDF/A-1 文件中透過任何檔案規範字典的 /EF 或透過 Name tree /EmbeddedFiles 項宣告的嵌入檔案(00017、00018)、/OpenAction 指向停用 action 型別(00019)、Document Catalog 或任何 Page 中的 /AA additional-action 字典(00020、00021)、PDF/A-1 文件中的 JBIG2Decode 或 JPXDecode filter(00022、00023)、/Name 不為 /Identity 的 Crypt filter(00024)、Document Catalog 中的 /Requirements(00025)、鍵不為 /UR3 與 /DocMDP 的 /Perms(00026),以及 /AcroForm /NeedAppearances 設為 true(00027)。驗證器現在按 ISO 19005-1 §6.6.1 標記停用的 Catalog /OpenAction action 型別(/Launch、/Sound、/Movie、/ResetForm、/ImportData、/JavaScript、/Hide、/SetState、/NOP、/Trans、/GoTo3DView、/Rendition、/SetOCGState)以及 /N 不在 {NextPage, PrevPage, FirstPage, LastPage} 白名單內的命名 action。
- PDFAID parser 接受 U 一致性字尾(PDF/A-2U、PDF/A-3U)與既有的 A、B 變體並列,因此 CheckCompliancePDFA 在掃描其他工具產生的 PDF/A-2U 或 PDF/A-3U 檔案時不再丟擲虛假的 "00005 PDFA Mark NOT Found or invalid" 警告。ISO 19005-2:2011 新增的 Unicode 對映一致性級別現在被驗證器識別。
- Filter 特定檢查(JBIG2Decode、JPXDecode)與嵌入檔案檢查(/EF、/EmbeddedFiles)仍限定為 PDF/A-1,因為 ISO 19005-2 §6.2.8.3 與 §6.8 明確放寬了 PDF/A-2 與 PDF/A-3 的這些限制。文件結構檢查(/Metadata、/AcroForm /NeedAppearances、/OpenAction、/AA、/Requirements、/Perms)適用於每個 PDF/A 部分。
v3.49.0 2026-05-21
- AddLinkToImportData 建立一個 Link 註解,其 action 是 PDF 匯入資料動作(/S /ImportData),使用者點選連結時從外部 FDF 檔案填充文件的 AcroForm 欄位(ISO 32000-1 §12.6.4.8, Table 198)。FileName 引數以檔案規範字典形式引用,路徑規範化規則與 AddLinkToFile / AddLinkToFileEx 一致(按 ISO 32000-1 §7.11.2.1 將反斜槓轉換為正斜槓)。Options 位 0 控制是否顯示邊框,位 1–3 選擇連結高亮模式(Invert、Outline、Push),與既有的 AddLinkTo* 約定一致。PDF 1.4 或更高版本。PDF/A 模式下不允許,因為該 action 引用了外部資源;門面層在 PDF/A 模式下被呼叫時靜默返回 0。在 Delphi 庫及 DLL 介面中以 DLAddLinkToImportData / DLAddLinkToImportDataA(PWideChar 與 PAnsiChar 兩種形式)暴露。
v3.48.0 2026-05-21
- AddLinkToHideField 建立一個 Link 註解,其 action 是 PDF 隱藏動作(/S /Hide),使用者點選連結時切換一個或多個 AcroForm 欄位的可見性(ISO 32000-1 §12.6.4.10, Table 196)。FieldNames 接受一個或多個完全限定欄位名,以逗號、分號或換行分隔;單個名字以文字字串形式寫入 /T,兩個及以上以陣列形式寫入 /T,spec 允許兩種形式。HideFlag 選擇可見性方向:非零值隱藏列出的欄位(/H true),零值顯示欄位(/H false)。Options 位 0 控制是否顯示邊框,位 1–3 選擇連結高亮模式(Invert、Outline、Push),與 AddLinkToWeb / AddLinkToNamedAction 一致。PDF 1.2 或更高版本。因為不引用外部資源,所以相容 PDF/A。在 Delphi 庫及 DLL 介面中以 DLAddLinkToHideField / DLAddLinkToHideFieldA(PWideChar 與 PAnsiChar 兩種形式)暴露。
v3.47.0 2026-05-21
- AddLinkToNamedAction 建立一個 Link 註解,其 action 是 PDF 命名動作(/S /Named),觸發 ISO 32000-1 §12.6.4.11, Table 194 定義的四個標準 viewer 導航命令之一:NextPage、PrevPage、FirstPage、LastPage。NamedActionType 引數選擇命令(0=NextPage,1=PrevPage,2=FirstPage,3=LastPage);越界值回退到 NextPage,確保 writer 總是寫出符合 spec 的 /N 名稱。Options 位 0 控制是否顯示邊框,位 1–3 選擇連結高亮模式(Invert、Outline、Push),與既有的 AddLinkToWeb / AddLinkToPage 約定一致。註解需要 PDF 1.1 或更高版本,因為不引用外部資源,所以相容 PDF/A。在 Delphi 庫及 DLL 介面中提供。
v3.46.1 2026-05-21
- AddCaretAnnotation 在給定矩形位置建立一個 caret 標記註解(PDF /Subtype /Caret),用於標記頁面上文字或內容被插入、省略或需要審閱者關注的位置。透過 SymbolType(0 / 1)支援兩種符號型別(None 和 Paragraph),並可配置顏色、不透明度、標題、內容以及建立/修改時間戳。定義見 ISO 32000-1 §12.5.6.11。PDF 1.5 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- 本條目完成了從 v3.44.0 Square+Circle 開始的幾何註解補齊工作。PDFlibPas 現已能建立 Text、Stamp、FreeText、TextMarkup(Highlight/Underline/Squiggly/StrikeOut)、Square、Circle、Line、Polygon、PolyLine、Ink 和 Caret 等多種註解,外加已有的 Link、FileAttachment、SVG、U3D 和 SWF 支援。
v3.46.0 2026-05-21
- AddInkAnnotation 建立一個 ink 標記註解(PDF /Subtype /Ink),表示在頁面上繪製的手寫筆畫或自由形狀標記。筆畫作為單一字串傳入,多筆畫間用 '|' 或換行分隔,每個筆畫內部的座標對採用與 AddPolygonAnnotation 相同的空格/逗號/分號/製表符格式。例如 "100 100 110 105 120 110 | 200 200 210 205" 描述兩條獨立筆畫。支援可配置的邊框寬度、ink 顏色、不透明度、標題、內容以及時間戳。定義見 ISO 32000-1 §12.5.6.13。PDF 1.3 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- 每條筆畫必須含偶數個數值(至少四個),否則呼叫返回 0 且不寫入任何註解。/Rect 根據所有筆畫的合併範圍自動計算,並加上少量內邊距以確保筆畫始終位於註解包圍盒內。
v3.45.0 2026-05-21
- AddPolygonAnnotation 建立一個閉合多邊形標記註解(PDF /Subtype /Polygon),頂點以空格、逗號、分號或製表符分隔的座標對字串形式傳入(例如 "100 100 200 100 200 200 100 200")。支援可配置的邊框寬度、邊框顏色、可選的內部填充顏色、不透明度、標題、內容以及時間戳。定義見 ISO 32000-1 §12.5.6.9。PDF 1.5 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- AddPolyLineAnnotation 建立一個開放折線標記註解(PDF /Subtype /PolyLine),採用相同的頂點字串格式,並可在兩端配置端點樣式(None、Square、Circle、Diamond、OpenArrow、ClosedArrow、Butt、ROpenArrow、RClosedArrow、Slash)。定義見 ISO 32000-1 §12.5.6.9。PDF 1.5 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- 兩種註解都至少需要兩個頂點(四個數)且數值總數為偶數;如果頂點字串無法解析為有效配對列表,呼叫返回 0。/Rect 根據頂點範圍加上與邊框寬度成比例的內邊距計算,確保端點裝飾保持可見。
- 兩種註解在文件最低版本被鎖定到更低值時,emit 時會將文件版本自動 bump 到 PDF 1.5。
v3.44.1 2026-05-21
- AddLineAnnotation 建立一條 line 標記註解(PDF /Subtype /Line),連線兩個端點,可配置邊框寬度、線條顏色、可選的內部填充顏色、兩端的端點樣式(None、Square、Circle、Diamond、OpenArrow、ClosedArrow、Butt、ROpenArrow、RClosedArrow、Slash)、不透明度、標題、內容以及建立/修改時間戳。定義見 ISO 32000-1 §12.5.6.7。PDF 1.3 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- 註解的 /Rect 根據兩個端點加上與邊框寬度成比例的內邊距計算,確保端點裝飾保持在註解包圍盒內。
v3.44.0 2026-05-21
- AddSquareAnnotation 在給定矩形位置建立一個矩形標記註解(PDF /Subtype /Square),可配置邊框寬度、邊框顏色、可選的內部填充顏色、不透明度、標題、內容以及建立/修改時間戳。定義見 ISO 32000-1 §12.5.6.8。PDF 1.3 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- AddCircleAnnotation 建立一個內切於給定矩形的橢圓標記註解(PDF /Subtype /Circle),其可配置的邊框、填充、不透明度、標題、內容以及時間戳與 AddSquareAnnotation 一致。定義見 ISO 32000-1 §12.5.6.8。PDF 1.3 或更高版本。在 Delphi 庫及 DLL 介面中提供。
- 兩種新註解在文件最低版本被鎖定到更低值時,emit 時會自動 bump 到 PDF 1.3,並 emit 標準的標記註解欄位集(/Type /Subtype /Rect /C /IC /BS /Border /CA /F /M /CreationDate /NM /T /Contents /Subj /P),因此 Acrobat、Foxit 和 Edge 既有的審閱工作流都可以在建立後繼續編輯這些註解。
v3.43.0 2026-05-20
- SetStructElemSpaceBefore 與 SetStructElemSpaceAfter 在當前開啟的結構元素上設定 /SpaceBefore 與 /SpaceAfter 屬性(Layout owner),以點為單位表達塊級元素前後的間距。定義見 ISO 32000-1 §14.8.5.4.2 Table 340。在 Delphi 庫、ActiveX(Dispid 73008051/73008052)和 DLL 介面中提供。
- SetStructElemStartIndent 與 SetStructElemEndIndent 在當前開啟的結構元素上設定 /StartIndent 與 /EndIndent 屬性(Layout owner),以點為單位表達從內容矩形寫入方向相關的起始與結束邊的縮排距離。定義見 ISO 32000-1 §14.8.5.4.2 Table 340。在 Delphi 庫、ActiveX(Dispid 73008053/73008054)和 DLL 介面中提供。
- SetStructElemColor 設定 /Color 屬性(Layout owner)為一個 RGB 三元組(每個分量 0.0-1.0),描述元素的前景色,用於重排引擎和下游色彩對比度檢查器。定義見 ISO 32000-1 §14.8.5.4.2 Table 340。在 Delphi 庫、ActiveX(Dispid 73008055)和 DLL 介面中提供。
- 修復了 BuildStructElemDictRef 中的序列化 bug:單 token 數字屬性值(如 SpaceBefore、SpaceAfter、StartIndent、EndIndent)原本被寫成 PDF 名字而不是 PDF 數字。修復同時適用於單 owner 和多 owner 屬性分支。
v3.42.0 2026-05-20
- CheckCompliancePDFA 現已正確校驗全部六種 PDF/A 模式(1a、1b、2a、2b、3a、3b)。PDFAID 檢查(程式碼 00005)接受六個有效 XMP 標記中的任意一個,而非僅 '1B'。版本上限檢查(00002)對 PDF/A-1 應用 1.4,對 PDF/A-2 與 PDF/A-3 應用 1.7。
- OCProperties 檢查(程式碼 00003)現在按條件應用:僅對 PDF/A-1 文件生效,因 PDF/A-1 禁止可選內容(圖層)。PDF/A-2 與 PDF/A-3 允許圖層,不再標記。
- 新增三項合規檢查:程式碼 00006 標記加密文件(所有 PDF/A 版本禁止加密);程式碼 00007 標記目錄中缺少 OutputIntents 項的文件(所有 PDF/A 版本要求該項);程式碼 00011 與 00012 標記一致性級別為 -a(無障礙)時缺少 MarkInfo 或 StructTreeRoot 的文件。
v3.41.0 2026-05-20
- PDF/A 模式現在在 API 層強制阻止停用操作。當任何 PDF/A 模式(1-6)啟用時,呼叫 SetEncryption、AddSeparationColor、SetFillColorCMYK、SetTextColorCMYK 或任何其他 CMYK/Separation/Shader API 都會返回 0 且無效果,與 PDF/A 要求單一 sRGB 輸出意圖的規定一致。
- PDF/A-1(模式 1 和 2)禁止透明度:SetTransparency、SetBlendMode 和 SetPageTransparencyGroup 在當前模式為 1 或 2 時返回 0 且為 no-op。PDF/A-2 與 PDF/A-3(模式 3-6)允許有限透明度,不受限制。
- 所有 PDF/A 模式(1-6)都禁止 JavaScript 動作:SetOpenActionJavaScript、PageJavaScriptAction、DocJavaScriptAction、AddGlobalJavaScript 和 AddLinkToJavaScript 在任何 PDF/A 模式啟用時都返回 0 且為 no-op。ISO 19005-1 §6.6.1 明確禁止 PDF/A 文件使用 JavaScript。
- 檔案附件 API(EmbedFile、AddFileAttachment)在 PDF/A-1 和 PDF/A-2 模式(1-4)下被阻止。在 PDF/A-3(模式 5 和 6)下仍可用,因為 PDF/A-3 明確允許任意嵌入檔案。
v3.40.0 2026-05-20
- SetPDFAMode 現已支援 PDF/A-2 與 PDF/A-3 一致性級別。NewMode=3 為 PDF/A-2b,4 為 PDF/A-2a,5 為 PDF/A-3b,6 為 PDF/A-3a。PDF/A-2 目標為 PDF 1.7,允許圖層、互動表單、JPEG2000 影像和有限透明度。PDF/A-3 在 PDF/A-2 基礎上額外允許任意嵌入檔案(任意 MIME 型別)。所有 -a 變體會自動寫入 /MarkInfo 與無障礙一致性級別所需的標籤化 PDF 結構標記。
- 修復:SetPDFAMode(1)(PDF/A-1a)原本因為 v3.20.0 引入的內部路由 bug 是 no-op,現已正確寫入 /MarkInfo 與 /OutputIntents,並設定 XMP pdfaid:part=1/conformance=A。
- GetInformation(201) 返回 '1' 至 '6',對應活動的 PDF/A 模式,與新的模式編號保持一致。
v3.39.0 2026-05-20
- SetStructElemWritingMode 在當前開啟的結構元素上設定 /WritingMode 屬性(Layout owner)。有效值為 LrTb(從左到右,拉丁文指令碼預設)、RlTb(從右到左,阿拉伯文和希伯來文)以及 TbRl(從上到下從右到左,傳統中日韓豎排文字)。定義見 ISO 32000-1 §14.8.5.4.2 Table 340。在 Delphi 庫、ActiveX(Dispid 73008049)和 DLL 介面中提供。
- SetStructElemListNumbering 在當前開啟的結構元素上設定 /ListNumbering 屬性(List owner)。支援的值包括 None、Disc、Circle、Square(無序標記)以及 Decimal、UpperRoman、LowerRoman、UpperAlpha、LowerAlpha(有序編號)。屬性設定在 L(list)元素上,使輔助技術能夠正確朗讀列表型別。定義見 ISO 32000-1 §14.8.5.3.2 Table 336。在 Delphi 庫、ActiveX(Dispid 73008050)和 DLL 介面中提供。
v3.38.0 2026-05-20
- SetStructElemColSpan 在當前開啟的結構元素上設定 /ColSpan 屬性(Table owner),指示單元格跨越的列數。定義見 ISO 32000-1 §14.8.5.7.2 Table 337。在 Delphi 庫、ActiveX(Dispid 73008047)和 DLL 介面中提供。
- SetStructElemRowSpan 在當前開啟的結構元素上設定 /RowSpan 屬性(Table owner),指示單元格跨越的行數。定義見 ISO 32000-1 §14.8.5.7.2 Table 337。在 Delphi 庫、ActiveX(Dispid 73008048)和 DLL 介面中提供。
- 兩個函式都是便捷封裝,等效於呼叫 AddTagAttribute 時傳入 Owner='Table' 與對應屬性名。它們補充了 SetStructElemScope,用於完整描述複雜或跨越式表頭表格中的單元格。
v3.37.2 2026-05-20
- GetPDFUADiagnostics 現在會在 N 個互動表單欄位(Widget 註解)缺少 TU(工具提示 / 無障礙名稱)項時報告 FORM-NO-TOOLTIP:N。ISO 14289-1 §7.18.4 要求所有互動表單欄位都攜帶 TU 項,以便欄位獲得焦點時輔助技術能向使用者朗讀欄位用途。/TU 是螢幕閱讀器朗讀的無障礙名稱;它與 /T 不同,後者是用於程式設計訪問與表單提交的部分欄位名。
v3.37.1 2026-05-20
- GetPDFUADiagnostics 現在會在 N 個 LI 或 LBody 結構元素出現在所需父元素之外時報告 LIST-STRUCT:N。ISO 32000-1 §14.8.4.4 要求 LI 是 L(列表)的直接子元素,LBody 是 LI(列表項)的直接子元素。列表巢狀畸形會導致輔助技術無法正確遍歷與朗讀列表內容,並可能在 PDF/UA-1 校驗器中觸發文件結構校驗失敗。
v3.37.0 2026-05-20
- BeginTagEx2 是新增 API,在單次呼叫中開啟一個結構元素並設定全部主要元素屬性。除 BeginTagEx 的 TagType、AltText、ActualText、Lang 引數外,BeginTagEx2 還接受 Title(/T,用於 Tags 導航面板)、ElemID(/ID,元素唯一標識)和 Expansion(/E,縮寫或首字母縮略詞的完整形式)。這三個新增引數中任意一個傳入空字串等同於省略對應的 setter。BeginTagEx2 減少了描述良好的元素的樣板程式碼 — 與其分別呼叫 BeginTagEx 再接 SetStructElemTitle、SetStructElemID 和 SetStructElemExpansion,現在可一次呼叫設定全部七個屬性。該函式在 Delphi 庫、ActiveX(Dispid 73008046)和 DLL 介面中提供。
v3.36.1 2026-05-20
- GetPDFUADiagnostics 現在會在 N 個 TH(表頭單元格)結構元素缺少 Scope 屬性時報告 TABLE-TH-NO-SCOPE:N。ISO 32000-1 §14.8.4.3.4 Table 337 將 Scope(Row、Column 或 Both)定義為描述某個表頭單元格作用於哪些資料單元格的屬性。缺少該屬性時,螢幕閱讀器和其他輔助技術無法在複雜或多層表頭表格中可靠地把表頭單元格與資料單元格關聯起來,而這正是 ISO 14289-1 §7.5 所要求的。在標記每個 TH 元素後立即呼叫 SetStructElemAttr('Table','Scope', 'Column')(或 'Row' / 'Both')。
v3.36.0 2026-05-20
- SetStructElemExpansion 是新增 API,在當前開啟的結構元素上設定 /E(展開文字)項(ISO 32000-1 §14.9.5)。展開文字是元素內縮寫或首字母縮略詞的完整拼寫形式 — 例如 Span 文字為 "WWW" 時展開為 "World Wide Web"。螢幕閱讀器會朗讀展開文字而非嘗試逐字元發音,這對技術與科學內容的無障礙性至關重要。PDF/UA-1(ISO 14289-1 §7.2)要求自然語言可被明確識別;/E 是處理縮寫和首字母縮略詞的標準機制。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.35.1 2026-05-20
- GetPDFUADiagnostics 現在會在文件資訊字典 /Title 項缺失或為空時報告 DOCINFO-TITLE-MISSING。PDF/UA-1(ISO 14289-1)要求文件具備標題,以便文件開啟時螢幕閱讀器能朗讀。既有的 DISPLAYDOCTITLE-FALSE 檢查確認 viewer 標題欄顯示該標題;DOCINFO-TITLE-MISSING 是互補檢查 — 它確認標題值本身已設定。透過呼叫 SetDocumentInfo('Title', ...) 提供該值。
v3.35.0 2026-05-20
- SetStructElemTitle 是新增 API,在當前開啟的結構元素上設定 /T(標題)項(ISO 32000-1 §14.7.2 Table 324)。該標題是標識具體元素例項的人類可讀標籤 — 例如 "Chapter 1"、"Summary Table" 或 "Figure 3: Quarterly Sales" — 顯示在 PDF viewer 的 Tags 導航面板中,並被無障礙修復工具使用。/T 不同於 /Alt(面向視力障礙使用者的替代文字)和 /ActualText(字形級文字校正);它在 Table、Figure、Form、Sect、Div 等非文字容器元素上最為實用。傳入空字串以清空已設定的值。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.34.0 2026-05-20
- SetStructElemAltText 是新增 API,在當前開啟的結構元素上設定 /Alt 項(ISO 32000-1 §14.9.3)。它等價於在 BeginTag 中傳入 AltText,但允許在元素開啟後設置或更新替代文字描述 — 當描述與元素型別分開計算時很有用。PDF/UA-1(ISO 14289-1 §7.5)要求 Figure 和 Formula 元素攜帶 Alt 文字;GetPDFUADiagnostics 已經會針對缺失值報告 FIGURE-NO-ALT:N。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.33.1 2026-05-20
- GetPDFUADiagnostics 現在包含 ROLEMAP-UNMAPPED:N 檢查,用於檢測文件中使用但未在 /RoleMap 字典中對映的自定義結構元素型別名。ISO 14289-1 §7.1 與 ISO 32000-1 §14.7.3 要求每個非標準結構型別必須對映到一個標準 PDF 型別(如 P、Span 或 Figure),以便輔助技術能夠判斷如何處理該元素。發現 N 個未對映型別時,問題描述包含型別名列表,便於呼叫方知道需要哪些 AddRoleMap 條目。ISO 32000-1 Table 333(PDF 1.7)定義的全部 49 種標準結構型別都會被識別並從報告中排除。
v3.33.0 2026-05-20
- SetStructElemLang 是新增 API,在當前開啟的結構元素上設定 /Lang 項(ISO 32000-1 §14.9.2)。該語言標籤覆蓋 SetDocumentLanguage 或 SetPDFUAMode 宣告的文件級語言,對該元素及其所有後代生效,使混合語言文件能為每段標記其正確的 BCP 47 語言標籤(例如 'en-US'、'fr'、'zh-Hant-TW')。螢幕閱讀器使用元素級 /Lang 來選擇合適的文字到語音引擎或朗讀語音。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.32.0 2026-05-20
- SetStructElemActualText 是新增 API,在當前開啟的結構元素上設定 /ActualText 項(ISO 32000-1 §14.9.4)。當內容流提取會得到錯誤結果時,用它指定字形序列實際代表的精確 Unicode 文字 — 最常見的情況是 OpenType 連字字形(U+FB00 ff、U+FB01 fi、U+FB02 fl)以及展開形式不明顯的縮寫。ActualText 補充而非替換渲染內容;它會覆蓋該元素對輔助技術與文字擷取器的朗讀/輸出,但不會抑制可視渲染。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.31.1 2026-05-20
- GetPDFUADiagnostics 現在在報告缺少 Alt 文字(FIGURE-NO-ALT:N)時除 Figure 元素外也檢查 Formula 結構元素。ISO 32000-1 §14.9.3 要求圖形 Figure 和數學公式都需提供替代描述;此前只掃描 Figure 元素。
- GetPDFUADiagnostics 現在會在文件 PDF 版本低於 1.7 時報告 PDF-VERSION-LOW。PDF/UA-1(ISO 14289-1)定義在 PDF 1.7(ISO 32000-1:2008)之上;PDF 1.5 或 1.6 文件無法滿足基礎規範要求。呼叫 SetPDFUAMode 可自動將版本提升至 1.7。
v3.31.0 2026-05-19
- 現已支援結構元素 ID 與表頭單元格關聯。SetStructElemID 為當前開啟的結構元素賦予一個唯一字串標識(/ID);儲存文件時 ID 會收集到結構樹根的 /IDTree 名字樹中,使無障礙工具與交叉引用能按 ID 定位元素(ISO 32000-1 §14.7.4)。SetStructElemHeaders 透過一個以逗號分隔的已分配 ID 列表把當前表格單元格(TD 或 TH)與一個或多個表頭單元格關聯起來,在 Table 屬性 owner 字典中寫入 /Headers 陣列(ISO 32000-1 §14.8.5.7.2)。這兩個函式共同支援 PDF/UA-1(ISO 14289-1 §7.10)和 WCAG 2.x SC 1.3.1 所需的複雜表格標記。兩個函式都在 Delphi 庫、ActiveX 和 DLL 介面中提供。AddTagAttribute 現在也能正確處理 /Headers 屬性,將逗號分隔的值寫為 PDF 文字字串陣列。
v3.30.1 2026-05-19
- GetPDFUADiagnostics 現在包含 HEADING-LEVEL-SKIP:N 檢查,用於檢測文件順序中的標題級別跳躍(例如 H1 後緊跟 H3 而中間沒有 H2)。該檢查對整棵結構元素樹執行前序遍歷,並統計下一個標題級別比前一個高出超過一級的每個位置。通用 H 元素按 H1 處理。回到更高級別標題(H3 → H1)不算作跳躍。WCAG 2.x 成功準則 1.3.1 與 ISO 14289-1 §7.1 要求標題巢狀不出現缺口。
v3.30.0 2026-05-19
- 結構元素屬性現已支援標籤化 PDF 與 PDF/UA 文件。三個新 API 函式允許將屬性掛到當前正在 tag 棧上建構的結構元素:AddTagAttribute(通用,任意 owner/name/value)、SetStructElemScope(便捷封裝,將 /Scope 屬性設定在 Table owner 下,用於 TH 表頭單元格 — ISO 32000-1 §14.8.5.7.2)以及 SetStructElemBBox(便捷封裝,將 /BBox 屬性設定在 Layout owner 下,用於 figure 等視覺定位元素 — ISO 32000-1 §14.8.5.4)。儲存文件時,屬性被寫為每個結構元素中的 /A 屬性字典;同一 owner 的多個屬性歸為同一字典,不同 owner 的屬性寫為字典陣列。三個函式都在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.29.1 2026-05-19
- GetPDFUADiagnostics 現在包含兩項額外檢查:是否有 Figure 結構元素缺少 Alt 文字值(報告為 FIGURE-NO-ALT:N,依據 ISO 14289-1 §7.5 和 ISO 32000-1 §14.9.3),以及是否有結構元素因 EndTag 未被呼叫而仍處於開啟狀態(報告為 STRUCT-UNCLOSED:N)。figure 檢查對結構元素樹進行完整遞迴遍歷,覆蓋所有巢狀深度的元素。
v3.29.0 2026-05-19
- GetPDFUADiagnostics 是新增的診斷 API,對文件執行 PDF/UA-1(ISO 14289-1)合規性潛在問題檢查,返回以換行分隔的發現列表。共執行六項檢查:MarkInfo/Marked 是否設定(標籤化 PDF)、文件目錄是否有 /Lang 項、ViewerPreferences/DisplayDocTitle 是否為 true、XMP 後設資料是否含 pdfuaid:part 標識、缺少 Contents 項的非豁免註解數量,以及缺少 AFRelationship 項的嵌入檔案數量。每個發現以簡短程式碼(如 LANG-MISSING、ANNOT-NO-CONTENTS:3)加人類可讀描述呈現。未發現問題時返回空字串。在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.28.5 2026-05-19
- PDF/UA-1 註解無障礙改進:當 FileAttachment 註解沒有 Contents 項且沒有 /T 欄位時,現在使用註解內嵌檔案規範(/FS /UF 或 /F)中的檔名作為回退的無障礙描述。這就完整了註解 Contents 回退鏈:/T → Link URI → Stamp name → FileAttachment filename。螢幕閱讀器會讀出附件檔名而非靜默,滿足 ISO 14289-1 §7.18.1 對最常見註解型別的要求。
v3.28.4 2026-05-19
- PDF/UA-1 註解無障礙改進:當 Stamp 註解沒有 Contents 項(或為空)且沒有 /T 欄位時,現在使用註解 /Name 項中的圖章型別名作為回退的無障礙描述(例如 "Approved"、"Draft"、"Confidential"、"Final")。這將 v3.28.3 引入的註解 Contents 回退鏈擴充套件到圖章註解,後者常見於審閱或批准工作流,往往缺少明確的 Contents 值。
v3.28.3 2026-05-19
- PDF/UA-1 註解無障礙改進:當 Link 註解沒有 Contents 項(或為空)且沒有 /T 欄位時,現在使用註解 URI 動作中的 URI 作為回退的無障礙描述。該回退僅在 SetPDFUAMode 處理過程中、且僅針對攜帶 /URI 動作的 Link 註解生效。螢幕閱讀器收到 URL 作為兜底標籤,滿足 ISO 14289-1 §7.18.1 在作者建立超連結時未提供人類可讀描述的常見情景。
v3.28.2 2026-05-19
- SetEmbeddedFileAFRelationship 是新增 API,用於在嵌入檔案的檔案規範字典上明確設定 AFRelationship 值。ISO 14289-1(PDF/UA-1)§7.11 要求該欄位,允許呼叫方從五個有效值中選擇嵌入檔案與文件內容的語義關係:Source、Data、Alternative、Supplement 或 Unspecified。當 SetPDFUAMode 啟用時,任何缺少 AFRelationship 項的嵌入檔案會被自動賦值 Unspecified;用此函式可在儲存前覆蓋該預設值。在 Delphi 庫、ActiveX 和 DLL 介面中提供。
v3.28.1 2026-05-19
- 當 SetPDFUAMode 在 XMP 後設資料攜帶通用庫預設標題(而非文件特定標題)的文件上被呼叫時,標題會自動替換為文件 /Info Title 項的值(若存在)。這確保 pdfuaid:part-1 XMP 包反映實際文件標題而非佔位符,滿足 PDF/UA-1 校驗器的預期。
- XMP 解析器(LoadFromString)現在載入文件時會從既有 XMP 後設資料中讀取 dc:title 值,所以已含 dc:title 的 PDF 進行迴環往返時能正確保留該標題,而不再回退到預設佔位符。
v3.28.0 2026-05-19
- BeginArtifactEx(ArtifactType, ArtifactSubtype) 是新增的標籤化 PDF API,擴充套件了 BeginArtifact,在單次呼叫中同時表達 artifact /Type 和 Pagination /Subtype。當兩個引數都非空時,寫出的運算子為 /Artifact << /Type /T /Subtype /S >> BMC,按 ISO 32000-1 §14.8.2.2.1 啟用完整指定的 Pagination artifact,例如頁首與頁尾。如果只有一個引數非空,則使用對應的單鍵形式。同時匯出 DLL 入口點 DLBeginArtifactEx 和 DLBeginArtifactExA。
v3.27.2 2026-05-19
- BeginArtifact 現在能正確區分 artifact 型別與 pagination 子型別。當引數為 Pagination、Layout 或 Page(按 ISO 32000-1 §14.8.2.2.1 Table 330 屬於 artifact 型別)時,marked-content 運算子寫入 /Type 而不是 /Subtype。Header、Footer、Watermark 等其他值繼續寫為 /Subtype。這修正了之前呼叫方意圖示記 pagination artifact 卻被錯誤寫為 /Subtype /Pagination 的輸出。
v3.27.1 2026-05-19
- 當 PDF/UA 模式啟用且文件含嵌入檔案時,每個缺少 AFRelationship 項的檔案規範字典在儲存時會自動獲得該項。寫入的值為 /Unspecified,滿足 ISO 14289-1 §7.11 要求每個嵌入檔案都攜帶 AFRelationship 鍵的規定。該自動補全既適用於透過 EmbedFile 新增的檔案,也適用於已載入文件中既有的嵌入檔案。
v3.27.0 2026-05-19
- AddRoleMap(CustomType, StandardType) 是新增的標籤化 PDF API,用於註冊一個從自定義(非標準)結構元素型別名到標準 PDF 結構型別的對映。儲存時這些對映寫入結構樹根的 RoleMap 字典,滿足 ISO 14289-1 §7.1 對使用應用特定 tag 名的文件的要求。可註冊多個對映;重複鍵會被最後一次呼叫覆蓋。同時匯出 DLL 入口點 DLAddRoleMap 和 DLAddRoleMapA。
v3.26.0 2026-05-19
- BeginTagEx(TagType, AltText, ActualText, Lang) 是新增的標籤化 PDF API,擴充套件 BeginTag,新增一個明確自然語言屬性。當 Lang 非空時,它會被寫入結構元素的 /Lang 屬性,啟用 ISO 14289-1 §7.2 多語言文件所需的元素級語言標註。傳入空 Lang 字串等效於 BeginTag。同時匯出 DLL 入口點 DLBeginTagEx 和 DLBeginTagExA。
v3.25.1 2026-05-19
- 以預設 Windows 內碼表(WinAnsiEncoding)載入的非子集化 TrueType 字型現在會寫入 ToUnicode CMap 流,為這些字型啟用可靠的 Unicode 文字擷取與複製貼上。此前只在明確覆蓋內碼表或存在 Differences 陣列時才寫 ToUnicode 流;常見的預設編碼路徑缺少該流。
- 同樣的修復也適用於以明確非預設內碼表載入且不帶 Differences 陣列的 TrueType 字型,以及透過 packaged-font 格式載入的字型。
v3.25.0 2026-05-19
- 當 PDF/UA 模式啟用時,所有缺少非空 Contents 項的非豁免註解(除 Widget、PrinterMark 和 TrapNet 外的全部型別)會在儲存時自動獲得該項。註解的 /T(標題 / 作者)值作為回退使用,滿足 ISO 14289-1 §7.18.1 對攜帶標題但沒有明確無障礙描述的註解的要求。
v3.24.0 2026-05-19
- 當 PDF/UA 模式啟用時,所有缺少 TU(工具提示 / 替代描述)項的互動表單欄位會在儲存時自動獲得該項。欄位的部分名(/T 項)作為回退值,確保螢幕閱讀器能識別每個欄位。按 ISO 14289-1 §7.18.4,下壓按鈕被正確排除在該要求之外。
v3.23.1 2026-05-19
- 當所選文件啟用了 PDF/UA-1 模式時,GetInformation(200) 返回 '1',使呼叫方能在執行時查詢一致性模式狀態。
- GetInformation(201) 在 PDF/A-1a 時返回 '1',PDF/A-1b 時返回 '2',PDF/A 模式關閉時返回空字串。
- GetInformation(311) 和 GetInformation(312) 現在能正確返回最近一次版本鎖定衝突的版本要求字串與功能名(先前已在 v3.20.3 公佈但尚未實現)。
- GetInformation(313) 返回儲存目標當前鎖定的 PDF 版本字串,對於版本自由的文件返回空字串。
v3.23.0 2026-05-19
- SetMarkInfo(Marked) 現已成為公共 API,允許獨立於 SetPDFUAMode 執行的完整 PDF/UA-1 設定之外單獨設定 MarkInfo.Marked 標誌。當 Marked 為 1 時,按 ISO 14289-1 §7.18.6 要求,MarkInfo.Suspects 也會被設為 false。
- 當 PDF/UA 模式啟用時,所有頁面在儲存時自動獲得 /Tabs /S 項,滿足 ISO 14289-1 §7.18.4 的基於結構的 tab 順序要求。
- 為 SetPDFUAMode、SetDocumentLanguage、SetMarkInfo、BeginTag、EndTag、BeginArtifact、EndArtifact 新增 HTML 參考文件,包含完整語法表與使用示例。
v3.22.0 2026-05-19
- BeginTag(TagType, AltText, ActualText) 在當前內容流中開啟一個標籤化 PDF 結構元素,寫出一個 BDC 運算子並自動分配 MCID,同時將該元素註冊到文件結構樹。TagType 是任意 PDF 標準結構型別(P、H1、Figure、Table 等)。AltText 和 ActualText 是可選的無障礙字串,編碼為 PDF 文字字串(UTF-16BE)。
- EndTag 關閉最近開啟的結構元素,向內容流寫出對應的 EMC 運算子。
- BeginArtifact(SubType) 將一段內容標記為 PDF artifact(pagination artifact、背景等),寫出 BMC 運算子。SubType 是可選的;提供時寫為 /Artifact << /Subtype /SubType >>。
- EndArtifact 用 EMC 運算子關閉 artifact 區域。
- 儲存時,當註冊了任意標籤化結構元素後,庫會自動建構完整的 StructTreeRoot、為受影響頁面分配 StructParents 鍵、寫入 ParentTree 數字樹,滿足 ISO 32000-1 §14.7 對標籤化 PDF 的要求。
- 標準 Type 1 字型(Helvetica、Times、Courier 家族、Symbol)和採用 WinAnsi 編碼的嵌入 Type 1 字型現在會寫入 ToUnicode CMap 流,為這些字型型別啟用可靠的 Unicode 文字擷取與複製貼上。
v3.21.0 2026-05-19
- SetPDFUAMode(Language) 啟用 PDF/UA-1(ISO 14289-1)一致性模式:自動 bump 文件到 PDF 1.7,寫入 MarkInfo.Marked 與 MarkInfo.Suspects,在 ViewerPreferences 中啟用 DisplayDocTitle,當 Language 非空時設定 Catalog.Lang,並寫入 ISO 14289-1 第 6.7.11 節要求的 pdfuaid:part = 1 XMP 名稱空間項。
- SetDocumentLanguage(Language) 直接寫入 Catalog /Lang 項,允許獨立於 PDF/UA 模式宣告文件語言。
- 每當 MarkInfo.Marked 被設為 true 時,MarkInfo.Suspects 都會被設為 false,滿足 ISO 14289-1 標籤化 PDF 結構要求(第 7.18.6 節)。
- Encrypt 現在在文件處於 PDF/UA 模式時強制啟用 CanCopyAccess(無障礙內容複製)許可權標誌,按 ISO 14289-1 第 7.17 節要求。
- Choice(下拉)表單欄位不再攜帶無意義的硬編碼 tooltip 值;TU 保持未設定,便於呼叫方透過表單欄位屬性 API 賦予有意義的標籤。
v3.20.3 2026-05-19
- Encrypt 和 AddSWFAnnotationFromFile 現在在儲存版本被鎖定到所選加密強度或註解型別所需最低版本以下時,立即返回 0 並設定 LastErrorCode 602,而不再靜默繼續直到儲存時才失敗。
- GetInformation(311) 與 GetInformation(312) 現在能在寫時反映衝突的版本要求,當鎖定版本阻止擴充套件級功能(如 AES-256 或 RichMedia 註解)時。
v3.20.2 2026-05-19
- AddU3DAnnotationFromFile 現在在向更低版本文件新增 3D 註解時會將文件版本自動 bump 到 PDF 1.6,與其他所有 PDF 1.6+ API 入口點的版本自動 bump 行為保持一致。
v3.20.1 2026-05-17
- PDF 1.2 儲存目標現在按嚴格 PDF 1.2 契約執行。在 PDF 1.2 目標下儲存 PDF 1.3+ 物件(如頁面 TrimBox 資料)會在輸出寫入前失敗,而不再寫出混版檔案。
- PDF 1.7 Adobe 擴充套件級合規性現已納入儲存預檢。AESV3、AES-256、RichMedia、Projection、地理空間字典和 ETSI 簽名 subfilter 都按所需 ExtensionLevel 進行檢查。
- AES-256 加密、RichMedia 註解、地理空間字典和 ETSI 簽名 subfilter 現在在 PDFlib 把文件自動 bump 到 PDF 1.7 擴充套件內容時宣告匹配的 Adobe Extensions 項。
- Append 儲存現在使用與全量儲存相同的版本合規門。
- 為 Win32 和 Win64 重新整理了可選 PDFium 執行時 DLL。GDI+ 仍是預設渲染器;PDFium 透過 SetPDFiumFileName 與 SelectRenderer(3) 保持 opt-in。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 207/207,C++Builder Win64x GoogleTest 通過 61 個測試,2 個已存在的樣本依賴測試被跳過。
v3.20.0 2026-05-17
- 另外八個 PDFlib writer 入口點現在經過 Phase 3 EnsureMinVersion 路由,使文件版本自動 bump 到所 emit 功能要求的最低版本:SetDocumentMetadata(PDF 1.4 - /Metadata XMP 流)SetPDFAMode(1 或 2)(PDF 1.4 - /MarkInfo + /OutputIntents)PageJavaScriptAction(PDF 1.5 - Page /AA + JavaScript)DocJavaScriptAction(PDF 1.4 - Catalog /AA + JavaScript)SetTabOrderMode(PDF 1.5 - Page /Tabs)NewOptionalContentGroup(PDF 1.5 - /Type /OCG)SetNeedAppearances(PDF 1.5 - AcroForm /NeedAppearances)NewFormField(ftSignature)(PDF 1.5 - AcroForm /SigFlags AppendOnly)
- 結合 v3.15.0 集合(SetTransparency、SetPageUserUnit、Encrypt、SetPageLayout)與 v3.17.0 集合(JavaScript / 嵌入檔案 / XFA / SWF 八項),PDFlib 現已在二十一個 writer 入口點上自動 bump FVersion。
- NewOptionalContentGroup 此前直接 bump FVersion;現在改為經過 EnsureMinVersion,使 LockSaveVersion 被尊重,並將 bump 記錄到 AutoBumpedFeatures 中。
v3.19.0 2026-05-17
- 儲存時與載入時 PDF 版本合規性現在還識別四個此前延遲的功能:Btn /Ff 位 15 NoToggleToOff(僅 radio-button)-> PDF 1.4;DeviceN /Subtype /NChannel(色彩空間細化)-> PDF 1.6;FontFile3 /Subtype /OpenType(字型程式型別)-> PDF 1.6;Sig /SubFilter ETSI.CAdES.detached 或 ETSI.RFC3161 -> PDF 1.7。
- NChannel 規則匹配 DeviceN 色彩空間陣列形式 [/DeviceN names alternateSpace tintTransform attributes],當 attributes 字典(索引 4)攜帶 /Subtype /NChannel 時觸發。
- FontFile3 OpenType 規則只在透過名為 'FontFile3' 的父鍵到達 stream 時觸發,因此其他恰好攜帶 /Subtype /OpenType 的無關 stream 不會被標記。
- PDFFeatureRules 表現在含 103 條規則(99 + 4 條新增)。
v3.18.6 2026-05-17
- 儲存時與載入時 PDF 版本合規性現在識別 /AA(附加動作)並具備容器型別感知:Catalog /AA(文件級觸發器)-> PDF 1.4;Annot /AA(註解觸發器)-> PDF 1.4;Page /AA(頁面觸發器)-> PDF 1.5。
- 表單欄位 /AA(PDF 1.2)仍由既有 PDF 1.3 儲存契約覆蓋;無需新規則。
- PDFFeatureRules 表現在含 99 條規則(96 + 3 條新增)。
v3.18.5 2026-05-17
- 儲存時與載入時 PDF 版本合規性現在將 Page /Tabs 正確歸類為 PDF 1.5 功能;此前被誤歸為 PDF 1.4。PDF 1.4 spec 變更文件(Adobe TN #5409)未列出 /Tabs,PDF 1.5 Table 8.10 引入 "Tabs (Optional; PDF 1.5)"。
- 新規則:AcroForm /NeedAppearances 按 PDF 1.5 Table 218 被識別為 PDF 1.5 功能。
- PDFFeatureRules 表現在含 96 條規則(95 + 1 條新增)。
v3.18.4 2026-05-13
- PDFlibZLib 在常規庫建置中始終使用打包的靜態 zlib-ng obj 後端,移除了餘下的 System.ZLib 回退路徑。
- zlib-ng 迴歸覆蓋現在包含邊界尺寸 payload、PNG 類掃描線資料、stored 多塊流以及已知的 zlib 流,覆蓋 Delphi 與 C++Builder 測試 runner。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 194/194,C++Builder Win64x GoogleTest 通過 58 個測試,2 個已存在的樣本依賴測試被跳過。
v3.18.3 2026-05-12
- 生成 PDF 或文字輸出的 Delphi 與 C++Builder demo 現在在成功儲存後自動開啟生成的文件。
- Installer 打包現在把建構產物排除在 demo 目錄之外,並將 C++Builder 樣例以及 DLL、ActiveX/OCX 模組變為 opt-in 元件;只有在選擇對應元件時才會安裝匹配檔案。
v3.18.2 2026-05-12
- Delphi 與 C++Builder 的 EditFormField demo 現在在更新欄位值前清除 /NeedAppearances,使每個被編輯過的文字欄位在儲存的 PDF 中獲得重新整理過的 normal appearance stream。
- 這能讓儲存的 /AP 流與儲存的 /V 值保持同步,避免不同 viewer 在聚焦欄位時顯示靜態外觀流缺失的文字。
v3.18.1 2026-05-10
- 儲存時與載入時 PDF 版本合規性現在也識別位級表單欄位 /Ff 標誌以及 AcroForm /SigFlags AppendOnly 位:/Ff 位 21(FileSelect, mask 1048576)-> PDF 1.4;/Ff 位 22(MultiSelect, mask 2097152)-> PDF 1.4;/Ff 位 23(DoNotSpellCheck, mask 4194304)-> PDF 1.4;/Ff 位 24(DoNotScroll, mask 8388608)-> PDF 1.4;/Ff 位 25(Comb, mask 16777216)-> PDF 1.5;/Ff 位 26(RichText / RadiosInUnison, 33554432)-> PDF 1.5;/Ff 位 27(CommitOnSelChange, mask 67108864)-> PDF 1.5;/SigFlags 位 2(AppendOnly, mask 2)-> PDF 1.5。
- /Parent 繼承不被跟蹤:只有明確攜帶 /Ff 或 /SigFlags 的字典才觸發規則。
- PDFFeatureRules 表現在含 95 條規則(87 + 8 條新增位級規則)。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 191/191,C++Builder Win64x GoogleTest 通過 57/57。
v3.18.0 2026-05-10
- 儲存時與載入時 PDF 版本合規性現在還識別九項更多子鍵與位級功能:位級註解標誌(/F mask):Locked (128) -> PDF 1.4;ToggleNoView (256) -> PDF 1.5;LockedContents (512) -> PDF 1.7;具有區分度的目錄與頁面子鍵:/BoxColorInfo(頁面)-> PDF 1.4;/Permissions、/Legal、/PresSteps -> PDF 1.5;/VP(頁面 geospatial viewport)-> PDF 1.6;/Collection(目錄可移植集合)-> PDF 1.7。
- PDFFeatureRules 表現在含 87 條規則(78 章級 + 9 子鍵 / 位級)。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 189/189,C++Builder Win64x GoogleTest 通過 57/57。
v3.17.0 2026-05-10
- 另外八個 PDFlib writer 入口點現在經過 Phase 3 EnsureMinVersion 路由,使文件版本自動 bump 到所 emit 功能要求的最低版本:AddLinkToJavaScript、SetOpenActionJavaScript、AddGlobalJavaScript、FormFieldJavaScriptAction(PDF 1.3 - JavaScript 動作);AddEmbeddedFile、AddFileAttachment(PDF 1.3 - 檔案附件);SetXFAFromString(PDF 1.5 - XFA 表單);AddSWFAnnotationFromFile(PDF 1.7 - RichMedia 註解)。
- 結合 v3.15.0 集合(SetTransparency、SetPageUserUnit、Encrypt、SetPageLayout),PDFlib 現已端到端覆蓋十三個高版本 writer 入口點。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 187/187,C++Builder Win64x GoogleTest 通過 57/57。
v3.16.3 2026-05-10
- 新 PDFlib API:LockSaveVersion(Version) 將文件釘在 Version,並阻止 Phase 3 writer 端 EnsureMinVersion 把版本自動 bump 到該值之上。UnlockSaveVersion 清除該鎖定。
- 儲存時的合規門不變:高於鎖定版本的 writer 所 emit 功能在儲存時仍會觸發 LastErrorCode 602,而不會靜默 bump 檔案頭。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 184/184,C++Builder Win64x GoogleTest 通過 57/57。
v3.16.2 2026-05-10
- 載入的 PDF 現在透過 GetInformation(103)("ContributorFeatures")暴露一個僅顯示貢獻者特徵的檢視。列表只包含其最低所需版本嚴格高於 HeaderVersion(鍵 100)的功能,因此直接回答 "為什麼有效版本高於檔案頭版本?" 這個問題。
- GetInformation(101)("DetectedFeatures")保持不變,仍列出每一個匹配的功能,無論是否對版本提升做出貢獻。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 181/181,C++Builder Win64x GoogleTest 通過 57/57。
v3.16.1 2026-05-10
- 擴充套件了載入端檢測的測試覆蓋,新增六個合成 fixture:頁面內透明度 ExtGState(不 bump 版本)、Catalog /MarkInfo(PDF 1.3 -> PDF 1.4)、/OCProperties + OCG 內容(PDF 1.4 -> PDF 1.5)、/Type /3DStream(PDF 1.5 -> PDF 1.6)、多功能組合 fixture,以及快照穩定性檢查。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 179/179,C++Builder Win64x GoogleTest 通過 57/57。
v3.16.0 2026-05-10
- 載入的 PDF 文件現在會經過內容驅動的版本檢測過程:每個間接物件都透過儲存時合規門所用的功能-最低版本表進行遍歷,當內容實際要求更高版本時,FVersion 會被 bump 到高於字面 %PDF-X.Y 頭部值的水平。例如某個 /UserUnit 頁面項會把有效版本 bump 到 PDF 1.6,即使檔案頭說 PDF 1.4。
- 新增 GetInformation 鍵:100 返回 HeaderVersion(字面 %PDF-X.Y),101 返回 DetectedFeatures(載入時匹配的功能,CRLF 分隔),102 返回 AutoBumpedFeatures(觸發 writer 端 EnsureMinVersion 的功能,CRLF 分隔)。
- 儲存時合規門不受影響:在載入時被 bump 了有效版本、隨後透過 SetInformation(0, ...) 明確降級的文件,儲存時仍會觸發 LastErrorCode 602。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 173/173,C++Builder Win64x GoogleTest 通過 57/57。
v3.15.0 2026-05-10
- 生成需要特定最低 PDF 版本功能的 writer 入口點現在會自動 bump 文件的 PDF 版本。對一個標記為 PDF 1.3 的文件呼叫 SetTransparency 現在會把頭部提升到 PDF 1.4,而不是用 LastErrorCode 602 讓儲存失敗。
- 同樣的自動 bump 已接入 SetPageUserUnit(>=1.6)、Encrypt 配 Strength 1/2/3/4(分別 >=1.4/1.6/1.7/1.7)以及 SetPageLayout 的兩頁變體(>=1.5)。
- 行為變化對比 3.14.x:此前依賴 v3.12.6 "儲存目標拒絕 writer 所 emit 功能" 門的應用程式現在會在 bump 後的版本下成功儲存。已包含更高版本功能的已載入 PDF 仍會經過既有儲存時合規門,所以載入一份標籤化 PDF 後選擇 PDF 1.3 仍會以 LastErrorCode 602 失敗。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 170/170,C++Builder Win64x GoogleTest 通過 57/57。
v3.14.3 2026-05-10
- 儲存時 PDF 版本合規性現在還識別其餘 PDF 1.6 3D 字典型別(/Type /3DStream /3DRef /3DBackground /3DRenderMode /3DLightingScheme /3DCrossSection /3DNode)以及 PDF 1.7 的 Redact、RichMedia、Projection 註解子型別加上 /Type /Requirement 與 /ReqHandler 配套字典。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 168/168,C++Builder Win64x GoogleTest 通過 57/57。
v3.14.2 2026-05-10
- 儲存時 PDF 版本合規性現在還識別 PDF 1.5 功能:/XFA 表單、/AlternatePresentations、/Renditions 名字樹、/Type /Rendition /MediaCriteria /MediaPermissions /MediaPlayers 多媒體字典以及 Screen 註解子型別。
- 以 PDF 1.4 儲存現在會用 LastErrorCode 602 拒絕攜帶這些功能的文件。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 166/166,C++Builder Win64x GoogleTest 通過 57/57。
v3.14.1 2026-05-10
- 儲存時 PDF 版本合規性現在還識別 PDF 1.4 功能:標籤化 PDF /StructTreeRoot /MarkInfo 與 StructElem 字典、文件 /Lang 與頁面 /Tabs 項、/OutputIntents 與 /OutputIntent 字典、/UR3 使用權簽名以及 PDF 1.4 的註解子型別 Polygon、PolyLine、Caret、Ink、Popup 和 Watermark。
- 以 PDF 1.3 儲存現在會用 LastErrorCode 602 拒絕攜帶這些功能的文件。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 165/165,C++Builder Win64x GoogleTest 通過 57/57。
v3.14.0 2026-05-10
- 儲存時 PDF 版本合規性現在還識別 PDF 1.3 功能,例如平滑著色、function 物件、ICCBased 和 DeviceN 色彩空間、/TrimBox /BleedBox /ArtBox 頁面項、/ToUnicode CMaps、檔案附件以及 /Sound 和 /Movie 註解、/Type /Filespec 與 /Type /EmbeddedFile 字典、/Group /EF /Alternates /Mask 鍵,以及 JavaScript 動作。
- PDF 1.2 呼叫方現在在 PDF 1.3 契約下儲存:字面 %PDF-1.2 頭部被保留,但門會接受 PDF 1.3 功能。PDF 1.4 及以後的功能仍會以 LastErrorCode 602 被拒絕。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 162/162,C++Builder Win64x GoogleTest 通過 57/57。
v3.13.0 2026-05-10
- 把儲存時拒絕高版本功能的 PDF 版本合規門重構到獨立模組中,使規則集可以擴充套件而不會擾動文件核心。
- 對比 v3.12.7,無使用者可感知的行為變化:同一批越版本功能仍會被以 LastErrorCode 602 拒絕。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 155/155,C++Builder Win64x GoogleTest 通過 57/57。
v3.12.7 2026-05-09
- 擴充套件了 Delphi DUnitX 與 C++Builder GoogleTest 套件中 PdfToImage 直接訪問渲染工作流的自動化測試覆蓋。
- Delphi VCL GUI 測試 runner 現在註冊了 Syntax 和 XRef fixture,與控制台 runner 的覆蓋一致。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 147/147,C++Builder Win64x GoogleTest 通過 57/57。
v3.12.6 2026-05-09
- 以 PDF 1.3、1.4、1.5、1.6 或 1.7 儲存現在會將所選版本作為完整儲存輸出契約執行。
- 完整儲存會移除目錄 /Version 覆蓋項、移除較低目標不支援的目錄擴充套件與後設資料項,並在以 PDF 1.3 儲存時抑制 PDF 1.4 XMP 後設資料流。
- SaveToFile、SaveToString 和 SaveToStream 現在在所選 PDF 目標版本低於文件中仍存在的功能(如透明度、可選內容、JPX、UserUnit、3D 或 AES 加密過濾器功能)時,以 LastErrorCode 602 失敗。
v3.12.5 2026-05-09
- 改進 PDF 1.7 字面字串解析,使未知轉義序列按標準要求忽略反斜槓。
- 字面字串的八進位制轉義現在只消費八進位制數字,並將緊隨其後的非八進位制數字保留為普通字串資料。
- 新增對未知字面字串轉義以及混合八進位制/非八進位制轉義序列的迴歸測試覆蓋。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 141/141。
v3.12.4 2026-05-09
- 改進 PDF 1.7 詞法解析,使名字物件正確在右花括號分隔符處停止。
- 修復 SmartAccess 載入 xref 流壓縮物件項時,物件流編號大於 PDF 位元組長度的情況。
- 新增對右花括號名字分隔符與稀疏壓縮物件 xref 流項的迴歸測試覆蓋。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 139/139。
v3.12.3 2026-05-08
- 改進對使用標準安全處理器、含 StrF、StmF、EFF、Identity、None 或 StdCF 風格命名加密過濾器的 PDF 1.7 加密文件的相容性。
- 後設資料流現在在解密、加密以及複製/儲存工作流中遵守 EncryptMetadata=false,而不再當成普通流處理。
- 嵌入檔案流現在攜帶 /Type /EmbeddedFile,並在載入或儲存加密文件時使用嵌入檔案加密過濾器決策路徑。
- 外部嵌入檔案流現在在 FFilter 升級為 Filter 時同步將 FDecodeParms 升級為 DecodeParms,保留流解碼引數。
- 新建的 AES 加密 PDF 現在將加密過濾器 Length 值按位長度寫出,與 PDF 1.7 加密過濾器字典契約一致。
- XRef 流的 Prev/XRefStm 值以及較大數值偏移量現在在解析器與 SmartAccess 路徑中保持 64 位精度。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 137/137。
v3.12.2 2026-05-08
- 改進 PDF 1.7 流解碼相容性。通用流解碼現在把 /DP 視作 DecodeParms 別名、解析間接解碼引數陣列項,並接受 /AHx 與 /LZW 標準過濾器縮寫。
- 大檔案 PDF 輸出現在通過 64 位格式化路徑寫入 xref、startxref、linearization 以及數字簽名 ByteRange 偏移量,而不再通過 32 位整數 helper 將這些值收窄。
- 已載入文件現在把目錄 /Version 項當作有效 PDF 版本(當其比檔案頭版本更新時)。
- 重寫的 xref-stream trailer 在 PDFlibPas 把它們儲存為經典 trailer 字典時,不再保留僅流相關的 DecodeParms 鍵。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 134/134。
v3.12.1 2026-05-06
- 生成的 PDF 開啟時第一頁會按 viewer 視窗的可用高度調整大小,因此整頁能在視窗允許的最大縮放下從上到下完整可見。在文件上配置自定義 OpenAction(SetOpenActionDestination、SetOpenActionMenu、SetOpenActionJavaScript)可覆蓋此預設行為。
v3.12.0 2026-05-06
- Windows 靜態後端現在包含 libjpeg-turbo 的 Win32 與 Win64 NASM SIMD obj 檔案,以及 Win64x zlib-ng 集合的 zlib-ng x86 SIMD 分發 obj 檔案。
- 重做 zlib-ng 重建指令碼,使 Win64x bcc64x 與診斷 MSVC 建構以每檔案特性標誌的方式編譯通用、SSE2、SSSE3、SSE4.1/SSE4.2、PCLMULQDQ 以及 AVX2 原始檔,而不再依賴單一全域性編譯器開關。
- 為靜態 C 庫新增 32 位元組對齊的 malloc/calloc/realloc/free CRT 樁,並修復 TPDFJPEGImage.Compress,使 jpeg_mem_dest 緩衝區透過分配它們的同一 C free 路徑釋放。
- 擴充套件公共驗證說明,標明本次釋出背後的嚴格自動化覆蓋:庫建置、壓縮往返、HelloWorld /FlateDecode 輸出、JPEG 渲染、影像工作流、字型、表單、安全、簽名、列印以及 C++Builder demo 衍生工作流。
v3.11.0 2026-05-05
- 將 Windows Flate 壓縮與解壓切換到 zlib-compatible 模式下的 zlib-ng。Win32、Delphi Win64 和 C++Builder Win64x 現在連結 Lib\thirdparty\Win32、Lib\thirdparty\Win64 和 Lib\thirdparty\Win64x 中 ABI 匹配的 zlib-ng 靜態 obj 集合。
- Win64 路徑不再經過 Delphi 的 System.ZLib 單元,因此 PDF 流壓縮/解壓可以像 32 位建構一樣享受 zlib-ng 後端的最佳化。
- 為 Win64 建構新增一小段 zlib-ng 橋接 obj,讓 Pascal 程式碼保持穩定的 zlib 相容入口點,而 Delphi 和 C++Builder 各自使用自己的連結器相容 obj 集合。
- 更新了所有 C++Builder demo 專案以定義 PDFLIB_CPPBUILDER,與 GoogleTest runner 匹配,防止 Win64x demo 連結到 Delphi Win64 的 zlib-ng obj。
v3.10.3 2026-05-01
- 擴充套件 C++Builder GoogleTest 套件以覆蓋 Demo\C++Builder 下的每一個 demo。7 個 fixture 的 phase-1 佈局擴充套件為 15 個 fixture / 52 個 GoogleTest 用例,全部在 Win64x 上通過。新覆蓋的 demo:AddFormattedTitle、AddTextImage、AddTrueTypeSubsettedFont、AddWebLink、CanvasText、CaptureToNewSize、CopyPageRanges、CreateWithImage、CreateWithImageToStream、DoInTheStream、DrawWrappedText、EditFormField、EmbeddedFonts、ExtractAnnotAttach、ExtractEmbeddedFonts、ExtractImage、ImageToPdf、ImportEMF、MultiFunction(renderer 切換)、PageOperations、PdfDecrypt、PdfPermission、PrintPDF、TextMeasure、TextPaging。
v3.10.2 2026-05-01
- 在 Tests\C++Builder 下新增 C++Builder GoogleTest runner,透過 C++Builder demo 所用的同一 {$JPHNE} 生成的 HPP 頭來運用 Lib\PDFlibrary.pas。第一階段以 17 個 GoogleTest 用例映象了七個核心 Delphi 場景(HelloWorld、DrawShapes、CreateTable、PdfEncrypt、ExtractText、PdfSigning、PdfToImage 渲染),全部在 Win64x 上通過。
- 擴充套件 Delphi DUnitX 套件,增加 Tests.Print 覆蓋 PrintPDF 與 ShowPrinterBins demo(預設印表機列舉、自定義印表機設定、列印選項、重定向到檔案的列印作業),以及 Tests.Render 中針對 MultiFunction demo 同一源 PDF 的 GDI+ / PDFium / Cairo 引擎選擇的渲染器切換測試。
v3.10.1 2026-05-01
- 在 SetPageSize 中新增 57 個命名頁面尺寸,使同一組規範頁面尺寸名稱也可在這裡使用:SIZE8X11, QUADA0, DOUBA0, B0PLUS, ENVB4/B5/C6/DL/MONARCH, ENV9/10/11, ANSIA/B/C/D/E, ARCHA/B/C/D/E1/E, SHIROKU, G1K, USBC/EUBC/ASBC, ID1/ID2/ID3, ONEINCH/TWOINCH/L2INCH/USVISA, P2R..P24R / S8R / P4D photo prints, plus the Chinese / Taiwanese octavo and sextodecimo sheet formats LARGE/STANDARD/CROWN/ROC 8K and the matching 16K halves.
v3.10.0 2026-04-30
- 為 Demo 下的每個 Delphi 樣例新增 C++Builder 原生版本。PDF 建立、頁面操作、字型、影像、安全、簽名、渲染與列印 demo 現在都可從 C++Builder 建置並執行,無需任何 Delphi 端封裝。
- 每個新 demo 位於 Demo\C++Builder\<Name>\ 下,是一個直接消費 Lib\PDFlibrary.pas 的控制台專案,並附帶執行所需的輸入檔案。
- 為每個 Delphi demo 目錄新增簡短的英文 Readme.txt,描述該 demo 展示什麼、關注哪個 API 以及如何執行;位於 Demo\Delphi\index.html 的 HTML 總覽按主題分組連結到所有 demo。
- 為每個 C++Builder demo 映象同一份 Readme.txt,其 Run 段為控制台工作流重寫(用 argv 引數替代 Open/SaveDialogs);位於 Demo\C++Builder\index.html 的對應總覽以同樣的主題分組列出每個 C++Builder demo。
- 修復 ImportEMF demo 的記憶體洩漏(TPDFlib 例項被建立但未釋放)。
v3.9.14 2026-04-30
- 修復頁面範圍複製 demo,使其真正複製頁面而不是總是報告失敗。
- 整理換行文字與 HTML 分頁 demo,使每個 demo 專注於自己的 API 並透過單一按鈕執行。
- 重新命名兩個 demo 專案(EmbeddedFonts 與 PdfPermission),使編譯出的執行檔與資料夾名匹配,而不是早期的原型名。
v3.9.13 2026-04-30
- 修復內部緩衝區 reader 的流位置 bug:兩位元組字讀取原本把讀取游標推進了四位元組而不是兩位元組。在長度超過兩位元組的緩衝區中,後續讀取會落到錯誤的偏移並靜默返回錯誤資料。該影響在解析交錯位元組與字讀取的二進位制資料結構時最明顯。
- 引入自動化 DUnitX 測試套件(控制台與 VCL GUI runner),覆蓋工具單元(buffer、AES、ZLib、Unicode、摘要雜湊)以及庫級工作流,包括文件建立、儲存到檔案與儲存到流、載入迴環以及 AES-128/AES-256 加密。
v3.9.12 2026-04-30
- GDI+ 影像渲染現在在把光柵影像縮放到螢幕或匯出解析度時預設使用平滑、高品質的雙三次插值。此前預設為最近鄰,會在螢幕預覽或高 DPI 匯出中放大小影像(logo、縮圖)時產生明顯的臺階狀偽影。偏好更銳利的最近鄰模式的呼叫方可透過 SetGDIPlusOptions 恢復舊行為。
v3.9.11 2026-04-30
- 修復 Cairo 渲染中使用顏色鍵透明度(影像字典中的 /Mask 顏色範圍陣列)的 PDF 影像。此前當頁面包含該形式透明度的影像時,Cairo 渲染器會完全省略該影像,而不是把它合成到頁面背景上。修復後會按宣告的顏色鍵範圍派生逐畫素 alpha 通道,並以透明影像渲染,輸出在視覺上與 GDI+ 渲染器一致。
v3.9.10 2026-04-30
- 修復 Cairo 渲染迴歸:所有跟在被裁剪影像序列之後的頁面內容都被錯誤地限制在影像的裁剪矩形內。儲存 graphics state、應用 clip path、繪製圖像、然後恢復 state — 這是帶框或帶邊框影像的常見佈局技術 — 這樣的 PDF 頁面會把後續所有文字、形狀和圖形都渲染在裁剪區域之內。Cairo 的 state save/restore 現在與 PDF q/Q 運算子正確對映,所以影像繪製完後裁剪區域會被丟棄。
v3.9.9 2026-04-29
- 在 GDI+ 與 PDFium 之外新增基於 Cairo 的 PDF 渲染引擎作為第三種渲染選項。渲染前呼叫 SelectRenderer(2) 啟用;引擎需要打包 DLL\Cairo 目錄中的 cairo.dll。Cairo 渲染支援與 GDI+ 相同的輸出模式:點陣圖檔案與流匯出(BMP、JPEG、PNG、GIF、TIFF、G4 TIFF)、裝置上下文渲染以及直接印表機輸出。
- MultiFunction View/Print demo 現在暴露三向渲染器選擇器,使使用者能在同一份文件上並排比較 GDI+、PDFium 和 Cairo 輸出,無需任何程式碼修改。
v3.9.8 2026-04-29
- 抑制了 Win32 C 執行時樁中兩個偽編譯器診斷,這兩個診斷在 RAD Studio 13.1 及更新版本出現。一個廢棄警告(W1000)因為編譯器版本能力守衛沒有傳播到 Delphi 2009 以後的編譯器,導致它們以廢棄的記憶體管理器 API 編譯。一個未使用變數提示(H2164)針對一個僅 Delphi 7 建置需要的內部相容變數;該變數現已限定在那個版本的條件塊內。兩個問題都僅為診斷性,無執行時影響。
v3.9.7 2026-04-29
- 為 Windows 新增可選的基於 PDFium 的頁面渲染,包括 BMP 流渲染、裝置上下文渲染、記憶體渲染以及印表機輸出。
- 更新 Delphi MultiFunction View/Print demo,增加渲染器選擇器,使使用者可在既有 GDI+ 渲染器與 PDFium 之間切換。
v3.9.6 2026-04-29
- 為完整 PDFlibPas 包和試用包提供獨立的 Inno Setup 指令碼,針對釋出場景排除版本控制後設資料、建置輸出、IDE 快取、本地 agent 檔案以及非釋出範圍內的打包第三方原始碼樹。
- 試用 installer 現在在生成 setup 執行檔之前,為 RAD Studio 11.3、12.3 和 13.1 建置並打包試用版二進位制庫以及試用版 Delphi demo。
v3.9.5 2026-04-29
- 修復在 RAD Studio 9.0 / Delphi XE2 下的 Win32 庫建置。建置指令碼此前傳遞的 DCU 輸出目錄標誌只在 Delphi 2010 及以後存在;XE2 的編譯器以不同方式解釋該標誌,產生錯亂的輸出路徑並在處理任何原始檔前發生致命錯誤。指令碼現在會根據目標編譯器版本自動選擇合適的標誌。
- 修正了庫原始碼中相關的編譯器版本守衛,它原本在 XE2+ 條件下呼叫一個 XE4 才引入的命名限定執行時函式。針對 XE2 與 XE3 的建構現在會改用正確的相容匯入。
v3.9.4 2026-04-29
- 修復網路與伺服器共享印表機的設定:透過印表機 DEVMODE handle(而非印表機裝置上下文 handle)來應用紙盒、介質、雙面、品質等列印設定。
v3.9.3 2026-04-29
- 在 Win32 與 Win64 上將打包的 AES 後端重新整理到 Brian Gladman 2018 年的 AES 原始碼。可復現的建置指令碼現在允許隨時從原始碼重建靜態 AES obj。過程中發現並修復了 Pascal 繫結的一個 ABI 缺陷:AES-CBC 加密與解密函式缺少 C 呼叫約定宣告,因此 Win32 建構會靜默地以錯誤的暫存器順序傳遞引數,可能產生錯誤的加密輸出。Win64 建構不受影響,因為該平臺強制統一呼叫約定。
- 加固第三方重建指令碼,使基於 MSVC 的 zlib、JPEG 和 CRT 樁指令碼可以從倉庫根和 thirdparty 目錄啟動;此前需要工作目錄設為 thirdparty 目錄。
v3.9.2 2026-04-29
- 在 Win32 與 Win64 上把 JPEG 2000 後端從舊版 OpenJPEG 1.5 升級到 OpenJPEG 2.5.4。兩個平臺現在都使用靜態物件連結,因此 JPEG 2000 的編碼與解碼無需額外執行時 DLL。新版編解碼帶來當代 JP2/J2K 頭部處理、回撥驅動的流 API,以及來自上游專案積累的 bug 與安全修復。公共 TJpeg2000Bitmap API 保持不變。
v3.9.1 2026-04-29
- 修復 libjpeg-turbo 升級後的 JPEG 頁面渲染與影像匯出,恢復 Win32 與 Win64 上的 PdfToImage JPG 轉換以及 TPDFJPEGImage.SaveToStream 輸出。
- 修正 Win32 libjpeg-turbo ABI 繫結,使回撥、結構對齊、布林欄位以及記憶體支援的 JPEG 目標與 libjpeg-turbo 3.1.90 匹配。
- 修復使用打包 zlib 1.3.2 後端的 Win32 FlateDecode 流解壓,恢復 PdfToImage 樣例文件等檔案的 PDF xref 流載入。
v3.9.0 2026-04-29
- 把打包的 JPEG 2000 後端從舊版 OpenJPEG 1.5 升級到 OpenJPEG 2.5.4。JPEG 2000 載入與儲存現在使用當代編解碼、回撥驅動的流 API 以及當代 JP2/J2K 頭部處理,同時保留公共 TJpeg2000Bitmap API。
- JPEG 2000 輸出現在為小影像自動選擇有效的 OpenJPEG 解析度數,並且 Win32 靜態後端不再依賴缺失的 MSVCRT helper 匯出。
v3.8.1 2026-04-29
- 消除了 Win32 與 Win64 上全部 16 條裝飾性 linker W1028 "Bad global symbol definition" 警告。原始碼級重新命名移除了多餘的 Pascal 端重複(jpeg_std_error 與 jmemnobs allocator 樁現在僅從 obj 層解析);其餘三個 bcc32 / vc64 obj 符號(jpeg_natural_order、jpeg_aritab、jpeg_nbits_table)必須保持與 Pascal 端資料的連結解析,它們現在在 thirdparty\build-jpeg-vc64.bat 的 ObjConv 後處理過程中被剝去 COFF 符號名。無公共 API 變更;Delphi Win32 與 Win64 建構的 linker 輸出乾淨無警告。
v3.8.0 2026-04-29
- Win64 JPEG 編解碼從 IJG 風格 libjpeg 升級到 libjpeg-turbo 3.1.90,完成了 v3.7.0(Win32)啟動的 JPEG 遷移。Win32 與 Win64 路徑現在共享同一現代 JPEG 編解碼,配同樣的 SIMD 最佳化內部迴圈以及來自上游累積的 30 多個 CVE / fuzz 修復。公共 PDFlibPas API 保持不變。
v3.7.0 2026-04-28
- Win32 JPEG 編解碼從 IJG libjpeg-6b 升級到 libjpeg-turbo 3.1.90。透過 SIMD 最佳化的內部迴圈顯著提升 JPEG 編碼/解碼速度,外加 libjpeg-turbo 上游累積的 30 多個 CVE / fuzz 修復。公共 PDFlibPas API(TPDFJPEGImage 類、DumpJPEG 函式)保持不變;既有 PDF/JPEG 程式碼路徑無需原始碼改動即可獲得加速。
v3.6.0 2026-04-28
- Win32 zlib 從 1.2.x 升級到 1.3.2。包含 1.2.8 以來上游累積的標準 25 多個 CVE / fuzz 修復,外加 64 位視窗流所用的新 inflateBack9 / inflateTree9 入口點。公共 PDFlibPas API(DeflateStr / InflateStr / InflateStrParms)保持不變。
- 本次釋出 Win64 zlib 路徑未變 — 它繼續使用 Delphi 打包的 System.ZLib 單元。
- 為 Win32 zlib 路徑啟用 Win64 連結期 CRT 樁 PDFlibCLibs.pas(v3.5.0 引入),提供新 zlib 1.3.2 obj 檔案所引用的 memcpy / memset / malloc / free 符號。
v3.5.0 2026-04-28
- 為打包的 C 影像 / 壓縮庫引入全新建置基礎設施:zlib 1.3.2、libjpeg-turbo 3.1.90、libtiff 4.7.1。Embarcadero bcc32(Win32)與 MSVC cl.exe(Win64)的建置指令碼與原始碼樹一起放在 Lib/thirdparty/,因此任何裝有 RAD Studio + VS2022 的人都可以從乾淨原始碼重新建置靜態 obj 檔案。
- 為 OpenJPEG 2.5.4 新增建置基礎設施。OpenJPEG 原始碼樹本身由使用者獨立獲取(git clone uclouvain/openjpeg 到 Lib/thirdparty/OpenJPEG/),便於在不觸動 PDFlibPas 建置配置的情況下升級。
- 新增 Lib/PDFlibCLibs.pas,這是 Win64 後端使用的 Win64 連結期 CRT shim。它彌合了 MSVC 編譯的 C obj 檔案與 Delphi Win64 連結器(dcc64 / Win64x ld.lld / BCB ilink64)之間的差異,後者不會自動引入 msvcrt.dll。
v3.4.0 2026-04-28
- 加固加密金鑰、AES 初始化向量與 Perms 許可權塊的生成,使其不受可預測隨機數源影響。在牆鍾時間接近的系統上生成的加密 PDF 不再可輕易關聯;AES-256 文件現在保持完整的金鑰強度。
- 加固影像字典解析,使其能抵禦聲明瞭不合理 Width、Height、BitsPerComponent 或 DeviceN 分量數的畸形或惡意 PDF。越界值在任何畫素緩衝區算術之前被夾緊,防止開啟此類檔案時崩潰。
- 加固交叉引用與頁面樹遍歷,使其能抵禦 /Prev xref 鏈或 /Parent 頁面連結形成迴圈或過深的文件。reader 現在乾淨地拒絕畸形結構,而不是遞迴到棧耗盡。
v3.3.1 2026-04-27
- 精簡每個元件的 Windows 建置指令碼。DLL/、OCX/ 與 Dylib/ 目錄不再帶各自的 build12-* / build13-* 變體:每個平臺現在只有一個 build-Win32 / build-Win64 指令碼,固定到最新的 RAD Studio,並接受一個可選的 "debug" 引數。
- 在已經存在於初始 Git 基線中的 PDFlibRenderer.pas 渲染修復周圍新增內聯說明性註釋。註釋記錄了 SetPen 為何按活動 canvas 變換縮放筆畫寬度,以及 Type 3 字型 CharProc d0/d1 運算子為何必須消費它們的運算元。無執行時行為變化。
v3.3.0 2026-04-26
- 修復 PDFlibRenderer.pas 中變換後筆畫的渲染。SetPen 現在在呼叫 Picasso 前把當前 canvas 變換比例應用到 PDF 線寬,避免在座標已被變換的路徑上出現過粗或過細的筆畫。這修復了 Type 3 字形輪廓可能被渲染為粗大不規則塊的問題。
- 修復內容流解析器中 Type 3 字型 CharProc d0/d1 處理。d0 現在消費它的兩個寬度運算元,d1 在後續繪圖命令執行前消費它的六個寬度/包圍盒運算元,防止陳舊運算元破壞字形或路徑幾何。