更新日誌
版本釋出歷史
PDFlibPas 庫的版本歷史。條目按時間倒序排列,每個版本遵循專案釋出策略中的語義化版本規範。
最新發布
- 最新版本: v3.75.6; 發布日期: 2026-06-23
Version 3.333.0
Added
- 增量修訂檢查。簽章涵蓋其寫入所在修訂的位元組,而其後附加的一切都是單獨的更新,其內容決定簽章對於目前文件是否仍然成立。
GetDocumentRevisionCount、GetDocumentRevisionStart與GetDocumentRevisionEnd布置這些修訂,而GetSignatureRevisionIndex說明簽章終止於哪一個修訂 GetDocumentRevisionKind回報更新所做的事情,以其觸及的物件中影響最深遠者為準:簿記、驗證材料、文件時間戳記、簽章、表單欄位、註解或文件內容。因此,為長期驗證新增驗證材料不再看起來像是在編輯文件GetDocumentRevisionChanges列出更新所新增、變更或刪除的每個物件,連同每個物件是什麼,以及對於已變更的字典,哪些索引鍵實際不同GetDocumentRevisionsComplete回報整個歷程是否可復原。斷裂、循環或長於讀取器追隨長度的鏈結會使最舊的更新保持不可見,此時計數是下界而非答案- 其早期版本無法讀取,或其串流主體從未被比較的物件,被回報為未確定而非無害:在保留字典不變的情況下重寫頁面的更新不會被誤認為重新封裝
Version 3.332.0
Added
ApplyPAdESLongTermValidation透過一次呼叫將已簽署的 PDF 升級為 PAdES-B-LT。它從簽章本身建構簽署者憑證路徑,透過憑證所指定的位址收集每個連結的 OCSP 與 CRL 材料,並在單次增量更新中將憑證和撤銷資料連同該簽章的 VRI 條目一起寫入文件安全存放區。ApplyPAdESLongTermValidationToStream將結果寫入串流而非檔案- 此行為可透過
PADES_LTV_*選項遮罩進行設定:是否寫入 VRI 條目、是否詢問 OCSP 回應器、是否回退到 CRL、是否跟隨簽發者位址以補完路徑,以及是否略過自簽發根的撤銷檢查 - 空白欄位名稱會將每個簽章處理為一個修訂;具名欄位僅處理該欄位本身
GetPAdESLTVCertificateCount、GetPAdESLTVCRLCount、GetPAdESLTVOCSPCount與GetPAdESLTVError回報上一次呼叫收集了什麼以及為何提前停止,因此對不可達回應器的部分結果也會顯現出來,而非被靜默忽略- 與已暫存內容相同的材料只寫入一次,並被需要它的每個簽章參照;而不攜帶可讀憑證的簽章會被回報,而不是被偽裝成成功的升級
Version 3.331.0
Added
- 簽章攜帶其自身的認證路徑,因此長期驗證設定檔所需的材料可僅從已簽署檔案中讀取。
GetSignatureSignerCertificateDER、GetSignatureEmbeddedCertificateCount與GetSignatureEmbeddedCertificateDER傳回簽章內嵌的憑證,而GetSignatureCertificateChainLength和GetSignatureCertificateChainDER將它們排列為一條從簽署者向外的路徑 GetSignatureContentsHashHex傳回AddPAdESDSSVRI條目所定址的索引鍵,該索引鍵由簽章本身計算得出- 無論簽章是透過簽發者與序號識別簽署者憑證,還是透過主體金鑰識別碼識別,簽署者憑證都會被比對;並且路徑在簽章實際攜帶的最後一位簽發者處停止,而不是假裝完整
Fixed
- DER 讀取器拒絕大於資料的已宣告元素長度,而不是讓接近最大值的值繞過其邊界檢查;憑證延伸巡訪也不再越過被截斷或過長憑證的結尾讀取。二者均可從被竄改的文件到達,因此上述存取子在不可信輸入上仍然安全
- 簽章存取子透過共享控點讀取文件,因此在驗證器或檢視器已經開啟該檔案時仍能應答,而不是像簽章不存在那樣失敗
Version 3.330.0
Added
- OCSP status requests.
BuildOCSPRequestencodes an RFC 6960 request for a certificate and its issuer,FetchOCSPResponseposts it to the responder and returns the reply, andAddPAdESDSSOCSPFromCertificatesdoes both and files the result in the document security store - The responder address is optional: when it is omitted, the one the certificate itself names is used, so a caller that has the certificate chain needs no further configuration
- A certificate pair that does not actually belong together is refused before anything is sent, instead of producing the "unknown" answer such a request earns from the responder and which reads like a revocation problem
- Only a successful response is stored; a responder that answered
tryLaterorunauthorizedis reported throughGetTimeStampErrorrather than filed as if it were a status answer
Version 3.329.0
Fixed
- Reusing one result array across successive enumeration calls no longer leaks the strings held in the array slots that a later call does not fill. This affected the documented "call once for the count, resize, call again" pattern whenever a later call returned fewer items than the array could hold, and the stranded text accumulated for the lifetime of the process
- Affected entry points include
EnumPageContentStates,EnumPageContentStatesEx,EnumAttachments,EnumDocumentFonts,EnumPageElements,EnumNamedDestinations,EnumSignatures,EnumFormFields,GetFormValues,GetTextInAreaEx, and the text-search, form-field-action and certificate enumeration calls
Changed
- The result-array parameter of those calls is now passed as
varrather thanout. Existing Delphi and C++Builder code compiles and links unchanged; the only visible difference is that array slots past the returned count keep whatever they held before instead of being silently blanked
Version 3.328.0
Added
- Certificates now tell the library where their status can be checked:
GetCertificateOCSPURLs,GetCertificateIssuerURLsandGetCertificateCRLURLsread the responder, issuing-certificate and CRL addresses out of a certificate, so assembling long-term validation material no longer requires knowing where a given authority publishes FetchRevocationMaterialdownloads material from those addresses, andAddPAdESDSSCRLFromURLandAddPAdESDSSCertificateFromURLdownload and file it in the document security store in one step- Addresses that name no fetchable resource, such as a directory name or a mail address, are skipped rather than reported as something that can be downloaded
Version 3.327.0
Added
- A built-in RFC 3161 time-stamp client.
SetTimeStampServerandSetTimeStampOptionsconfigure the authority, hash algorithm, requested policy, nonce use and timeout;FetchTimeStampTokenreturns a TimeStampToken for any digest ApplyPAdESSignatureTimeStampcompletes a PAdES-B-T signature in one call: it hashes the signature value, obtains the token from the configured authority and attaches it as the signature time-stamp attribute, replacing the previous three-step exchange the caller had to wire up itself- When a nonce is used the token is checked to carry the same value back, so a replayed or substituted response is rejected instead of being embedded in the document
GetTimeStampStatusandGetTimeStampErrorreport the authority's own status and failure text, so a refused request explains itself
Version 3.326.0
Added
- The PDFium renderer now writes the same image formats the GDI+ and Cairo renderers write.
RenderPageToFile,RenderPageToStreamandRenderPagesToFilesaccept BMP (option 0), JPEG (1), PNG (5), GIF (6), TIFF (7) and G4 TIFF (10) afterSelectRenderer(3), instead of accepting BMP alone - The JPEG quality set through
SetJPEGQualityand the active TIFF compression settings now apply to PDFium output as well, so switching renderers no longer changes the encoding of the file that is produced
Fixed
- Requesting PNG or any other non-BMP format from the PDFium renderer used to return 0 and leave an empty file behind. Applications that offered a renderer choice silently produced unreadable output whenever PDFium was the selected engine
- Asking the PDFium renderer for a metafile format it cannot produce (WMF, EMF, EPS, EMF+, HTML5) now reports which formats are available through
LastRenderErrorinstead of naming BMP as the only option
Version 3.324.0
Changed
- The PDFium renderer now feeds the document to the engine through a streaming data source instead of one resident buffer. Rendering and printing previously serialised the document and then copied it again into a string, so every page cost twice the document size in memory; the copy is gone and PDFium reads only the blocks it needs
- Rendering a page range to files parses the document once for the whole batch instead of once per page, so a long range no longer re-reads the entire file for every image it writes
- Older PDFium builds that do not export the streaming entry point keep working unchanged through the in-memory path
Fixed
- The renderer smoke test located the optional PDFium and Cairo libraries one directory too high and silently skipped both engines; it now finds them and exercises the real rendering paths
Version 3.323.0
Added
CreateValidationReport与SaveValidationReport以 XML 或 JSON 格式生成結構化的 PDF/A 和 PDF/UA-1 验证报告。每条發現都携带規则 id、所归属的標準、简短規则名、它执行的 ISO 条款、严重程度以及受影响物件的数量,报告末尾以按標準和文件級别的透過/失败统計收尾- 未请求的標準會被报告為
not-checked而不是靜默透過,因此部分執行不會被人誤以為是健康合格的結论 - 構建流水线現在可以基于規则 id 或 ISO 条款进行门控,而不必在文字說明中匹配子串:預檢报告系列先轉譯人類可讀的报告,再把该文本轉换為 JSON、HTML 或 CSV,而验证报告则由原始檢查输出組装而成,并保持机器可讀字段完整无損
Version 3.322.0
Added
- 参考文件現在記錄了在
TPDFlib表面各處使用、但此前没有专属页面的四個外部声明的公共型別:TPDFlibProgressEvent、TPDFlibLogger、TPDFlibCertificateInfo和TPDFlibWatermarkBase,補全了对公共事件、日志器、枚举結果与水印型別的覆盖
Version 3.321.0
Added
CheckDocumentPolicy针对文件评估诸如Fonts.NotEmbedded = 0、Security.Encrypted = no或Document.Pages <= 500之類的声明式内部規则,并把每条規则连同實際值报告為透過或失败,從而把面向出版社、档案馆和印刷厂的入庫门控從手写的檢查代碼轉變為配置
Version 3.320.1
Fixed
- 在 PDF/A 模式下若未先加载字型就绘制文本,不再會触發 fault:PDF/A 要求每個字型程式都被嵌入,因此通往内置字型的隱式快捷方式被拒绝,導致没有字型被选中,而
DrawText和其他文本呼叫會崩溃而不是完成绘制 - 隱式字型路径現在會在 PDF/A 模式激活期间解析出真正可嵌入的字形,因此未顯式呼叫
AddTrueTypeFont而绘制的文本會被嵌入并保持合規;在 PDF/A 下直接呼叫AddStandardFont仍然被拒绝 - 在无法解析出可嵌入字形的宿主上,绘制會回退到内置度量而不是触發 fault,并透過
LastErrorCode605 报告合規缺口,從而可以在文件被作為合規文件發布之前把它拦截下来
Version 3.320.0
Added
GetDocumentFeatureReport在一次呼叫中傳回結構化的功能报告 — 文件元資料、页数与物件数、加密狀态、字型与影像清单、標签与大纲、表单域、簽章、附件以及按類别划分的位元元組明细 — 取代了編目或入庫流水线此前必须自行拼装的十几個独立查詢
Version 3.319.0
Added
SetCollectionView、AddCollectionField、SetCollectionSort和SetCollectionItemValue在現有附件之上構建 PDF 組合包,使一組嵌入文件以一個可浏览的包的形式呈現,带有自己的列、排序顺序和每個文件的值,而不是一個简单的附件列表GetCollectionView和GetCollectionFieldCount报告已加载組合包的呈現模式以及已声明的列数
Version 3.318.1
Fixed
- 文本抽取选項 12(忽略旋轉文本)現在无论旋轉方向如何都會丢弃被旋轉的文本段:顺時针四分之一圈和逆時针四分之一圈以前被区别对待,因此横向的页边注釋在一個方向上被丢弃,而在另一個方向上却被傳回
- 同一选項保留仅被剪切倾斜的文本(例如合成斜体),并且容差現在會随文本尺寸和页面變换进行缩放,因此较大的倾斜標題不再被當作旋轉文本而丢弃
Version 3.318.0
Added
DecodeAllStreams原地展开文件中被压缩的流,因此保存后會生成一個其內容流、元資料和結構可以被 diff 工具、取证审查与支援工作流直接讀取的副本;影像、預測流与交叉引用流保留其編碼,物件流會先被實体化,因此不會丢失任何內容
Version 3.317.0
Added
SetTrapped和GetTrapped声明并讀取 PDF/X 所要求的文件補漏白狀态,以規范所要求的/Trapped名称而非文本字串的形式写入SetOutputIntentSubtype和GetOutputIntentSubtype对输出意图重新打標,因此一個被加载的色彩配置文件可以描述GTS_PDFX印刷条件,而不是 PDF/A 模式所创建的GTS_PDFA1归档条件
Version 3.316.0
Added
SetEncryptEmbeddedFilesOnly和GetEncryptEmbeddedFilesOnly把 AES 加密限定于嵌入文件:文件在任何阅讀器中打开和轉譯都不會弹出密碼提示,而其附件仍保持加密狀态,這是封面公开而载荷非公开的發票、医疗記錄和案卷的標準安排
Version 3.315.0
Added
- 文本抽取选項 18 把以 90、180 或 270 度绘制的文本段旋轉到水平阅讀框中,并分别对每個四分之一圈进行分組,因此旋轉的页边注釋、表头和图表轴標签會被抽取為可讀的行,而不是与正立的文本交错或被丢弃
Fixed
DASetTextExtractionOptions不再拒绝选項 16(去连字符)和选項 17(按字符间距分词),而是接受它們,并且直接存取抽取路径現在把选項 15、16、17 轉發給抽取器,因此下划线規则移除、去连字符和字符间距分词对文件控制代碼的應用方式与对已加载文件的應用方式相同
Version 3.314.0
Added
GetFontHasToUnicode报告所选字型是否带有 Unicode 映射,并且字型清单新增了对應的逐字型HasToUnicode字段以及NoToUnicodeCount汇总,因此可以在處理之前檢查文件是否具備抽取安全并可轉换為 PDF/A-*u 或 PDF/UA 的字型
Version 3.313.0
Added
SetPDFAMode新增了用于 PDF/A-2u(ISO 19005-2 Level U)的模式 8,這是声明 Unicode 文本映射但不允许嵌入文件的一致性等級,与現有的 2b 和 2a 模式一起補全了 PDF/A-2 家族
Version 3.312.0
Added
GetObjectByPath和GetObjectByPathCount透過诸如Root/Pages/Kids[0]/MediaBox[2]或pages[0]/Type的路径表達式讀取物件树的任意节點 — 型別、標量值、序列化形式与元素計数一次呼叫即可獲得,取代了為元資料探查、合規抽查和支援診斷而手写的物件遍历
Version 3.311.0
Added
SetBlackPointCompensation透過 PDF 2.0 的/UseBlackPtComp图形狀态為后续绘制声明黑點補偿(ON、OFF 或 Default),讓印前与打樣输出能夠锁定此前由阅讀器私有的暗調 ICC 轉换;文件版本會被自动提升,而 PDF/A 模式會拒绝该狀态
Version 3.310.0
Added
SetCompressionLevel和GetCompressionLevel暴露出庫执行的每次压缩所用的 deflate 級别:0 保留預設的 SIMD 加速引擎,1 偏重吞吐量,9 则把归档压到最小RecompressStreams以當前級别对所选文件的每個普通 FlateDecode 流重新 deflate,并按流保留更小的編碼,從而在不触碰其內容的情况下,把原本以快速压缩設定写出的文件缩小
Version 3.309.0
Added
SetObjectStreamMode和GetObjectStreamMode增加了一個三态物件流控制:禁用、生成(預設)或保留,其中保留會保持已加载文件的原始压缩分組并逐字写出容器,使現有 PDF 1.5+ 文件的轉换更省事,因為没有任何东西被解包或重新分組
Changed
- 在保留模式下,自加载以来被編輯过的成员會被提升為顶級物件,從而其變更得以保存,而任何剩余的压缩成员會自动选擇二进制交叉引用流形式
Version 3.308.0
Added
CheckDocumentStructure執行一次性的結構健康檢查:每個物件和流都被强制透過其解碼器,普通 Flate 流會针对 zlib 結束標記被严格校验以捕獲被截斷的資料,并且报告會按物件標記出缺失的 trailer、无法解析的 catalog 和 pages、不支援的加密處理程式以及经位元元組扫描修複的文件,并附带一条汇总行
Version 3.307.0
Fixed
- 使用交叉引用流的受損文件現在可以成功修複:原始重建會恢複压缩物件流的成员,并且當文件中任何地方都不存在 trailer 关键字時,會從最新可達的文件 catalog 合成出 trailer,因此損坏的 startxref 偏移量不再會使此類文件无法打开
Version 3.306.0
Added
ExportDocumentData以经典 dump_data 行格式的可編輯纯文本写出文件資訊键、整棵书签树以及页面標签范围ImportDocumentData以相同格式反向應用 — 資訊键被更新,书签树按嵌套層級和目標页面重建,页面標签范围被替换 — 從而在双向各一次呼叫中即可實作文件之间的批量书签編輯与元資料遷移
Version 3.305.0
Added
AuditDocumentSpace按類别拆解文件的位元元組用量 — 影像、字型程式与字典、內容流、表单 XObject、物件流、嵌入文件、元資料、結構树、注釋、页面树以及其他 — 附带物件計数、位元元組总量与百分比,回答了文件為何如此之大,以及哪种最佳化最划算
Version 3.304.0
Added
StructTreeItemCount、GetStructTreeItemText和GetStructTreeItemIntProperty把带標签文件的結構树作為扁平化的深度优先条目列表来讀取 — 元素型別(原始的与角色映射的)、替代文本与實際文本、語言、標題、標記內容 id、页碼以及父子关系
Changed
- 結構树讀取器对受損文件具有防护:引用迴圈、超出范围的物件編号以及嵌套超过 64 層的树會被截斷而不是无限迴圈
Version 3.303.1
Fixed
- 由
StampText和StampImage创建的半透明底纹印章不再把其不透明度渗透到原始页面內容中 — 透明狀态現在被限制在印章本身,因此页面保持其完全不透明
Version 3.303.0
Added
OverlayDocumentPages把另一個已打开文件的页面盖印到所选文件的页面上,每個目標页面对應一個源页面,位元于現有內容的上方或下方 — 一次呼叫即可完成信头纸、连续页面背景以及扫描表单模板的盖印- 源耗尽是可配置的:停止、迴圈遍历源页面,或重複最后一個源页面;另有选項可防止印章被放大到超过其自然尺寸
Changed
- 文件印章會被適配到目標页面的 CropBox,并被正向放置于带有
/Rotate条目的页面上,而每個源页面都作為共享的 Form XObject 被導入一次,因此重複的模板不會複制其资源
Version 3.302.0
Fixed
- AES-256 口令現在會在哈希之前先用 SASLprep (RFC 4013) 處理,因此包含非 ASCII 空格、软连字符、兼容字符或組合序列的口令能夠在 Acrobat 及其他合規阅讀器中正確打开
- 打开 AES-256 文件時會先尝試標準的已處理口令,并回退到旧式的位元元組形式,因此早期版本以非 ASCII 口令写出的文件仍能继续打开
Added
- 错誤代碼 604 报告由于包含被禁止的碼位元或違反双向規则而被 SASLprep 拒绝的 AES-256 口令
Version 3.301.0
Added
SplitDocumentToFiles把所选文件按每個输出文件固定页数拆分為一批输出文件,使用%p檔案名占位元符
Changed
- 批量拆分只解析源文件一次,并從同一個記憶體結構複制出每個分塊,取代了对
ExtractFilePages的迴圈针对每個范围都执行的重複完整再解析
Version 3.300.0
Added
CollateDocuments把多個已打开文件的页面以轮轉方式合并进所选文件,每一轮從每個源取可配置数量的页面(A1、B1、A2、B2、…)CollateDocumentsEx接受一個按源的页面范围列表,其中诸如3-1的降序范围會反轉一個源,因此正向正面和反向背面的扫描趟次可以一次呼叫就合并為阅讀顺序
Changed
- 整理合并透過单個物件映射導入每個源,并按页面重排进行交错,因此源内部共享的字型和影像无论分組大小如何都只被写入一次
Version 3.299.0
Added
SetDeterministicDocumentID和GetDeterministicDocumentID把 trailer 文件標識符切换為一個可複現的值,使相同的输入產生相同的输出位元元組,以用于構建快取、內容可寻址存储以及位元元組級回归比较SetDocumentIDSeed為可複現的文件標識符提供一個顯式种子;在没有种子的情况下,標識符會從文件元資料、版本头和页数派生而来
Changed
- 可複現的文件標識符仅在完整保存時刷新;增量更新和加密文件會保留其現有標識符,因此簽章和受口令保护的文件仍能继续正確打开
Version 3.298.0
Added
AddLinkToArticleThread與SetOutlineArticleThread透過標準 Thread 動作,將頁面熱點與大綱連結到文章執行緒或 beadAddActionNextArticleThread與PDF_ACTION_BUILDER_THREAD將 Thread 動作新增到鏈結、表單、頁面與文件動作工作流程
Changed
- Thread 動作目標使用穩定的間接執行緒與 bead 參考,並在不變更目標容器的情況下拒絕無效索引
- 表單欄位動作建構函式在 PDF/A 模式啟用時拒絕附加動作,維持 PDF/A 對欄位與小工具
/AA字典的禁止
Version 3.297.0
Added
DL扁平 DLL 參考現已為每個帶A後綴的 ANSI(char)進入點提供文件,新增 353 個參考頁,鏡像其 Unicode 對應項並提供準確的PAnsiCharDelphi 與const char *C 簽章- 已將
BufferUtilities、DirectAccessFunctionality與MiscellaneousFunctions重建為由共用分類架構驅動的乾淨函式群組索引頁,修復損毀的標記、標註錯誤的章節與遺漏的項目區塊 - 導覽索引與共用搜尋索引現已涵蓋 Unicode 與 ANSI 呼叫端的完整 DLL 介面
Fixed
- 已移除過時的
SetLogger項目,該項目在原始碼中沒有對應的符號;文件所記載的屬性為Logger
Version 3.296.0
Added
AddAlternateImage、AlternateImageCount、GetAlternateImageInfo與RemoveAlternateImage提供顯示與列印影像變體的型別化撰寫與檢視- 替代影像可關聯至選擇性內容群組或成員字典,且每個基礎影像可選擇一個變體作為列印預設值
Changed
- 內建轉譯器現會在基礎影像隱藏時選擇選擇性內容替代影像,並在印表機目標上遵循列印預設值
FindImages現會註冊可從頁面資源連到的替代影像 XObject,讓匯入的變體取得可用的影像控制代碼
Version 3.295.0
Added
AddArticleThread以型別化中繼資料、排序的頁面矩形、循環 bead 連結與逐頁 bead 陣列,建立符合標準的文章導覽ArticleThreadCount、GetArticleThreadInfo與GetArticleThreadBead檢視已建立或匯入的文章執行緒,並對損毀的連結循環進行有界周遊
Changed
DeletePages現會移除失去所有 bead 的文章執行緒,並修復存活執行緒的循環連結- 已刪除頁面追蹤現會保留穩定的間接頁面參考,使大綱與文章清理不會隨頁面樹游標移動而漂移
Version 3.294.0
Added
SearchTextBatch在每次頁面擷取仍駐留時搜尋多個文字查詢,並為每次命中傳回來源的零起始查詢索引SearchTextBatchEach透過串流回呼提供相同的單趟搜尋,並支援進度回報與取消
Changed
- 單一查詢與批次文字搜尋現共用一個比對核心,在保留區分大小寫、全字拼寫與頁面範圍語意的同時,避免重複的頁面擷取、文字摺疊與命中幾何運算
Version 3.293.1
Fixed
- 網格網底點陣化不再於任何 Delphi 版本上編譯失敗,解決 GDI+ 繪圖器中實數轉浮點數轉換的
E2089 Invalid typecast - 平行批次頁面轉譯現可在 Delphi XE5 與 XE6 上編譯,這些版本中沒有
System.Threading;較舊的工具鏈會像非 Windows 平台一樣退回序列轉譯路徑 - 印表機能力探測不再於舊版 Delphi 上引發不相容型別錯誤,方法是將
SetPrinter呼叫與其餘列印程式碼對齊 - 憑證存放區列舉現可在 RAD Studio 10.3 Rio 上建置,先前在最佳化列舉常式時會因編譯器內部錯誤而中止
Version 3.293.0
Added
- 選擇性內容成員字典現可使用
AnyOn、AllOn、AnyOff與AllOff相容性原則來建立、更新與列舉 - 巢狀 PDF 1.6
/VE可見性運算式透過 Delphi 與 C++Builder 共用的精簡前置表示法支援And、Or與Not
Changed
- 選擇性內容範圍、內容資料流、擷取的頁面、影像、表單欄位與註解現可接受群組控制代碼或成員控制代碼
- 轉譯會先評估有效的
/VE運算式,並對格式錯誤或不支援的運算式退回/OCGs加/P
Fixed
- 巢狀選擇性內容不再能在封閉群組或成員隱藏時讓內容顯示
- 沒有有效選擇性內容群組的成員字典現會讓可見性保持不變,符合 PDF 規範的要求
Version 3.292.0
Added
EnumAttachments現會回報文件與註解附件的建立與修改日期、十六進位總和檢查碼、關聯檔案關係與檔案規格物件編號ValidateAttachmentChecksum依需求對照儲存的總和檢查碼驗證附件承載,而新內嵌的檔案現會自動取得總和檢查碼中繼資料
Fixed
SetEmbeddedFileAFRelationship現可接受與其餘附件 API 相同的 1 起始內嵌檔案索引,包含單一附件文件
Version 3.291.0
Added
DeduplicateResources現會合併載入文件中完全重複的影像、Form、圖樣、網底、函式、ICC 設定檔、字型程式、CMap、Type 3 CharProc、內嵌檔案、中繼資料與 PostScript 資料流- 資源重複資料刪除提供獨立的型別旗標、模擬執行分析、可選的孤立物件收集,以及詳細的雜湊、比較、承載、參考與各分類統計
Changed
- 重複偵測會獨立於索引鍵順序正規化完整的資料流字典,以 SHA-256 對每個候選承載雜湊一次,並在重新導向參考前逐位元組確認相符的貯體
- 完全相等群組保留最低的物件編號與世代以實作確定性輸出,而格式錯誤的直接物件循環與語意字典差異則保持不合併
Version 3.290.0
Changed
PurgeUnusedResources現會跨拼接圖樣、Type 3 字符、註解外觀狀態、ExtGState 軟遮罩群組、影像、網底與巢狀色彩空間計算遞移相依性封閉- 預設清理選項現啟用圖樣、Type 3、外觀、軟遮罩與影像相依性分析,並為需要更窄掃描的呼叫端提供獨立旗標
- 巢狀內容程式與相依性項目會被快取,共用資源範圍在修剪前會私有化,而格式錯誤的循環則受使用中資料流與深度保護限制
Fixed
- 僅透過影像色彩空間、Indexed 基底、Separation 或 DeviceN 替代、Pattern 底層空間、ICCBased 替代或網底字典使用的頁面資源,不再被當作未使用而移除
- 僅由 Type 3 CharProcs、拼接圖樣儲存格、註解外觀或透明軟遮罩群組使用的資源,不再從自身或繼承的範圍中移除
Version 3.289.0
Added
PurgeUnusedResources現會移除未被所選內容圖層參考的具名頁面資源,並可傳回詳細的各分類統計- 資源清理現支援頁面範圍、模擬執行回報、進度與取消、遞迴 Form XObject 分析、淘汰 ProcSet 移除與可選的孤立物件收集
Changed
- 資源分析現遵循 PDF 名稱大小寫區分、繼承的 Form 資源、自訂內嵌影像色彩空間與全部七個標準資源分類
- 重複的 Form 程式會被快取,已用資源集使用排序查詢,而字典項目以遞減順序移除以獲得可預測的大文件效能
Fixed
- 字典項目移除現會使大型字典索引鍵索引失效,讓後續查詢無法傳回過時項目
- 格式錯誤的資料流與未知運算子預設保留完整的資源範圍,而共用或繼承的資源字典在變更前會被複製
Version 3.288.0
Added
- 數位簽章現可發出完整的 DocMDP 認證與 FieldMDP 欄位鎖定結構,並為每個所選簽章提供結構權限報告
- RFC 3161 文件時間戳記、簽章時間戳記、PAdES-B-T 權杖注入、憑證鏈結驗證、OCSP 證據與 DSS 或 VRI 驗證資料現具備完整的撰寫與驗證工作流程
- RichMedia 註解現支援內嵌資產、啟用與停用設定、海報外觀、列舉、擷取與移除
- 海報列印現支援向量頁面拼版、重疊與裁切標記、感知硬邊界的放置與可重複使用的拼接計畫
- 標記表格現發出語意化的 Table、TR、TH 與 TD 結構,具備穩定的識別碼、標題關聯、跨距、重複標題與工件化裝飾
- 檢視器現為文字、選擇、核取方塊、選項按鈕與下壓按鈕欄位提供鍵盤可存取的 AcroForm 編輯,同時將動作分派給主應用程式
Changed
- Type 1 函式式網底與 Type 4 至 7 網格網底現透過原生函式求值與有界網格鑲嵌進行轉譯
- ICCBased 色彩轉譯現跨影像與網底共用快取的轉換,同時保留校正後的色彩空間行為
- 增量儲存現會一致地重建物件資料流與交互參考資料流,而所選簽章會針對自身已簽署的修訂版本進行驗證
Fixed
- SHA-1 簽章時間戳記要求現以 SHA-1 雜湊簽署者的簽章值,而非退回 SHA-256
- 遭拒的欄位鎖定取代不再捨棄先前有效的欄位鎖定設定
- 具有重複外觀狀態名稱的選項按鈕小工具現會保留所選小工具,並讓同層級小工具保持關閉
Version 3.287.0
Changed
- 內嵌影像字典現遵循 PDF 註解、分隔符號、字面、十六進位、陣列與字典邊界,並具備有界巢狀
- 內嵌影像承載現對原始、DCT、ASCII85、ASCIIHex、RunLength 與 Flate 資料使用格式感知的終止
- Flate 承載探索現從內容資料流位移執行一次有界 inflate,並精確計算壓縮位元組,而鏈結的無失真篩選器共用端對端輸出上限
- ASCII85、ASCIIHex、LZW、預測器、色彩設定檔與輔助影像資料流現強制有界的中繼輸出,而不會產生過大的暫時配置
Fixed
- 格式錯誤或截斷的內嵌影像不再讀取超過來源資料、在未終止的值上迴圈,或在解碼器重用間保留過時狀態
- 封裝影像列現會在位元組四捨五入前計算元件位元,防止低位元 RGB 與多列影像的長度不正確
- 資源色彩空間現會在衍生 Lab、間接 ICCBased 與 DeviceN 元件計數,並在嚴格限制下解碼 Indexed 調色盤資料流時保留原始名稱
- 內嵌影像邊界現一致地拒絕無效的維度、位元深度、不支援的篩選器、不安全的篩選器鏈結、壓縮資料流與模稜兩可的結束標記
- Indexed 色彩轉譯現會驗證每次調色盤存取,並拒絕截斷的查詢資料,而非讀取超過已解碼的資料表
- PNG 預測器 10 至 15 現對 Flate 與 LZW 資料流正確解碼,拒絕無效的列篩選器,並在配置前驗證所有列與狀態大小
- JPEG 與 JPEG 2000 承載現會在影像配置前驗證其編碼維度、元件、精確度、標記結構、方塊長度與已解碼的儲存空間佔用量
- 內嵌影像驗證現會限制封裝與展開的點陣圖儲存,並約束 ICC 設定檔、JBIG2 全域與終端篩選器參數
- 包含內嵌結束標記文字的二進位篩選器承載現會繼續到通過有界格式驗證的第一個候選項
Version 3.286.0
Changed
- Content stream tokenization now follows PDF whitespace, comment, delimiter, literal string, hexadecimal string, and name boundaries
- Text splitting and resource replacement now use geometrically grown output buffers for linear processing of large content streams
- Reusable content stream processors now reset derived output and parser state before every
Processcall
Fixed
- Malformed or truncated literal and hexadecimal strings no longer read beyond the source buffer or emit an extra empty token
- Resource replacement now preserves case-sensitive PDF name semantics, accepts optional leading slashes, and updates duplicate mappings deterministically
- XObject and shading operands at the beginning of a stream are now excluded from text output, while unmatched restore operators no longer cancel later saved graphics states
Version 3.285.0
Changed
- LZW encoding now uses constant-time dictionary lookup and buffered stream writes, while decoding uses compact prefix and suffix tables with geometric output growth
- Flate predictor decoding now processes rows directly in the output buffer and supports packed, 8-bit, and 16-bit TIFF samples with arbitrary colour counts
- Stored Deflate streams now write into an exact pre-sized result, and zlib wrappers release temporary buffers safely when compression or decompression fails
Fixed
- LZW code-width changes now follow PDF
EarlyChangesemantics across 9-bit through 12-bit codes, including dictionary resets andEarlyChange=0 - LZW decoding now rejects invalid future codes and truncated bit streams without reading beyond the source buffer
- PNG predictors now use the ceiling byte width of a pixel, preserve previous decoded rows, and safely pad a partial final row
- TIFF predictor decoding now handles 1-bit, 2-bit, 4-bit, 8-bit, and 16-bit components consistently in both LZW and Flate paths
Version 3.284.0
Changed
- Buffer searches now scan fixed 64 KiB blocks, use byte lookup tables for set membership, and preserve the caller's position across every search path
- Unicode, Latin-1, hexadecimal digest, and ARC4 conversions now reserve bounded output once instead of repeatedly growing strings or temporary arrays
- ASCII85 encoding now reads input streams in 32 KiB blocks, while decoding uses exact integer arithmetic and writes directly into a pre-sized output buffer
- MD5 string hashing now avoids a temporary memory stream, digest comparison examines every byte, and ARC4 key scheduling no longer allocates an expanded key array
Fixed
DistanceToAnyBytenow returns the correct offset beyond its first block instead of rereading the same prefix and overcounting skipped bytes- Stream-backed buffer reads now honour the actual byte count returned by custom streams, shrinking results and advancing positions only by bytes received
- Buffer length reductions now clamp the current position, and nil pointer or stream sources behave as empty inputs instead of exposing invalid memory
- Latin-1 decoding now maps the complete byte range 0x00-0xFF instead of replacing bytes 0x7F-0xFF
- ASCII85 decoding now preserves the valid maximum 32-bit group
s8W-!and stops at the first end marker without floating-point boundary loss
Version 3.283.0
Added
TPDFlibSignatureVerifiercan now enumerate signature fields and CMS signers, open files, streams, or strings, and verify a selected field and signer by index or field name- Detailed verification reports now separate cryptographic integrity from signed-revision coverage, current-file coverage, later revisions, strict Contents-gap validation, and native crypto errors
Changed
- Detached CMS validation now streams both ByteRange segments through Windows CryptoAPI in bounded chunks instead of materialising the complete PDF in memory
- Signature fields under nested AcroForm Kids arrays and inherited
/FT /Sigentries are now enumerated with fully qualified names, and direct signature value dictionaries are supported
Fixed
- ByteRange validation now rejects overflow, overlap, truncation, a gap that is not exactly the selected hexadecimal
/Contentstoken, and a signed revision that does not end at its own%%EOF - Certificate lookup no longer falls back to an unrelated embedded certificate when the selected CMS signer identifier has no exact issuer-and-serial match
- Incremental updates that use cross-reference streams now include the cross-reference stream object's own type 1 entry, preventing strict PDF validators from reporting a missing self entry after signing
Version 3.282.1
Changed
- Full saves now rebuild imported object streams from the live object graph, preserve private trailer roots, and retain free-object generations without reusing structural object numbers
- Cross-reference streams now size their offset fields for large files, preallocate their payload, include their own entry, and preserve trailer extension keys
Fixed
- Object-stream packing now writes real
/ObjStmcontainers and type 2 member entries instead of only switching to an xref stream - Garbage collection no longer writes missing object numbers as in-use entries at offset zero and now emits a linked free-object chain in both plaintext and stream cross-references
- Loaded packed PDFs can now be saved repeatedly with packing enabled or disabled without retaining stale object streams, losing live members, or requiring cross-reference repair
Version 3.282.0
Added
- Imported ICCBased colours now use the embedded ICC profile across vector painting, function and mesh shadings, indexed palettes, raw bitmap, CCITT and JBIG2 images, CMYK JPEG images, and JPEG 2000 images
Changed
- ICC transforms now use a bounded Windows Color System lookup table with multilinear interpolation, replacing the temporary PNG round trip used during image rendering
- The renderer now honours content-stream and graphics-state rendering intents, ICCBased
/Range, image/Decode, and original-domain colour-key masks while validating profile channel counts against the PDF colour-space dictionary - Repeated uses of the same profile and rendering intent now share one lookup table across vector colours, patterns, shadings, and images
Fixed
- Encrypted ICC profile streams are now decrypted only while decoded and restored afterward, and embedded profiles are no longer compressed twice while writing image output
Version 3.281.0
Added
- The built-in GDI+ renderer now paints imported PDF function-based shadings and free-form, lattice, Coons, and tensor mesh shadings (types 1 and 4-7), including transparency and clipping
- Shading dictionaries now support component Function arrays, calibrated Lab, CalGray, and CalRGB spaces, Separation and DeviceN tint transforms, PatternType 2 Background fills, and BBox clipping across the GDI+ and Cairo renderers
Changed
- Type 1 shading functions now use bounded adaptive colour sampling with additional quarter-cell probes for higher narrow-feature accuracy and lower work on constant or smooth regions
- PatternType 2 matrices around mesh shadings are now composed exactly once in both GDI+ and Cairo, preserving translated, scaled, and rotated pattern placement
- Mesh colour components are now interpolated in their source colour space before Function evaluation and conversion to RGB, preserving nonlinear functions, DeviceCMYK gradients, and the correct ordering for managed colour transforms
- Coons and tensor surfaces now use bounded device-pixel error subdivision for smoother high-curvature output at large render sizes
- Encrypted shading and Function streams are decoded through the document crypt callbacks, and Type 5 vertex records honour their required byte alignment
Version 3.280.1
Fixed
MergeFileList/MergeFileListFast/MergeFileListStrictleaked aTSmartPDFReader/TSmartPDFDocumentpair (and everything they own) when a non-PDF file appeared in the merge list: the reader and document were constructed before thetryblock that frees them, so a parse failure on the malformed file's content orphaned the already-constructed reader instead of being cleaned up by the surrounding exception handler; construction now happens inside the protectingtryin both the single-file and multi-file prescan paths- Mesh shading parsing (
TPLMeshShading.Parse, shading types 1 and 4-7) leaked the decoded/Functionobject on every parse - every early-exit path and the normal completion skipped freeing it; the function is now released in afinallyblock regardless of howParseexits TPDFlibSignDoc.Closenow nils its smart-reader/document/info fields after freeing them, and the exception paths inOpen,OpenStreamandOpenStringnow release any partially-constructed smart objects instead of only clearing the stream reference, preventing a leak when opening a signing target fails partway through
Version 3.280.0
Added
- Error category enumeration
TPDFlibErrorCategory(ecSuccess/ecStructure/ecSave/ecCrypto/ecGeneric/ecCompliance/ecAcroForm) layered on top of the existing numericLastErrorCodetaxonomy, so callers can classify failures without memorising code ranges; exposed viaTPDFlib.LastErrorCategory,TPDFlib.ErrorCategory(Code)andTPDFlib.ErrorMessage(Code) - Form-field error codes 701-704 (field not found, field read-only, no AcroForm, invalid value) with human-readable messages, letting callers distinguish "field is locked" from "no such field" instead of receiving a single generic failure
SetFormFieldValueForcedforce-write variant that bypasses the read-only guard, used internally bySetFormValues(SkipReadOnly=False)so bulk imports can still overwrite locked fields when the caller explicitly opts out
Changed
SetFormFieldValuenow setsLastErrorCodeto 701/702/703 on failure (field not found / read-only / no AcroForm) instead of returning 0 silently;LastErrorCategoryis a non-consuming read so callers can inspect the category before retrieving the numeric code
Version 3.279.0
Added
ReplacePageRangesreplaces visual page content from another open document without changing the target page count or target page object identities, preserving bookmarks, links, annotations, and form widgets already attached to those pages
Changed
- Cross-document page copying no longer creates and removes an extra placeholder page before importing the requested range
Version 3.278.0
Added
PrintPagesAdvancedapplies copies, collation, duplex, orientation, color, quality, paper-size and input-bin settings to arbitraryPrintPagesrange expressions while retaining one printer profile and one print job
Changed
- Advanced print settings are validated before the job starts, positive print-quality values above the four named presets are applied as DPI, and paper or input-bin identifiers may use the full positive range supported by the corresponding
DEVMODEfields
Fixed
- Damaged cross-reference recovery now dispatches its bounded block reads through the traditional
TStream.Readoverride on Win64, preserving instrumentation and custom-stream behavior while retaining 64 KiB sequential I/O
Version 3.277.0
Changed
- Damaged cross-reference recovery now scans source data in 64 KiB sequential blocks instead of seeking once for every matching character, keeping auxiliary memory bounded while scaling to large PDF files and non-memory streams
- Recovery validates complete indirect-object tokens, skips object-like data inside comments, strings, and streams, confirms stream endings with a following
endobjtoken, preserves headers split across read boundaries, and selects the last valid trailer dictionary
Fixed
- Trailer reconstruction now supports nested dictionaries and delimiter text inside literal strings and is no longer truncated to the first 2048 bytes or the first apparent
>>pair
Version 3.276.0
Added
ActivateWebLinksandActivateWebLinksExscan existing page text once per page and create non-duplicate URI link annotations for HTTP, HTTPS,www., FTP,mailto:, and bare email targets with selectable detection and border options- Generated links use matched-character geometry, precise quadrilaterals for rotated or skewed text when permitted, PDF/A print flags, progress and cancellation support, and selected-page restoration; tagged PDF and PDF/UA documents are protected from incomplete structure-tree updates
Changed
SetAutoCreateWebLinksnow uses the same boundary-aware detector and target normalization when creating links for newly drawn text, addingwww., FTP, and bare email support
Fixed
- Updating annotation
/Contents, name, date, title, or subject properties no longer overwrites the subtype of an existing action dictionary, so URI and other actions remain valid after annotation metadata changes
Version 3.275.0
Added
ExtractPageRangeText,SavePageRangeTextToStream, andSavePageRangeTextToFileextract a parsed page range in one traversal with caller-defined page separators; stream and file output writes UTF-8 data incrementally so large documents do not require a complete document-sized text bufferSetPageBoxRangeandRemovePageBoxRangeapply page-boundary changes across the standard page-range syntax while preserving the caller's selected pageSetPageTransitionRangeandSetPageTransitionRangeExapply legacy or extended presentation transitions to page ranges with per-page progress and cancellation supportGeneratePageThumbnailsrenders requested pages directly into reusable memory and attaches their/Thumbimages without intermediate files or nested progress operations
Version 3.274.0
Fixed
- GDI+ rendering of axial shading patterns now honours the PDF
/Extendarray:SetupGDIPlusPatternpassesWrapModeClampwhen either end is extended (matching the Cairo backend) instead of always usingWrapModeTile, so end colours paint the area outside the gradient axis correctly
Added
- The scroll-hint bubble (
"Page N / M") shown while dragging the vertical scrollbar now auto-hides after 3 seconds of inactivity via aWM_TIMERhandler, so it no longer lingers until a separate scroll event dismisses it ZoomInStep/ZoomOutStepnow snap ontoActualSize(100%),FitWidthandFitPagepercentages when they fall between the current zoom and the next preset on the 14-step ladder, matching the behaviour of professional PDF viewers- The viewer disk page cache writes a build-version marker (
cache.version) and wipes the whole cache root when the library version changes, so a build upgrade never reuses stale bitmaps rendered by an older code path
Version 3.273.1
Fixed
- Object-stream container and xref-stream objects created during save were leaked because they bypassed
TPDFStructure.AddObjectregistration; both call sites now use theNewStreamWithDictownership-tracking factory, eliminating theTPDFStreamleak reported by the test runner underReportMemoryLeaksOnShutdown - Cross-reference stream
/Sizewas off by one: it must be one past the highest object number in the whole file, and the xref stream is itself an indirect object numberedMaxObj+1, so/Sizeis nowMaxObj+2
Changed
- Peephole content-stream optimiser now also removes identity text-matrix operators (
1 0 0 1 0 0 Tm), covering bothcmandTmwith the same six-operand identity check - Mark-sweep GC preserves object 1 (the
/Linearizedparameter dictionary) when the source document was loaded linearized, since that dictionary is never referenced from/Rootbut must survive
Version 3.273.0
Added
- Object-stream packing on save (
TPDFDocument.PackObjectsIntoStreams) collects eligible non-stream indirect objects, serialises them into PDF 1.5 object streams (/Type /ObjStm) with Flate compression, and emits a binary cross-reference stream (/Type /XRef) carrying type-0, type-1 and type-2 entries, reducing the size of saved files 10-40% on object-dense documents TPDFlibSaveOptions.PackObjectStreamsflag plusTPDFlib.SetPackObjectStreams/GetPackObjectStreamsAPI; defaults to enabled, auto-gated by PDF version (1.5+ activates packing and xref streams, 1.4 and below keep the traditional plaintext xref for compatibility), andTPDFlib.GetLastSaveUsedObjectStreamsreports whether the last save actually packed
Version 3.272.0
Added
- Mark-sweep garbage collection of unreferenced indirect objects (
TPDFDocument.GarbageCollectUnusedObjects) walks the object graph from the trailer roots (/Root,/Info,/Encrypt) and removes every indirect object that is not reachable, stopping the file-size growth that accumulates when pages are deleted and their font, content and XObject resources become orphans TPDFlibSaveOptions.GarbageCollectflag plusTPDFlib.SetGarbageCollect/GetGarbageCollectAPI let callers opt in to GC during a full save (defaults to off for backward compatibility), andTPDFlib.GarbageCollectObjectsruns GC immediately and returns the number of orphaned objects removed
Version 3.271.0
Added
- Peephole content-stream optimiser (
TPDFContentPeepholeOptimizer) rewrites a parsed page content stream before Flate compression, removing semantically redundant PDF operators: identitycmmatrices, emptyq/Qpairs, emptyBT/ETobjects, no-op paths terminated bynwith no clip, duplicate graphics-state setters (colour, line width, cap/join, dash, text state), and deadnafter a painting operator - all transforms are output-equivalent so visible page output is unchanged TPDFlibSaveOptions.OptimizeContentStreamsflag and matchingTPDFlib.SetOptimizeContentStreams/GetOptimizeContentStreamsAPI let callers opt in or out of the peephole rewrite duringCompressContent/CompressPage; enabled by default
Changed
TPDFDocument.CompressPagenow forwards the optimisation flag to the page tree so the peephole pass runs insideTPDFPageTree.Compressbefore the existing Flate compression, stacking operator-level reduction on top of byte-level compression
Version 3.270.0
Added
- New
PLParseDefaultAppearancedecodes a/DAdefault-appearance byte string (ISO 32000-2 12.7.4.3) into the font resource name, font size and fill colour, covering therg,kandGcolour operators so form-field and annotation appearance generators can paint text with the author-intended styling
Changed
- Page content-stream assembly (
TPDFRenderer.GetContents) now concatenates multi-part/Contentsarrays through aTStringBuilderinstead of repeatedResult := Result + chunk, removing the O(n^2) string growth that penalised pages with many content-stream parts
Version 3.269.0
Added
- New
BeginMarkedContent/EndMarkedContentwrite inline marked-content sequences with accessibility properties (/Alt,/ActualText,/Lang,/E) directly in the BDC property list per ISO 32000-2 14.9.2–14.9.5, so screen readers and accessibility tooling can read substitute text without a structure-tree entry - Annotation reader exposes
GetAnnotEffectiveBorderimplementing the Errata #287 precedence (border style dict/BSwins over the legacy/Borderarray) and resolving width, style and dash pattern into one call - Signature documents expose
GetSignatureSeedValueto read the seed-value dictionary (/SV, ISO 32000-2 12.7.5.5 Tables 236–237): required filter, allowed SubFilters and allowed digest methods, so a signer can honour the constraints the author embedded GetSignatureFieldLockreads the/LockFieldMDP seed dictionary (Table 238): action (/All,/Include,/Exclude) and the affected field names that must be locked at sign time
Version 3.268.0
Added
- New
PLParsePDFDateparses ISO 32000-2 7.9.4 date strings (D:YYYYMMDDHHmmSSOHH'mm') into a localTDateTime, honouring the mandatoryD:prefix, the field-dependency ladder (each field only when all preceding fields are present) and the UT offset (+/-/Zwith optional apostrophe-minute), returning the local equivalent of the documented instant - Text-string decoding (
PLDecodeTextString) now recognises the PDF 2.0 UTF-8 BOM (EF BB BF) per 7.9.2.2.1, so UTF-8-authored metadata decodes correctly instead of being misread as PDFDocEncoding - File specifications expose
GetFileNamehonouring the PDF 2.0 precedence (Path > UF > F) per Errata #444, plusGetEmbeddedFileStreamandGetRelatedFilesaccessors for the/EFand/RFdictionaries - Annotation readers expose appearance-precedence helpers
GetAnnotNormalAppearance,GetAnnotDefaultAppearanceandGetAnnotOffStateAppearanceimplementing the Errata #23/#34/#42/#170 rules (AP/N is authoritative; DA is the byte-string fallback; Off state lives under the nameOff) - PDF/UA validation reports a new code 10045 when a non-standard structure type fails to terminate at a standard type through the role-map chain (ISO 14289-1:2014 7.1), with cycle protection to a depth of 8
- PDF/A and PDF/UA font audits now validate that embedded CIDFontType2 fonts carry a
/CIDToGIDMapwhose value is either the nameIdentityor a stream, not merely present (ISO 32000-1 9.7.4)
Changed
- Name-tree lookup (
NameTreeLookup) now binary-searches the sortedNamesarray per ISO 32000-2 7.9.6 before falling back to a linear scan, turning large EmbeddedFiles/JavaScript/Dests lookups from O(n) into O(log n) on conformant files - PDF/UA standard-structure-type set expanded with PDF 2.0 additions (
Artifact,DocumentFragment,FENote,MarkedContent,Title) so the role-map no-remap and chain-termination checks recognise the full tag vocabulary
Version 3.267.0
Added
EnumPageContentStatesEx可遞迴列舉 Form XObject 指令,支援可配置的深度、循環保護和深度優先執行順序- 內容快照現在公開呼叫樹識別,包含串流和父代 XObject 資訊、資源範疇識別、Form 走訪狀態以及子代數量
- 獨立內容追蹤器可以註冊範疇字型,並透過矩陣串接和邊界框裁剪初始化隔離的 Form 執行狀態
Changed
- 遞迴內容追蹤獨立選取每個 Form 資源字典,為相容的舊版 Form 繼承呼叫資源,保留繼承的字型識別,並在重複呼叫時快取解碼後的 Form 程式
Version 3.266.0
Added
GetTextRuns傳回的文字段現在攜帶字形原點 (OriginX/OriginY) 和完整的文字矩陣元件 (Tm11/Tm12/Tm21/Tm22/TmDX/TmDY),這些元件是透過在顯示運算子的同時重放 BT、Td、TD、Tm 和 T* 擷取而得,因此取用端無需個別的文字收集處理即可定位字形- 網格著色解碼現在將 Lab、CalRGB 和 CalGray 色彩空間透過色彩管理員進行路由,而非直接退回黑色,從而為非 DeviceRGB 的自由形狀與 Coons 補片產生正確的填滿
- 密件撰寫現在在現有內容移除的基礎上,輸出一個真實的
/Subtype /Redact註解,其中包含/Rect、/IC內部色彩和選用的重疊文字,以便支援密件撰寫的檢視器標記已清理區域 - 函式庫操作透過先前處於休眠狀態的
Logger,在載入與儲存界限處輸出結構化日誌紀錄,帶有 ISO-8601 UTC 時間戳記以及快取的TStreamWriter檔案接收端,不再於寫入每行時重新開啟紀錄檔 - 新增
Tests.Memory測試夾具,保護建立/繪製/儲存/釋放和NewDocument週期免於堆積記憶體退化,且主機台測試執行器現在啟用了ReportMemoryLeaksOnShutdown - EMF 轉譯現在透過
UnknownRecordCount屬性計算未知或私有紀錄的數量,從而使無聲的中繼檔缺漏可被觀察
Changed
- 字典鍵查閱 (
TPDFDictionary.FindIndexByKeyName) 為包含超過 16 個項目的字典建立延遲開放定址雜湊索引,將先前在轉譯器 Resources/ColorSpace/Font/ExtGState 查閱中佔主導地位的線性掃描轉化為 O(1) 探查 - sRGB 伽瑪轉換 (
XYZ2RGB) 使用共用的 4096 項目對照表,而非每個像素進行三次Power(x, 1/2.4)呼叫,且 Lab 到 XYZ 的立方運算現在使用直接乘法;在解碼 Lab 或架構於 ICC 的影像時,這兩者是每個像素主要開銷的來源 - 頁面查閱 (
TPDFPageTree.GetPage) 在重複存取時傳回快取的頁面字典,而非每次呼叫都重新走訪頁面樹 - 內容串流運算子分派 (
ContentOperatorFromName) 按首位元組對 73 個運算子進行分組,將每個 Token 的線性掃描縮減為簡短的殘留比較 - PDF/A 色彩空間稽核現在遞迴處理 Indexed、Separation、DeviceN 和 ICCBased 的基底或替代空間,深度可達 8 層,因此能夠標記隱藏的 DeviceCMYK 著色轉換或裸 Lab 名稱,而不會無聲通過
- 塑形字型結束操作現在走訪繪製時記錄的已使用字形集,而非在每次儲存時將所有 65536 個字形槽掃描四次
- 字串逸出常式 (字面常數字串、XFDF、印章和變數 Token 展開) 透過
TStringBuilder或雙階段配置建立輸出,從儲存和表單匯出熱點路徑中移除了 O(n^2) 的串接操作 - AES 串流加密/解密在迴圈反覆運算中重複使用其區塊緩衝區,而非在每個區塊重新配置
- TrueType 解析器中的複合字形解析以幾何級數增長元件陣列,而非每次增長一個元素
- 網格著色
ReadBits一次性讀取最小覆蓋位元組,且WriteBits預設輸出緩衝區大小,從而消除逐位元重新配置 - 繪製器圓控制點使用預先計算的 kappa 常數,且弧平方計算使用
Sqr代替Power
Fixed
- 修復了
PDFlibParallel中非 Windows 環境下的編譯中斷問題,該問題是由於PDFlibRenderPagesParallel的虛設常式主體簽章與介面宣告不相符所致
Version 3.265.0
Added
- 新增了 59 個 C++Builder 主機台示範,以使 C++Builder 示範套件與 Delphi 保持一致,使涵蓋相同 API 範圍的示範總數從 33 個增加到 92 個
- 將 Demo/C++Builder/index.html 擴充為 35 到 92 個項目,並增加了導覽、色彩 & ICC、條碼 & 媒體以及結構 & 相容性部分
Fixed
- 修復了所有 33 個現有的 C++Builder cbproj 檔案中 DelphiCompile 列表缺失 20 個函式庫單元 (PDFlibMeshShading, PDFlibGraphics, PDFlibWindows, PDFlibParallel, PDFlibLogger, PDFlibMail, PDFlibViewer 等) 的問題,該問題曾導致每個 C++Builder 示範都無法編譯
Version 3.264.0
Added
- 內容圖形狀態快照現在將
Do運算元解析為影像、表單或 PostScript XObject,並報告其資源名稱、物件編號和轉換後的邊界 - 表單快照公開了原始的
/Matrix和/BBox,以及資源、群組、透明度群組和參照表單指示器 - 獨立內容追蹤器可以透過
RegisterXObject預先註冊 XObject 串流
Changed
- 頁面內容狀態列舉現在預編譯選取頁面的 XObject 資源,並根據所有四個轉換後的角計算呼邊界
Version 3.263.0
Added
- 內容圖形狀態快照現在公開目前路徑邊界、目前點、路徑複雜度、待處理的裁剪規則和有效裁剪邊界
- 獨立內容追蹤器可以透過
SetInitialClipBounds初始化顯式裁剪邊界
Changed
- 頁面內容狀態列舉現在遵循延遲的
W和W*裁剪、精確轉換的三次極值、q/Q裁剪還原以及選取頁面的CropBox邊界
Version 3.262.0
Added
- 內容圖形狀態快照現在報告字型書寫模式、精確的單條指令文字位移以及是否解析了字型度量
- 獨立內容追蹤器可以透過
OnMeasureText提供字型測量值
Changed
- 頁面內容狀態列舉現在使用簡單或複合字型度量、水平縮放、間距和垂直書寫規則來推進
Tj、TJ、'和"的文字矩陣
Version 3.261.0
Added
- 內容圖形狀態追蹤現在可以解析頁面
ExtGState資源,包括透明度、混合、疊印、軟式遮罩、裝置控制和內嵌字型參照 TPDFContentStateTracker可以預先註冊外部圖形狀態字典,以便進行獨立的內容程式分析
Changed
- 外部圖形狀態參數現在累加套用,並參與完整的
q/Q儲存與還原快照
Version 3.260.0
Added
- 為結構化內容程式和完整的選取頁面增加了單傳遞有效圖形狀態追蹤
- 快照在每條指令執行之前或之後公開 CTM、文字矩陣、線條樣式、虛線模式、色彩、文字狀態以及圖形狀態堆疊深度
Changed
- 影像放置列舉現在對映所有四個單位正方形角,在旋轉與剪切下產生正確の邊界
Version 3.259.0
Added
- 為互動式表單欄位增加了類型化時間、特殊樣式和任意遮罩輔助常式
- 增加了範圍驗證,具有獨立選用的零安全邊界
- 增加了欄位的總和、平均值、乘積、最小值和最大值計算,支援自動計算順序註冊
Security
- 產生的 JavaScript 字串值現在逸出引號、反斜線、控制字元和 JavaScript 行分隔字元
Version 3.258.0
Added
- 為表單欄位事件、現有動作和動作鏈增加了類型化
SetOCGState動作建立 - 選用內容動作保留了自左向右的狀態變更、重複群組以及選用的選項按鈕關係偏好設定
Changed
- 選用內容動作列舉現在傳回標準的群組控制代碼,這些控制代碼可以透過寫入 API 進行往返作業
Version 3.257.0
Added
- 增加了完整的顯式遠端目標寫入,支援起始為零的頁面、所有標準調整類型、可為 Null 的 XYZ 值以及三態視窗偏好設定
- 增加了針對可攜式檔案、Windows 參數、預設目錄以及開啟或列印作業的完整啟動動作寫入
- 現有動作控制代碼現在可以更新這些負載或將其附加到動作鏈,而無需特定於容器的重複 API
Security
- 遠端移至與啟動動作建構器在修改動作鏈之前現在會拒絕 PDF/A 模式
Version 3.256.0
Added
- 遠端移至動作檢查現在會回報具名與明確目的地、從零開始的目標頁面、適合類型、座標以及縮放值
- 啟動動作檢查現在會回報 Windows 應用程式參數、預設目錄以及開啟或列印作業
- 動作資訊可區分缺少的
/NewWindow偏好設定與明確的 false 值,並識別基於陣列的目標
Version 3.255.0
Added
- 新增用於遠端具名目的地與外部應用程式啟動動作的類型化建構器
- URI 動作建構器現在支援透過標準
/IsMap旗標進行座標對應請求 - 新的動作種類可透過現有擴充建構器介面,適用於生命週期、表單欄位與鏈結動作 API
Version 3.254.0
Added
- 針對先前無專屬範例的函式庫介面,新增了 14 個 Delphi API 涵蓋範圍範例:OutlineBuilder, NamedDestinations, DocumentActions, EmbeddedFiles, LinearizeDemo, BarcodeGallery, XfaFields, TaggedPDF, OutputIntent, HtmlTextFlow, RichMediaAnnotations, MailSendDemo, TextBlockExtraction 以及 PadesDssDemo
- 在 Delphi 範例索引中新增了導覽區段、色彩 & ICC 區段、條碼與媒體區段以及結構 & 合規性區段,使列出的範例總數從 56 個增加到 92 個
- 為先前未附帶 Readme.en-us.html 的 20 個範例新增了該指南
Changed
- 在所有 Delphi 範例原始碼中套用了專案的 Formatter.config,使運算子間距、縮排與關鍵字大小寫遵循統一風格,並將 NewLineBeforeThen 設定為 False,使 If...Then 保持在單行
- 強化了經典 GUI 範例中的錯誤處理:現在會一致檢查 SaveToFile 的回傳值,TPDFlib 與次要物件生命週期始終受 try/finally 保護,且失敗訊息中包含 LastErrorCode
Fixed
- 修復了 ImageToPdf 中相反的 SaveToFile 極性(曾將成功視為失敗),並防止在儲存失敗時 AddTrueTypeSubsettedFont 開啟過期檔案
- 修復了 CreateWithImageToStream、DoInTheStream、CanvasText、ExtractText、ExtractImage、PdfDecrypt、PdfEncrypt 與 PdfPermission 中的資源洩漏問題,這些問題曾導致 TPDFlib、TStream、TBitmap、TOpenDialog 或 TStringList 實例可能在例外路徑中逸出
- 移除了 AddFormattedTitle(未使用的 RectParts 配置、圍繞 StrToFloatDef 的冗餘 try/except)與 MultiFunction(被覆寫的 SetTextSize 呼叫)中的無用程式碼
Version 3.253.0
Added
- 新增用於執行緒、聲音、影片、選用內容、呈現、轉場與 3D 檢視動作的類型化動作詳細資訊
- 新增可重複使用的動作控制代碼查閱與有序的選用內容狀態列舉
- 新增完整的 PDF 轉場紀錄,涵蓋取代、飛入、推擠、覆蓋、揭開與淡入淡出樣式
Fixed
- 擦除與閃爍轉場現在將其方向儲存在
/Di中,從頁面字典中讀取頁面顯示持續時間,並清除轉場與計時項目 - 標準 of PDF 1.5 之前的轉場樣式不再強制要求輸出 PDF 1.5 版本
Version 3.252.0
Added
- 新增單次掃描的表單欄位動作探索,其中包含跨主要、小工具與欄位觸發器的類型化動作詳細資訊
- 新增針對互動式表單的完整計算順序列舉、逐欄位查閱與移除功能
- 以計算順序與動作計數擴充了批次表單欄位快照
Changed
- 小工具生命週期觸發器現在支援頁面開啟、頁面關閉、頁面可見與頁面隱藏動作,並具備所需的 PDF 1.5 版本處理
Version 3.251.0
Added
- 新增跨舊式目錄項目與現代名稱樹的單次掃描具名目的地列舉,並包含已解析的頁面與檢視參數
- 新增具名目的地移除、完整的按鈕標題、按鈕文字定位以及表單欄位對應名稱
- 以對應名稱、按鈕標題與按鈕文字位置擴充了批次表單欄位快照
Fixed
- 名稱樹編輯現在支援直接目的地值,並使用無歧義的多節點索引編碼
Version 3.250.0
Added
- 新增單次掃描的表單欄位快照,其中包含欄位識別碼、類型、頁面、旗標、值與 Choice 狀態
- 新增類型化 Choice 欄位旗標查詢,以及經過驗證的選取索引與頂部可見索引存取子
Fixed
- 單選 Choice 欄位不再保留多選
/I陣列,且從多選切換到單選現在會以字串值取代舊的/V陣列
Version 3.249.0
Added
- 新增單次有狀態的文字搜尋走訪,使應用程式可以迭代快取的符合項,而無需提取頁面兩次
- 新增批次表單值匯出以及基於名稱的套用,並帶有選用的唯讀欄位保護
Version 3.248.0
Added
- 新增保留的 Viewer 選取,包含頁面空間幾何形狀、提取的文字、列舉、清除以及可否決的選框事件
- 新增精確的目前視埠點陣圖擷取和包含持久疊加層的檔案輸出
Version 3.247.0
Added
- 新增用於使用者表單編輯與標註啟用的獨立 Viewer 控制項
- 為文字與選擇表單編輯器新增了可設定的前景色
Version 3.246.0
Added
- 新增類型化線條結尾樣式、形狀內部色彩、連結高亮模式、FreeText 對齊方式、Text 標註開啟狀態以及 Caret 符號
- 標註 Setter 會驗證相容的子類型,並在需要時自動提高最低 PDF 版本
Version 3.245.1
Fixed
- 修正了 FastReport 匯出的頁面大小與備忘錄配置,使 A4 報表保留其預期比例,文字保持在備忘錄邊界內,且未設定的備忘錄框線保持隱藏
Version 3.245.0
Added
- 新增了
OnPassword,以便在加密文件拒絕初始認證資料後,應用程式可以提供另一個密碼 - 密碼重試現在一致適用於檔案、串流與字串載入,揭露下一次嘗試次數,並允許處理常式取消
Security
- 密碼回呼限制為總共 16 次嘗試,且每次重試都使用全新的解析器與解密狀態
Version 3.244.0
Added
- 新增了
SetXMPPropertyEx,用於安全地在呼叫者定義的 XMP 命名空間中寫入純量屬性 - 自訂 XMP 值透過 XML DOM 進行轉義,重複寫入會取代相符的命名空間屬性,且無效或保留 XML 名稱會被拒絕
Version 3.243.0
Added
- 新增用於關閉前、儲存前、儲存後、列印前與列印後觸發器的類型化文件生命週期動作
- 新增類型化頁面開啟與關閉動作,共享支援 URI、具名、JavaScript、表單與目的地動作建構器
- 為每個文件與頁面生命週期觸發器新增了動作檢查與移除方法
Version 3.242.0
Added
- 新增了
SaveChanges以將變更附加到原始載入的檔案中,並在重複增量儲存時自動重新載入更新後的 xref 鏈 SaveChanges在寫入前驗證重新載入密碼,並在重新載入後保留所選的公用文件控制代碼
Changed
AppendToFile現在會拒絕目前長度與載入來源不一致的目標,防止將過時的增量偏移量附加到已被外部變更的文件中
Version 3.241.0
Added
- 新增了
GetLastOutline和GetLastChildOutline以直接存取書籤清單的末尾 - 新增了
GetOutlineChildCount和GetOutlineSiblingIndex,用於輕量級書籤樹檢測而無需配置完整的樹快照
Version 3.240.0
Added
- 新增了
SaveAllAttachmentsEx,支援覆寫、跳過和自動重新命名衝突原則,並提供針對每個附件的命名回呼 - 附件匯出現在將要求的名稱縮減為安全的分葉名稱,並保護 Windows 保留的裝置名稱
Fixed
- 修正了
SaveAllAttachments僅計數但未配置和填入附件快照,導致未寫入檔案即返回的錯誤
Version 3.239.0
Added
- 新增了
OnPageMouseDown、OnPageMouseMove和OnPageMouseUp,使 Viewer 裝載容器可以接收基於 1 的頁碼和自上而下的 PDF 點座標,不受縮放、捲動和檢視旋轉的影響 - 新增了
RegionAtClientPoint、ActiveRegion和OnActiveRegionChange,以便在指標進入或離開時區分連結、非連結註解和表單欄位 - 新增了
CreatePDFlibViewerDefaultPopupMenu和InstallPDFlibViewerDefaultPopupMenu,將現有的 Viewer 動作類別組合為就緒的快顯功能表,用於複製、縮放、貼合、旋轉、導覽、儲存和列印
Version 3.238.0
Added
- 新增了
OnOperationProgress,提供類型化的操作種類、生命週期階段、目前和總單位、百分比及詳細文字,同時保留經典的OnProgress百分比回呼 - 載入、儲存、搜尋、合併以及頁面轉譯的檔案、串流和字串進入點現在會回報啟動和結束階段;具有中間進度的操作還會回報
opRunning - 在
opStarting或opRunning期間設定Cancel會啟用現有的Abort狀態,為新舊呼叫端提供統一的取消路徑
Fixed
LoadFromFile現在在清理後會保留密碼錯誤的錯誤代碼 404,而不是將其覆寫為一般載入錯誤 401
Version 3.237.0
Added
- 新增了
SearchTextEach和TPDFlibSearchHitEvent,以立即發出每個文字比對項目,而無需配置結果陣列或調整其大小 SearchText和SearchTextEach現在透過OnProgress回報頁面進度,並遵循Abort和回呼取消;回呼取消會使用現有的中止狀態,直到呼叫ResetAbort- Viewer 搜尋面板和搜尋醒目提示層現在一次性消耗串流 API,移除了以前 256 列和 512 個醒目提示的限制
Fixed
- 全字比對搜尋現在會越過同一文字區塊中較早出現的子字串,以尋找後面邊界正確的比對項目
Version 3.236.0
Added
- 新增了
GetPrinterCapabilities,用於在不啟動列印工作的情況下擷取即時印表機驅動程式的快照 - 類型化的
TPDFlibPrinterCapabilities結果包括紙張 ID、名稱和公釐尺寸、紙匣 ID 和名稱、雙面列印、彩色、橫向和順序收集支援、印表機連接埠以及驅動程式回報的最大份數 - 忽略紙張或紙匣元資料的驅動程式仍會傳回包含空陣列的其餘功能,而無效的印表機名稱則傳回完全清除的快照
Version 3.235.0
Added
- 新增了
SendDocumentByMail,用於將載入的文件儲存為暫存 PDF,並透過內建的 Windows CDO 提供者將其作為 SMTP 附件進行傳送 - 新增了參照計數的
IPDFlibMailProvider擴充點,以便應用程式可以提供其他傳輸方式、支援非 Windows 主機以及在沒有網路存取的情況下測試郵件工作流程 - 每次傳送都使用隔離的暫存目錄,清理附件的顯示名稱,並在提供者傳回後移除 PDF 及其目錄;
GetLastMailError會回報驗證、儲存、傳輸和平台失敗
Version 3.234.0
Added
- 在印章、頁首和頁尾文字中新增了變數預留位置:
<%PageNo%>、<%TotalPages%>、<%ShortDate%>、<%LongDate%>、<%ShortTime%>和<%LongTime%>,會在每一頁上與經典的 & 權杖一同展開 - 任何自訂
<%name%>預留位置都將透過新的OnCalcVariable事件進行解析,該事件接收名稱與頁碼並提供替代內容——無需預先處理文字即可加蓋流水號、批次代碼和用戶端欄位印章;若沒有處理常式,未知的預留位置將保持原樣
Version 3.233.0
Added
- 文字擷取中新增了上標/下標偵測:新的
GetTextBlockVAlign會回報每個擷取的文字區塊相對於其視覺列的基準線分類 (0 = 基準線, 1 = 上標, 2 = 下標),以便識別化學公式、指數和註腳標記 - 當文字區塊明顯小於視覺列的主導文字,且其垂直中心在文字高度內位於主導中心之上或之下時,該文字區塊即被歸類為上標或下標
Version 3.232.0
Added
- 在文字擷取中新增了字元級分詞:
SetTextExtractionOptions(17, 1)會在字元前進距離明顯大於文字段中位數字形前進距離時,將不包含空格字元的顯示文字段重新拆分為單字——在GetPageText模式 7 和 9-11 下,將整列繪製為帶有字距調整間隙(代替空格)的單一操作子的文件現在可以擷取為獨立的單字 - 前進距離陣列與加寬後的文字保持對齊,因此文字區塊四邊形和每個字元的寬度輸出保持一致
Version 3.231.0
Added
- 新增了保留版面配置的固定網格文字匯出:
GetPageText(11)將頁面幾何結構對映到等寬字元網格——列按基準線聚集,每個文字區塊都落在根據平均字元寬度計算出的欄上,較短的儲存格用真實空格填補——因此表格和表單在純文字檢視器、終端機和 diff 中保持其視覺對齊,而不依賴定位點 GetPageText的參考頁面現在說明了閱讀順序 (9)、定位字元分隔表格 (10) 和固定網格 (11) 模式
Version 3.230.0
Added
- 在文字擷取中新增了去連字號功能:
SetTextExtractionOptions(16, 1)在GetPageText模式 7 和 9 的面向列輸出中,重新拼接跨列拆分的連字號單字(列尾的 "inter-" 後接 "national" 將合併為 "international") - 該啟發式演算法僅在連字號前是字母且下一列以小寫字母開頭時才進行合併,因此數字範圍、專有名詞和句首大寫字母會保留其連字號
Version 3.229.0
Added
- 在
TPDFlibViewer控制項中新增了OnBeforeSnapshot事件:它在擷取快照拖曳前帶拖曳區域觸發,設定 Handled 可以取消預設的剪貼簿擷取,以便應用程式自己處理該區域 - 公開了
PrefetchEnabled:背景預先轉譯工作執行緒現在可以在執行階段關閉和開啟(工作執行緒會立即停止並在開啟的文件上重新啟動) - 公開了
DiskCacheMaxDocuments:跨工作階段磁碟頁面快取修剪前保留的文件數量現在是可調的(預設為 10)
Version 3.228.0
Added
- 為
TPDFlibViewer控制項新增了精確導覽:GoToPagePoint跳轉到頁面並將給定的頁面點捲動到視埠左上角,以便連結目標和搜尋比對項目準確呈呈現檢視中 - 新增了程式化捲動控制:
ScrollBy像素步進、讀寫HScrollPos/VScrollPos屬性(非常適合在同一文件上同步兩個並排的檢視器),以及在連續模式下回報每頁捲動錨點的GetScrollPosForPage - 新增了公用座標轉換
ClientPointToPage和PageRectToClientRect,在縮放、旋轉和捲動時進行用戶端像素與頁面使用者空間之間的轉換;內部命中測試現在共享繪製路徑的精確幾何結構,且同樣適用於無父級 (無頭) 控制項
Version 3.227.0
Added
- 在
TPDFlibViewer控制項中新增了檢視狀態事件:OnZoomChange在每次有效縮放變動(明確縮放、預設步進、在調整大小、旋轉或 DPI 變更時重新計算貼合模式)時觸發,而OnHScroll/OnVScroll則跟隨捲動位置,使工具列和狀態顯示無需輪詢即可保持同步 - 拖曳垂直捲動軸滑塊現在會顯示一個懸浮的 "Page N / M" 氣泡,用於預覽檢視將落在的頁面——這在長文件中非常有幫助;
ScrollHintEnabled屬性 (預設開啟) 可將其關閉
Version 3.226.0
Added
- 在
TPDFlibViewer控制項中完成了填入並儲存的循環:SaveToFile和SaveToStream將顯示的文件 (包括已認可的表單編輯) 寫回磁碟或串流 (任何開啟的就地編輯器會先認可) - 多行文字欄位現在可以在適當的多行備忘錄中編輯:Enter 插入分列符,Ctrl+Enter 認可,Escape 取消;單行欄位保持簡單的 Enter 認可行為
- Tab 和 Shift+Tab 使就地編輯器在文件的可編輯文字和選擇欄位中循環,並遵循每個欄位的頁面位置;
FocusNextFormField以程式化公開相同的導覽
Version 3.225.0
Added
- 為
TPDFlibViewer控制項新增了預設階梯縮放:ZoomInStep和ZoomOutStep將縮放對齊到標準的預設序列(1、5、10、25、50、75、100、150、200、400、800、1600、2400、3200 百分比),從目前生效的縮放開始,使貼合模式自然地步進;工具列的縮放動作現在也使用相同的階梯 - Ctrl+滑鼠滾輪現在會沿著預設階梯進行縮放,而一般滾輪滾動則保持捲動
- 新增了鍵盤快速鍵:Ctrl+'+'/'-' 步進縮放,Ctrl+1/2/3 切換到實際大小、適合寬度和適合頁面,Shift+Up/Down 跳轉到第一頁和最後一頁
Version 3.224.0
Added
- 新增了具有 Delphi、DLL 和 ActiveX 進入點的
CreateSelfSignedCertificate:產生自我簽署 RSA 憑證(SHA-256 簽章,可設定的主體、有效期和金鑰長度),並將其連同私鑰一起匯出到受密碼保護的 PFX 檔案,已準備好用於SignFile和簽署處理 API——因此無需外部憑證授權單位即可建置和測試簽署工作流程 - 該憑證是在一個拋棄式金鑰容器中建立的,該容器在匯出後會被刪除;只有 PFX 會保留金鑰材料;自我簽署憑證用於測試和內部文件——除非明確安裝,否則檢視器會將其標記為不可信
Version 3.223.0
Added
- 在可組合浮水印層中新增了
TPDFlibShapeWatermark:矩形、圓形、橢圓、多邊形、貝茲曲線鏈和直線可透過與文字和影像浮水印相同的ApplyWatermark入口點,以填滿和描邊色彩、線寬及不透明度蓋印到頁面範圍上 - 矩形、圓形和橢圓形狀根據 Width/Height 自適應大小;多邊形、曲線和直線形狀從
SetPoints(本機 X,Y 對)獲取其幾何形狀,因此九點 Position 網格和自訂放置適用於每種形狀類型;退化的幾何形狀(點數過少)將被拒絕
Version 3.222.0
Added
- 新增了具有 Delphi、DLL 和 ActiveX 入口點的
AddLinkToEmbeddedPDF:一個頁面熱區,使用 ISO 32000-1 §12.6.4.4 的標準內嵌式移至 (/GoToE) 動作及選配的新視窗請求,開啟目前文件中內嵌 of PDF(透過其 EmbeddedFiles 名稱)並跳轉到其中的選定頁面;文件版本自動提升至 PDF 1.6 GetAnnotActionInfo及其大綱/表單欄位同級項現在可以辨識內嵌式移至動作,報告新的akGoToE類型以及內嵌的目標名稱、父/子目標關係、選配的文件規範和 /NewWindow 旗標
Version 3.221.0
Added
- 新增了具有 Delphi、DLL 和 ActiveX 入口點的
SetSignProcessAppearanceText:數位簽章現在可以顯示自動產生的可見文字外觀,該外觀由簽署者姓名、原因、位置和簽署日期組成,並透過位元遮罩選擇選配的描述性標籤("Signed by:"、"Reason:" 等) - 文字組塊在簽章欄位矩形內以 Helvetica 字型和可設定色彩進行排版;字型大小 0 會將行自動符合至欄位;透過
SetSignProcessFieldImageFromFile設定的欄位影像保留優先權,且文件時間戳記程序會忽略文字外觀
Version 3.220.0
Added
- 在
TPDFlibViewer控制項中新增了互動式表單填寫:按一下核取方塊或選項按鈕可切換其狀態,按一下文字或選擇欄位會在該欄位上開啟一個就地編輯器(Enter 認可,Escape 取消,離開編輯器認可);唯讀欄位保持不變,修改後的頁面會自動重新轉譯 - 每次寫入都會觸發新的
OnFormFieldValueChanged事件,且帶有FormHighlightColor的HighlightFormFields會在每個可填寫區域上繪製半透明背景,以便使用者發現表單欄位 - 新增了程式化對應常式
FormFieldAtPagePoint、GetFormFieldPageRect、ToggleCheckBoxField、SetFormFieldValueAndRefresh、BeginEditFormField和CommitInplaceEditor,無需滑鼠輸入即可驅動相同的機制
Version 3.219.0
Added
- 在
TPDFlibViewer控制項中新增了註解互動:按一下非連結註解會觸發新的OnAnnotClick事件,並帶有頁面、註解索引和子類型,而AnnotAtPagePoint以程式化方式公開點選測試(跳過關聯的快顯視窗) - 滑鼠懸停在註解上現在會將其 Contents 文字顯示為控制項的提示(
AnnotHints開關預設開啟,與標準ShowHint屬性配合使用) - 新增了
SaveAnnotAttachmentToFile以將 FileAttachment 註解的內嵌檔案寫入磁碟,從而在檢視器中完成按一下儲存附件的工作流程
Version 3.218.0
Added
- 在
TPDFlibViewer控制項中新增了跨工作階段的磁碟頁面快取:設定DiskCacheFolder會將轉譯的頁面持久化至磁碟,如此最近檢視的文件即可立即重新開啟而無需重新轉譯 - 快取的頁面透過文件路徑、大小和最後寫入時間的指紋進行鍵值標記,因此編輯檔案會自動使過期的頁面失效;快取最多保留十個文件,並清除最久未使用的文件
- 新增了
DiskCacheHits計數器,報告磁碟快取節省了多少次頁面轉譯
Version 3.217.0
Added
- 新增了
PDFlibViewerActions單元,其中包含二十個適用於TPDFlibViewer的現成TAction後代,使得工具列和功能表無需膠水程式碼即可運作:頁面導覽(第一頁/上一頁/下一頁/最後一頁)、縮放(放大/縮小/適合寬度/適合頁面/實際大小)、檢視旋轉(順時針/逆時針)、列印、檔案開啟和另存新檔對話框、複製選定文字以及五個滑鼠工具模式開關 - 每個動作都透過其
Viewer屬性指向一個檢視器,並自動保持其啟用狀態(文件開啟、頁面位置、存在選取內容)和選取狀態(啟用的縮放適合或滑鼠工具)為最新;所有動作都註冊在 Action List 編輯器的 losLab PDF 類別中 - 新增了
TPDFlibViewer.EffectiveZoomPercent,用於報告實際生效的縮放比例(包括計算出的適合寬度/適合頁面係數),以便縮放步長可以基於此建置
Version 3.216.0
Added
- 在
TPDFlibViewer控制項中新增了搜尋結果醒目提示:HighlightSearchHits搜尋整個文件並在每個符合項上繪製一個半透明條,該條在捲動、縮放和旋轉時保持原位,並包含ClearSearchHighlights、SearchHighlightCount和可設定的SearchHighlightColor TPDFlibSearchPanel.RunSearch現在還會在附屬的檢視器中繪製符合條(新的HighlightInView屬性預設開啟,可將其關閉),使得搜尋結果在頁面上可見,而不僅僅在符合項目清單中
Version 3.215.0
Added
- 透過新的
ViewerMode屬性在TPDFlibViewer控制項中新增了滑鼠工具模式:vmSelect文字選取(預設)、vmHand使用抓取遊標拖曳平移(一般按一下仍會追蹤連結)、vmZoom選區縮放(放大拖曳的區域以填滿視埠)、vmSnapshot區域擷取到剪貼簿,以及vmHighlight持久半透明區域醒目提示 - 新增了
CaptureRegion以將任何用戶端區域(頁面加醒目提示)轉譯到呼叫者擁有的點陣圖中,新增了用於快照處理的OnSnapshot事件和SnapshotToClipboard開關,以及帶有可設定HighlightColor的AddHighlightRegion/ClearHighlightRegions/HighlightRegionCount,用於在縮放、旋轉和導覽後仍保留的頁面錨定醒目提示
Version 3.214.0
Added
- 在
TPDFlibViewer控制項中新增了列印功能:PrintDoc顯示標準 Windows 列印對話框(印表機選擇、頁面範圍、份數、逐份列印)並將工作交給函式庫的列印引擎,而PrintDoc(False)在沒有任何 UI 的情況下將整個文件列印到預設印表機 - 新增了
PrintDocRange,用於具有明確印表機名稱、頁面範圍、份數和逐份列印旗標的完全程式化檢視器列印
Version 3.213.0
Added
- 在
TPDFlibViewer控制項中新增了檢視旋轉:RotateClockwise90和RotateAntiClockwise90以 90 度為步長旋轉顯示的頁面,且ViewRotation屬性直接讀取或設定角度(0、90、180 或 270) - 旋轉是純粹的檢視屬性:文件絕不會被修改,連結按一下和文字選取在任何角度下都能繼續運作,適合寬度和適合頁面縮放模式會適應旋轉後的頁面形狀,且開啟新文件會將檢視重置為 0 度
- 旋轉後的頁面點陣圖按角度進行快取,因此在角度之間切換時會重用以前的轉譯,而不是重新轉譯
Version 3.212.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受簡單的 FormCalc 樣式述詞選擇器,例如$data.Receipt.Detail.[Total_Price > 200].Description,並在述詞選擇子集時更新每個符合的資料節點
Version 3.211.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受帶有數字或萬用字元出現次數的 Data DOM 類別選擇器#dataGroup和#dataValue,允許基於類別的路徑,例如$data.Receipt.#dataGroup[0].#dataValue[0]
Version 3.210.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受非記錄處理封包中的$record根,因此$record.Tax和$record/Detail[0]/Total_Price等路徑會從外部資料記錄元素中解析
Version 3.209.0
Changed
- 改進了 XFDF 註解交換:註解匯出現在從 PDF 註解
/BS值寫入標準邊框樣式屬性width、style和dashes,註解匯入則會在插入的註解上還原這些屬性
Version 3.208.0
Changed
- 改進了 XFDF 註解交換:註解匯出現在從 PDF 註解
/CreationDate和/CA值寫入標準creationdate和opacity屬性,註解匯入則會在插入的註解上還原這些屬性
Version 3.207.0
Changed
- 改進了 XFDF 註解交換:註解匯出現在從 PDF 註解
/F值寫入標準flags名稱,註解匯入則會將這些名稱還原到插入的註解旗標中
Version 3.206.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受直接子萬用字元選擇器,例如$data.Receipt.*.Total_Price,以便在不選擇父節點上同名欄位的情況下讀取或更新符合的子分支
Version 3.205.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受後代選擇器,例如$data..Total_Price和$data.Receipt..Total_Price,以讀取或更新第一個符合的後代資料節點
Version 3.204.0
Changed
- 改進了 XFA 資料集 SOM 路徑的相容性:
GetXFAFormFieldValue和SetXFAFormFieldValue現在接受路徑中的parent屬性,例如$data.Receipt.Detail[1].parent.Tax,以讀取或更新選定節點的父級同級資料
Version 3.203.0
Changed
- 改進了 XFA 資料集 SOM 出現次數處理:
GetXFAFormFieldValue和SetXFAFormFieldValue現在支援[*]選擇器,例如$data.Receipt.Detail[*].Total_Price,以讀取或更新每個符合的重複資料節點
Version 3.202.0
Changed
- 改進了 XFA SOM 路徑的相容性:XFA 資料集和範本欄位 API 現在會在以斜線分隔的欄位路徑中保留原義句點,並接受以點分隔的 SOM 路徑中的逸出句點,例如
Line\.Item
Version 3.201.0
Changed
- 改進了 XFA 資料集路徑的相容性:XFA 欄位值 API 現在接受標準資料 SOM 根(例如
$data/...、xfa.datasets.data/...和xfa.datasets/...)之後以斜線分隔的路徑
Version 3.200.0
Changed
- 改進了 XFA 資料集 SOM 相容性:XFA 欄位值 API 現在接受標準
!data...簡寫形式,包括以斜線分隔的!data/...路徑
Version 3.199.0
Changed
- 改進了 XFA 範本路徑的相容性:範本編輯 API 現在接受由 XFA 欄位名稱列舉傳回的以斜線分隔的欄位路徑,包括
$template/...路徑
Version 3.198.0
Changed
- 改進了 XFA 資料集命名空間的相容性:當資料集封包內的商務資料使用其自己的命名空間字首時,欄位值 API 現在透過本機 XML 名稱讀取和更新資料節點,且欄位名稱列舉會傳回不含字首的路徑
Version 3.197.0
Changed
- 改進了 XFDF 註解交換:註解匯出現在包含 PDF
/NM和/M中的通用name和date屬性,註解匯入則會在插入的註解上還原這些值,且SetAnnotStrProperty現在接受標記 104 用於註解修改日期
Version 3.196.0
Changed
- 改進了 XFA 欄位名稱列舉:欄位清單 API 現在掃描資料集封包中的每個頂層資料記錄,並傳回葉資料欄位,而不將容器群組新增為欄位
Version 3.195.0
Changed
- 改進了 XFA 資料集相容性:XFA 欄位值 API 現在可以讀取和更新完整 XDP 封包,只要其資料集封包使用無字首的
data元素
Version 3.194.0
Fixed
- 改進了 XFA 範本欄位更新:XFA 範本欄位 API 現在接受標準範本 SOM 根,例如
$template和xfa.template,且完整 XDP 串流中僅限範本的變更會被正確儲存
Version 3.193.0
Changed
- 改進了 XFA 欄位定址:除了相對欄位路徑外,XFA 欄位值 API 現在還接受標準資料 SOM 根,例如
$data和xfa.datasets.data
Version 3.192.0
Changed
- 改進了 XFA XML 封包處理:帶有 UTF-16 位元組順序標記或 UTF-16 XML 位元組模式的 XFA 串流現在會在 XML 解析之前進行解碼,因此透過 XFA 欄位讀寫 API 仍可使用 UTF-16 編碼的表單值
Version 3.191.0
Changed
- 改進了 XFA 封包建置:當文件尚無表單資料時,
SetXFAFromString現在會建立所需的AcroForm容器,在儲存完整的 XFA 封包時取代過期的已解析 XFA 狀態,並透過 XFA 欄位讀寫 API 保持儲存的封包可用
Version 3.190.0
Changed
- 改進了 XFDF 註解交換:註解匯出現在從 PDF
/CRGB 陣列中寫入通用color屬性,註解匯入現在將color="#RRGGBB"值還原到插入的註解色彩陣列中
Version 3.189.0
Added
- 新增 XFDF 註釋交換 API:
ExportAnnotationsToXFDF、ExportAnnotationsToXFDFString、ImportAnnotationsFromXFDF和ImportAnnotationsFromXFDFString現在可以針對文字樣式註釋批註讀寫 ISO 19444<annots>資料,包括頁面、矩形、標題、主題和純內容資料
Version 3.188.0
Changed
- 改進 XFDF 富文字欄位匯入:帶有
<value-richtext>的欄位現在會保留欄位RV值中的富文字 XML,同時在存在純文字<value>後備方案時仍然套用該後備方案
Version 3.187.0
Changed
- 改進多選選取欄位的 XFDF 表單資料交換:重複的
<value>元素現在會匯入至已選取值陣列中,且匯出多選選取欄位現在會為每個已選取項目寫入一個<value>元素,而不是將其扁平化為單個逸出文字節點
Version 3.186.0
Changed
- 改進富文字欄位的 XFDF 表單資料匯出:帶有
RV富文字值的欄位現在包含一個<value-richtext>元素,同時保留純文字<value>後備方案
Version 3.185.0
Changed
- 改進富文字欄位的 XFDF 表單資料匯入:當欄位提供
<value-richtext>但沒有純文字<value>時,匯入器現在會擷取 XHTML 文字內容並將其套用至匹配的 AcroForm 欄位,而不是略過該欄位
Version 3.184.0
Changed
- 改進 XFDF 表單資料交換:匯出現在使用帶有
xml:space="preserve"的標準 XFDF 命名空間,針對階層式 AcroForm 名稱發出巢狀<field>元素,略過非終端父欄位值,將檔案匯出寫入為 UTF-8,並匯入支援巢狀欄位、單引號屬性、CDATA、XML 實體和數值字元參照的具彈性空白字元之 XFDF
Version 3.183.0
Added
- 新增
SanitizeDocument(Flags),可透過一次呼叫清除敏感內容:刪除所有全域 JavaScript,刪除目錄 OpenAction,清除每個註釋中的 /A 動作,清空 Author/Subject/Keywords/Creator/Producer 中繼資料(/Info 和 XMP),並可選擇刪除所有註釋;旗標位元SANITIZE_JAVASCRIPT、SANITIZE_ACTIONS、SANITIZE_METADATA、SANITIZE_ANNOTATIONS、SANITIZE_OPEN_ACTION可組合使用;SANITIZE_ALL套用所有清除操作;解決了敏感資訊洩漏的經典漏洞,即雖然透過遮罩刪除了可見內容,但仍能復原中記資料或隱藏的指令碼 - 新增
TPDFAnnots.RemoveAnnotAction(Index)用於從單個註釋中清除 /A 動作字典(由 SanitizeDocument 使用,也可單獨使用)
Version 3.182.0
Added
EnumPageElements傳回的影像元素現在帶有其真實的放置矩形(Left/Top/Right/Bottom)而不是零;由新的TPDFContentProgram.EnumImagePlacements方法支援,該方法走訪內容串流並追蹤 CTM (cm/q/Q),將每個Do運算子的 1x1 單位正方形對映到頁面座標中- 新增四個展示 Demo:DocumentProperties(DocInfo/頁面方框/旋轉/轉換/檢視器偏好設定/XMP 雙向轉換)、FormProperties(逐欄位屬性網格:類型/值/唯讀/MaxLength/MultiLine/描述)、SignatureValidator(列舉簽章欄位 + 驗證 + 簽署者憑證)、Reader(帶有開啟/導覽/縮放/複製文字功能的 VCL TPDFlibViewer)
Version 3.181.0
Added
- 新增
SetXMPProperty,透過公開外觀公開了現有的結構感知 XMP 引擎 (PDFlibXMP):可透過命名空間 + 鍵設定任何 Dublin Core (dc:)、XMP Basic (xmp:)、Adobe PDF (pdf:)、PDF/A ID (pdfaid:)、PDF/UA ID (pdfuaid:) 或 XMP Media Management (xmpMM:) 屬性,而無需手動撰寫 RDF XML - 新增
ImportFormDataFromFDF/ImportFormDataFromFDFString,用於解析 FDF /Fields 陣列(每個為<< /T (name) /V (value) >>)並透過名稱將每個值套用至匹配的 AcroForm 欄位,從而反轉 EscapePDFText 八進位/括號跳脫;填補了不對稱的僅匯出缺口 - 新增
ExportFormDataToXFDF/ExportFormDataToXFDFString/ImportFormDataFromXFDF/ImportFormDataFromXFDFString用於 XFDF (XML 表單資料格式) 的雙向交換——FDF 的現代 XML 對應物 - 在
TPDFlibXMP上將六個特定於命名空間的 XMP 設定方法(SetDublinCore、SetXMPBasic、SetAdobePDF、SetPDFA、SetPDFUA、SetXMPMM)設為公開,以便進階呼叫者可以直接驅動該引擎
Version 3.180.0
Added
- 新增
SearchAndReplaceTextInContent,執行真實的内容串流文字替換(透過TPDFContentProgram.ReplaceTextRun原地重寫 Tj/TJ/'/" 顯示文字運算子),不同於現有的基於遮罩且僅在原始字形頂部覆蓋矩形的SearchAndReplaceText;原始文字已從串流中移除且無法復原;透過SearchText定位匹配項,透過FindInstructionsInRect將每個匹配矩形對映到其覆蓋的指令,進行重寫並寫回圖層
Version 3.179.0
Added
- 在新的
Lib/PDFlibLogger.pas單元中新增結構化內部記錄器 (TPDFlibLogger),包含四個層級 (Debug/Info/Warn/Error)、主機回呼 (OnLog)、選配的執行緒安全檔案接收器,以及錯誤代碼到訊息的對映表 (PDFlibErrorMessage),終於為現有的數字代碼 (1xx/3xx/4xx/5xx) 提供了人類可讀文字;透過Logger屬性公開在TPDFlib上 - 新增
RenderPagesToFilesParallel,其使用TTask池將頁面範圍轉譯為每頁一個檔案,每個工作執行緒使用一個TPDFlib實例(TPDFlib 不是執行緒安全的),並針對每個執行緒進行CoInitialize以確保 GDI+ 套間安全;在 CPU 密集型點陣輸出下,其隨 CPU 核心數呈近線性調整規模
Version 3.178.0
Added
- 新增
EnumCertificates以列舉 Windows 系統存放區("MY"、"Root" 等)中的每個憑證,傳回主體、發行者、序號、有效性視窗、HasPrivateKey 和 Qualified(eIDAS QCStatements 擴充功能,OID 0.4.0.1862.1.7,透過 PDFlibASN1 中新增的內建 DER 解碼器偵測)——取代了先前透過主旨公用名 (CN) 限制單一憑證的SetSignProcessCertFromStore - 新增
SetSignProcessCertFromStoreByHandle,用於透過從列舉中取得的原始 PCCERT_CONTEXT 控制代碼來選取簽章憑證,允許呼叫者根據任何標準(限定篩選器、有效性、指紋)而不是僅透過主旨公用名 (CN) 進行選取 - 新增
RedactRegion,可真正刪除繪製區域與矩形相交的文字、向量路徑和影像 XObject(編輯內容串流以使刪除的內容無法復原,不同於僅將其覆蓋的MaskRect),並帶有選配的黑色填滿和 /Redact 註釋;由 PDFlibContentModel 中追蹤 CTM 的內容串流分析器 (FindInstructionsInRect) 提供支援 - 在 PDFlibASN1 中新增了最簡 DER 解碼器函式(
DERDecodeLength、DERFindExtensionByOID),用於在處理程序內檢查憑證擴充功能,而無需使用 CryptDecodeObjectEx
Version 3.177.0
Added
- 新增頁面拼接 API,透過向量 Form XObject 擷取將現有頁面組合呈新的版面配置(保留完整的向量保真度,不同於內容串流串接):
StitchPageOverlay在指定位置將一個頁面重疊到另一個頁面上並帶有選配的不透明度,StitchPagesSideBySide將兩個頁面左右並排放在一個新的更寬頁面上,而StitchPagesVertically將頁面範圍堆疊成一個新的高海報樣式頁面 - 在新的
Lib/PDFlibWatermark.pas單元中新增可組合的浮水印範本圖層:帶有九點定位(wpTopLeft..wpBottomRight加上wpCustom)的TPDFlibWatermarkBase、TPDFlibTextWatermark、TPDFlibImageWatermark,以及在共用頁面範圍內遞迴套用子浮水印清單的TPDFlibCompositeWatermark - 新增
TPDFlib.ApplyWatermark作為便捷進入點,委派給浮水印範本自有的頁面範圍和設定
Version 3.176.0
Added
- 新增具名的轉譯輸出格式常數(
PDF_RENDER_BMP、PDF_RENDER_EMF、PDF_RENDER_EMFPLUS、PDF_RENDER_EMF_DUAL等),其 1:1 對映到RenderPageToFile、RenderPageToStream、RenderPagesToFiles和RenderDocumentToFile所接受的整數Options值 - 新增
TPDFlibMetafileFormat列舉以及便捷方法RenderPageToMetafileStream和RenderPageToMetafileFile,其接受具名的中繼檔變體(mfEMF、mfEMFPlus、mfEMFDual、mfWMF)而不是純整數 - 新增 EMF+ Dual 輸出模式(Options 值為 11 / mfEMFDual),可在同一個中繼檔中同時記錄 GDI 和 GDI+ 命令,以與僅支援 GDI 的舊版使用者相容
- 新增
TPDFlibClipboardFormat列舉和RenderPageToClipboard,可將轉譯的頁面作為增強型中繼檔 (CF_ENHMETAFILE)、DIB 點陣圖 (CF_DIB)、頁面 Unicode 文字 (CF_UNICODETEXT) 或同時作為這三者放置在 Windows 貼簿上 - 新增
Lib/PDFlibClipboard.pas單元,其中包含由RenderPageToClipboard使用的低階 Win32 貼簿放置協助程式 - 為
TPDFlibViewer新增完整的每台監視器 DPI 感知:一個新的公開ScreenDPI屬性、一個透過GetDpiForWindow自動偵測主機監視器 DPI 的CreateWnd覆寫方法(帶有GetDeviceCaps後備方案),以及一個在視窗在監視器之間移動時重建版面配置並清除點陣圖快取的WM_DPICHANGED處理常式 - 新增
TPDFRenderer.SetEMFPlusMetafileType,用於在轉譯器層級在 EMF+ Only 和 EMF+ Dual 記錄之間進行選擇
Fixed
- 修復了
RenderPageToFile參考頁面,該頁面中 Options 值清單在 Page 列中放錯位置,且 Options 儲存格為空
Version 3.175.3
Added
- 新增 Lib/PDFlibTableExport.pas 單元,可將任何 TDataSet(FireDAC、ClientDataSet、查詢結果)轉譯為帶有樣式表頭、斑馬線、右對齊數字列和自動分頁續接的已分頁 PDF 表格,並新增了 DataSetExport 主控台 Demo(Demo/Delphi/DataSetExport),其透過 FireDAC 載入 RAD Studio customer.FDS 範例並進行匯出
Version 3.175.2
Added
- 新增端到端 Demo/ReportBridges 專案,可在 FastReport、QuickReport 和 ReportBuilder 中建置最小報表,並透過匹配的 Addons 橋接將其匯出為 PDF,同時配備了專用的 build-ReportBridges.cmd,可提供引擎來源路徑和閘控符號,以便標準 Demo 建置仍然能將這些專案編譯為存根
Version 3.175.1
Added
- 新增 Delphi JBIG2 選項矩陣 Demo,針對 CCITT G4 和 Flate 基準掃描 SymbolExtract、SkipBlackDots、BlackDotSize 和 LossyLevel 的組合,並提供逐列 PDF、CSV 和摘要輸出
- 新增 Delphi Pattern 展示 Demo,涵蓋軸向和徑向 RGB 著色器、Coons-patch 網格著色器,以及作為填滿、筆畫和文字色彩套用的自訂平鋪圖案
- 新增 Delphi CCITT 傳真矩陣 Demo,比較了使用 BlackIs1 和 Interpolate 選項位元的 Group 3 1-D、Group 3 2-D 和 Group 4 壓縮,報告每個輸出大小和產生的 /Filter 名稱
- 在 Addons 下新增了 FastReport、QuickReport 和 ReportBuilder 匯出橋接,分別透過引擎的原生物件、中繼檔和 DrawCommand 表面將準備好的報表轉譯為 PDFlibPas PDF
Version 3.175.0
Changed
- 擴充了 WorkflowGallery Demo,新增註釋變體矩陣,在配套的 CSV 和 HTML 報表中記錄文字醒目提示填滿、標記樣式、便箋圖示、自由文字、插入符號和圖章註釋
Version 3.174.0
Changed
- 擴充了 C++Builder AdvancedWorkflowMatrix Demo,將動作導覽、PDF/A 和 AcroForm 工作流程、字型診斷、串流傳輸交付以及最新的掃描壓縮協助程式對映到產生的矩陣報表中
Version 3.173.0
Added
- 新增了 DeliveryWorkflowMatrix Delphi Demo,用於使用一個產生的 PDF 位元組緩衝區進行串流 Web 和 CGI PDF 輸出、頁面縮圖驗證以及浮水印交付工作流程
Version 3.172.0
Added
- 新增大綱樹便捷 API,用於有序同級插入、子級建立、子樹刪除,以及包含父級、同級、層級、目的地頁面、開啟狀態和標題詳情的前序大綱列舉
Version 3.171.0
Added
- 新增 FontDiagnosticsMatrix Delphi 主控台 Demo,用於 CJK 和 Unicode 字型路徑、TrueType 子集更新、已安裝字型偵測、文件字型列舉和字型診斷報表
Version 3.170.0
Added
- 新增 CanvasMigrationMatrix Delphi 主控台 Demo,用於 Canvas DC 遷移、原始內容 and 路徑進入點、Delphi 色彩協助程式、圖案填滿文字、浮水印、頁面縮圖工作流程和轉譯的驗證預覽
Version 3.169.0
Added
- 新增專用的 LayerCompositionMatrix、TransparencyMaskMatrix 和 ComplianceFormWorkflowMatrix Delphi 主控台 Demo,用於選用內容列印/匯出原則、Pattern/Form XObject 組合、透明度遮罩比較、PDF/A-1b 成功和失敗範例、AcroForm 動作工作流程、外觀重建以及可見簽章範本
Version 3.168.0
Added
- 新增專用的 ImageCompressionMatrix 和 SecurityPermissionMatrix Delphi 主控台 Demo,並產生 PDF、CSV 和 HTML 報表,用於影像壓縮策略選取、掃描壓縮、JPEG 轉譯品質和加密權限設定檔稽核
Version 3.167.0
Added
- 為 JBIG2 點陣圖編碼、EMF 匯入選項、AcroForm 事件動作和鏈結動作新增具名的協助程式 API,以便呼叫者可以使用顯式選項開關,而無需手動組合整數位元遮罩
Version 3.166.0
Added
- 新增可執行的 C++Builder AdvancedWorkflowMatrix 主控台 Demo,具有 PDF、CSV 和 HTML 輸出,將進階 Canvas 遷移、EMF 匯入、影像壓縮、AcroForm、簽章、安全、PDF/A、選用內容、圖案和 Form XObject 工作流程對映到 C++Builder 專案進入點
Version 3.165.0
Added
- 新增 Delphi 動作導覽矩陣 Demo,展示了開啟文件動作、文件級 JavaScript、內嵌檔案連結、遠端 GoTo 連結、AcroForm 事件動作、提交/重設/隱藏連結協助程式以及鏈結 Next 動作,並提供 PDF、CSV 和 HTML 輸出
Fixed
- 修復了遠端檔案連結協助程式,使得 AddLinkToFile、AddLinkToFileEx、AddLinkToFileDest 以及本機檔案啟動連結會建立單個註釋並傳回,而不是無限循環
Version 3.164.0
Added
- 新增 Delphi PDF/A 防護矩陣 demo,用於檢查 PDF/A 模式設定、透明度、混合模式、加密、JavaScript、多媒體、嵌入檔案以及 PDF/A-3 關聯檔案工作流程的提前拒絕或允許路徑判定,並產生 PDF、CSV 和 HTML 報表
Version 3.163.0
Added
- 新增面向 FastReport、QuickReport、ReportBuilder、DBGrid 與自訂畫布匯出路徑的明確 ReportAdapter 橋接矩陣,包含產生的 CSV 與 HTML 對應輸出,以及展示可重複使用配接器策略的 PDF 頁面
Version 3.162.0
Added
- 新增進階工作流程 demo 矩陣,可為畫布移轉、EMF 匯入選項、影像壓縮比較、AcroForm 動作工作流程、可見空簽章、安全權限、PDF/A-1b 檢查、選用內容、平鋪圖樣、Form XObject、DBGrid 風格表格匯出以及大型檔案峰值記憶體報告產生具體輸出
Version 3.161.0
Added
- 新增 Delphi 輔助方法,用於緊湊建構開啟文件動作、表單欄位可見性事件動作、TColor 與灰階色彩設定,以及直接注入原始內容、路徑、文字和矩陣內容串流
Version 3.160.0
Added
- 新增 Delphi 輔助方法,用於 bitmap 到 JBIG2 的掃描影像壓縮、單次呼叫設定影像遮罩與色鍵透明、GoTo 動作鏈結,以及為 JavaScript 或既有動作指派提供可讀 AcroForm 事件名稱
- 擴充
ImportEMFFromFileEx和ImportEMFFromStreamEx,使其Options旗標可強制 bitmap 匯入、啟用 EMF 彩色影像 JPEG 重新壓縮,並請求 GDI+ 處理控制
Version 3.159.1
Changed
- 改進
SaveToStream與繫結輸出串流儲存邏輯,使大型 PDF 串流物件以有界分塊寫出,而不是將每個串流物件複製到一個中間輸出字串
Version 3.159.0
Added
- 新增影像放置輔助方法,可繪製或配合指定影像並在隨後立即釋放其控制代碼,同時提供 Delphi、DLL 和 ActiveX 進入點,以降低一次性影像產生工作流程的峰值記憶體
- 新增
RenderPageToMonochromeFileEx,用於在掃描影像壓縮工作流程前執行帶閾值轉換和孤立黑色像素清理的 1-bit BMP 算繪
Version 3.158.1
Added
- 新增 Delphi 工作流程 demo,涵蓋可重複使用的報表式匯出、RichEdit 到 EMF 的富文字匯入,以及組合頁面縮圖、註解、form XObject、表格、壓縮、JavaScript 和繫結串流輸出場景
Version 3.158.0
Added
- 新增中繼資料加密控制 API,提供 Delphi、DLL 和 ActiveX 進入點:SetEncryptMetadata 可寫入 XMP 中繼資料串流未加密的 Standard-security PDF,GetEncryptMetadata 則回報待寫入或已載入的 /EncryptMetadata 狀態
Version 3.157.0
Added
- 新增直接平鋪圖樣繪製 API,提供 Delphi、DLL 和 ActiveX 進入點:BeginTilingPattern 建立暫時圖樣儲存格繪圖表面,EndTilingPattern 將其註冊為可重複使用圖樣,CancelTilingPattern 則丟棄建構結果且不留下命名圖樣
Version 3.156.0
Added
- 新增 Delphi 繫結輸出串流輔助方法:
BeginOutputToStream、EndOutputStream、CancelOutputStream和OutputStreamActive允許串流式、Web 與報表匯出程式碼繫結目標TStream,透過既有分塊寫入器完成輸出,或在不取得串流所有權的情況下取消待處理目標
Version 3.155.0
Added
- 新增面向 Delphi、DLL 和 ActiveX 呼叫端的
Abort、Aborted與ResetAbort,應用程式可將執行個體標記為已取消,並在清除旗標前阻止儲存或附加輸出操作啟動
Version 3.154.0
Added
- 新增頁面縮圖輔助方法,支援影像匯入選項和記憶體來源;新增按群組名稱查找選用內容群組並設定狀態的輔助方法;新增
SetOpenActionNamedDestination,用於透過命名目標執行文件開啟跳轉
Fixed
GetDestName現在可解析明確目標陣列控制代碼,包括命名文件開啟動作傳回的陣列
Version 3.153.0
Added
- 新增便利 API,涵蓋鏈式表單動作、Hide 與 ImportData 欄位觸發器、選用內容群組初始狀態、選用 EMF 匯入以及色鍵透明影像匯入
Version 3.152.0
Added
- 新增文字繪製時自動建立 URL 連結的能力、CCITT Group 3/4 影像匯入輔助方法、JBIG2 直接影像輔助方法、EMF 擴充匯入包裝器、影像遮罩附加輔助方法、可見簽章欄位建立,以及面向 JavaScript、SubmitForm 和 ResetForm 工作流程的表單欄位事件/動作輔助方法
Version 3.151.0
Added
- 新增
DrawPie、DrawChord、DrawEllipticPie和DrawEllipticChord,用於以描邊、填滿或填滿並描邊模式明確繪製閉合圓弧和橢圓弧
Version 3.150.0
Added
- 新增
NewGraphicsState和SetGraphicsState,呼叫端可建立可重複使用的 ExtGState 資源,用於組合設定填滿透明度、描邊透明度、線寬、線帽、線接合和斜接限制
Version 3.149.1
Fixed
- 修復 Form XObject 與斜接限制方法的重複 ActiveX dispatch ID,使後期繫結 COM 呼叫端可無歧義解析每個方法
Version 3.149.0
Added
- 新增
SetMiterLimit,用於控制使用斜接接合的路徑的描邊斜接限制比例 - 透過 DLL 和 ActiveX API 暴露
BeginFormXObject、EndFormXObject和CancelFormXObject
Version 3.148.0
Added
- 新增可重複使用的 Form XObject 建構 API:
BeginFormXObject、EndFormXObject和CancelFormXObject允許呼叫端使用一般頁面繪圖呼叫繪製可重複使用範本,並透過擷取頁面繪圖 API 重複放置
Version 3.147.0
Added
- 新增
SetTextTilingPattern和SetLineTilingPattern,使擷取頁面平鋪圖樣可重複用於文字、底線和描邊圖形,而無需重複繪圖命令
Fixed
- 描邊 shader 與平鋪圖樣色彩現在寫入描邊圖樣色彩操作符,而不是更新非描邊色彩狀態
Version 3.146.0
Added
- 新增
BeginOptionalContent和EndOptionalContent,呼叫端可只為後續繪圖命令標記選用內容群組,而無需重寫既有內容串流
Fixed
- 當選用內容、Tagged PDF 或 Artifact 作用域在內容串流末尾關閉時,作用域閉合的標記內容操作符現在會立即刷新寫出
Version 3.145.0
Added
- 新增
SetTransparencyEx,呼叫端可為後續繪製的文字和圖形分別設定填滿與描邊透明度,同時保留既有 PDF 1.4 自動升級行為
Version 3.144.0
Added
- 新增
AddLinkToNamedDestination,頁面熱點可跳轉到同一文件內的命名目標,而無需在建立連結時解析目標頁面
Fixed
- 註解動作讀取器現在會對沒有註解的頁面傳回無動作,而不是解參考空註解快取
Version 3.143.0
Added
- 新增表單欄位動作管理 API,呼叫端可將既有動作繫結到欄位觸發器、檢查帶類型的觸發器動作,並移除主要欄位動作或附加欄位動作
Fixed
FormFieldJavaScriptAction現在會拒絕 PDF/A 文件和無效觸發器名稱,而不是寫入不合規的欄位動作字典
Version 3.142.0
Added
- 新增動作鏈結 API,呼叫端可將 URI、命名動作和 JavaScript 後續動作附加到既有註解、大綱或表單欄位動作,並透過
GetActionNextCount和GetActionNextInfo檢查鏈式動作
Version 3.141.0
Added
- 新增
AddLinkToSubmitForm與AddLinkToResetForm,使得頁面熱點能透過標準 PDF 動作提交或重設 AcroForm 欄位,而無需使用 JavaScript
Version 3.140.0
Added
- 新增
AppendToStream,使得漸進式更新(incremental update)工作流程可直接寫入呼叫端提供的串流中,而無需先將更新具現化為AnsiString
Changed
SaveToStream現在會直接序列化至目標串流,而AppendToString(1)現在只會回傳漸進式更新區段,不會將原始來源位元組複製到暫存緩衝區
Version 3.139.0
Added
- 新增
GetAnnotReplyTo與GetAnnotReplyType,使得對話串註解回覆能透過具名的讀取端存取子(accessors)進行檢查,而無需使用通用的註解屬性標籤
Version 3.138.0
Added
- 新增 Delphi
DocumentInspectionWorkbench範例,以批次檢查 PDF,結合字型診斷、影像取樣、色彩空間探索、載入計時,以及 JSON、CSV 與 HTML 報表
Version 3.137.0
Added
- 新增 Delphi
ImageDecodeBenchmark範例,以測量頁面影像探索、解碼後的影像位元組,以及頁面色彩空間探索,並提供 CSV 與 HTML 計時報表
Version 3.136.0
Added
- 新增
GetDocumentFontDiagnostics與TPDFlibFontDiagnostics,以單次呼叫總結文件的字型內嵌、子集化(subsetting)、Standard 14、CID、Type3 與未知字型數量
Version 3.135.0
Added
TPDFlibSignatureVerifier.VerifySignerCertificateChain現在會透過 Windows CryptoAPI 建構內嵌的簽署者憑證鏈,且僅在該憑證鏈符合 Windows 基礎信任原則時回傳vsValid,而自簽或其他不受信任的簽署者憑證則回傳vsInvalid,但不會改變VerifySignature的內容完整性驗證結果
Version 3.134.0
Fixed
TPDFlibSignatureVerifier.VerifySignature現在會驗證舊版的adbe.pkcs7.sha1簽章,當簽署的摘要與涵蓋的/ByteRange位元組相符時回傳vsValid,若涵蓋內容有所變更則回傳vsInvalid
Version 3.133.0
Added
- 新增
RenderPagesToFiles與DARenderPagesToFiles,將任意頁面範圍渲染至編號的輸出檔案中,同時在選定的頁面間重複使用渲染器設定
Version 3.132.0
Added
- 新增
AddPageHeader與AddPageFooter便利的蓋章功能,可將文字放置在頁面範圍內每一頁固定的頂部或底部邊緣,並支援靠左/置中/靠右對齊以及標記展開(&P目前頁碼、&N總頁數、&D日期、&T文件標題、&&實際的 & 符號) - 帶有
soUnderlay選項的StampText與StampImage現在會藉由前置一個新的內容層,真正將內容置於現有頁面內容的下方(先前它的繪製方式如同soOverlay般覆蓋於上方);此功能由新的PrependContentLayer頁面樹方法所支援
Version 3.131.0
Added
- 新增
ScalePage(ScaleX, ScaleY, Anchor),透過將每個內容層包裝在q sx 0 0 sy tx ty cm ... Q圖形狀態區塊中並調整 MediaBox 與 CropBox 大小來縮放所選頁面的內容;錨點(anchor)可保持左下角原點 (0)、將內容置中 (1) 或是保持左上角 (2) - 透過新的
ekPath元素種類擴充EnumPageElements:現在每一頁也會回報其向量路徑,包含邊界方塊、點數量、封閉旗標與繪圖運算子,這些資料是透過結構化內容模型從內容串流中提取而出
Version 3.130.0
Added
- 新增三個縮減檔案大小的最佳化 API,在重新儲存時壓縮載入的文件:
SubsetEmbeddedFonts透過 FontSub.dll 的CreateFontPackage服務,將每個內嵌的 TrueType 字型程式(FontFile2)重新改寫,僅保留文件實際渲染所需的 Unicode 字元;DownsampleImages(MaxDPI, Quality, Filter)將目標 DPI 以上的每個影像 XObject 解碼,重新取樣(box 或 bilinear)後再重新編碼為 JPEG 或 PNG;NormalizeLZWStreams透過現有的 LZW 解碼器與 Flate 編碼器,將每個仍以 LZWDecode 過濾的串流重寫為 FlateDecode,並保留 Predictor 參數
Version 3.129.0
Added
- 為先前僅支援讀取/剖析的四種漸層類型,新增了網格漸層(mesh shading)建立 API:
NewRGBFreeFormTriangleMesh(ShadingType 4,任意形式 Gouraud 三角形)、NewRGBLatticeTriangleMesh(ShadingType 5,晶格形式 Gouraud)、NewRGBCoonsPatchMesh(ShadingType 6,Coons 補丁網格)以及NewRGBTensorPatchMesh(ShadingType 7,張量積補丁網格) — 它們各自從平坦的頂點或補丁清單中,建構出具名的網格漸層圖案,並帶有可選的座標/色彩位元深度與邊界方塊,可如同現有的軸向與徑向漸層般透過SetFillShader/SetLineShader/SetTextShader來選用
Version 3.128.0
新增
- 為檢視器新增縮圖列(thumbnail strip):
TPDFlibThumbnailBar會顯示每一頁的縮圖,並在列捲動至畫面內時以延遲渲染(rendered lazily)方式繪製,縮圖下方會顯示頁碼;點擊縮圖會讓關聯的檢視器跳轉至該頁 — 補齊了檢視器控制項家族(檢視器、書籤面板、搜尋面板、縮圖)
Version 3.127.0
新增
- 為檢視器新增搜尋面板:
TPDFlibSearchPanel.RunSearch會搜尋整個關聯的文件,並為每個命中項目列出一列,包含其頁碼與相符文字;點擊命中項目會讓檢視器跳轉至該頁
Version 3.126.0
新增
- 為檢視器新增書籤面板:
TPDFlibOutlineViewer會以縮排方式列出文件大綱樹(outline tree),並在點擊時讓關聯的檢視器(透過AttachViewer)跳轉至書籤的目的地頁面;它建構於一個可重複使用的面板基礎類別上,供後續的側邊面板共用
Version 3.125.0
新增
- 為檢視器控制項新增文字選取功能:按住滑鼠左鍵拖曳即可選取,按下 Ctrl+C 或呼叫
CopySelectedText可將選取範圍複製到剪貼簿;擷取的文字可透過SelectedText屬性取得,文字由上至下排列,且區段間帶有換行符號 - 新增
GetTextInRegion,直接回傳頁面上矩形區域的文字 — 與滑鼠選取所使用的區塊式尋找相同,可用於自訂的選取介面
Version 3.124.0
新增
- 檢視器控制項現在會在背景執行緒預先渲染相鄰頁面,因此往前或往後翻頁能立即顯示下一頁;工作執行緒會使用其專屬的文件實體,並將完成的渲染結果交給快取,且不會阻塞 UI
- 為檢視器新增連結互動性:點擊連結註解(link annotation)會觸發
OnLinkClick,並帶有頁碼與GetAnnotActionInfo所產生的相同型別化動作摘要(網址、文件目的地、具名動作等);LinkActionAtPagePoint公開了底層的命中測試(hit test)以供自訂處理
Version 3.123.0
新增
- 檢視器控制項獲得連續捲動功能:
SetDisplayMode可將TPDFlibViewer在單頁顯示與全文件連續垂直捲動間切換,且僅渲染視口(viewport)內可見的頁面,目前頁面會追蹤捲動位置(當頁面進入視角時會觸發OnPageChange) - 渲染後的頁面現在會保留在最近最少使用(LRU)的點陣圖快取中,因此來回捲動時無需重新渲染;記憶體預算預設為 128 MB,並可透過
SetCacheLimit調整,當預算縮減或已滿時會驅逐最舊的頁面 - 為檢視器新增滑鼠滾輪捲動與鍵盤導覽功能:PageUp/PageDown(在單頁模式下依頁面步進,連續模式下依視口步進)、方向鍵、Home 與 End
Version 3.122.0
新增
- 新增互動式 PDF 檢視器控制項:
TPDFlibViewer是 VCL 捲動控制項,可從檔案開啟文件或附加至現有的TPDFlib實體,透過選定的渲染引擎(GDI+、Cairo 或 PDFium)顯示頁面,並提供頁面導覽(GoToPage/NextPage/PrevPage,伴隨OnPageChange事件)與縮放控制 — 固定百分比、符合寬度(fit-to-width)或符合頁面(fit-to-page),當控制項調整大小時會自動重新計算;比視口寬的頁面會捲動,較窄的頁面則置中 - 新增設計階段封裝(
Package\PDFlibViewerPkg.dpk),該封裝會將控制項註冊至 losLab PDF 浮動視窗頁面,以便在 IDE 中拖放使用
Version 3.121.0
新增
- 在
DrawText內建自動複雜指令碼文字塑形(text shaping):現在會自動偵測包含阿拉伯文、希伯來文、印度文字或其他複雜指令碼字元的文字並進行塑形 — 包含上下文的字元形狀、強制的連字以及由右至左的排序,皆能在無需更改程式碼的情況下正確呈現;標準的 14 種字型名稱會映射到與其度量相容的已安裝字型(Helvetica 對應 Arial,Times 對應 Times New Roman,Courier 對應 Courier New),而GetTextWidth會透過相同的塑形程序進行測量以確保對齊保持一致;拉丁文、西里爾文、希臘文與 CJK 文字則完整保留其現有的繪製路徑 - 新增
SetTextShaping以切換自動路由路徑(預設為啟用;傳遞 0 即可完全還原為塑形前的行為)
Version 3.120.0
變更
- 塑形文字(shaped-text)的搭配字型現在會在儲存時進行子集化(subsetted),僅保留文件中顯示的字形,從而大幅縮減輸出的檔案大小(超過百萬位元組的完整字型程式,縮減為僅含使用到的字形);子集化的字型會保留其字形編號、帶有子集標記的
BaseFont名稱以及真實的各字形/W寬度,並獲得一個 ToUnicode 對應,可將每個塑形字形轉換回其原始字元 — 因此複製或擷取DrawShapedText輸出時將傳回原始字串,包含 lam-alef 連字背後的兩個字母
Version 3.119.0
新增
- 新增複雜指令碼文字繪製:
DrawShapedText在繪製阿拉伯文、希伯來文與其他複雜指令碼字串之前先對其進行塑形 — 包含上下文的字元形狀、如 lam-alef 的強制連字,以及由右至左的排序皆能正確呈現 — 並透過一個內嵌完整字型程式的搭配 Type0 (Identity-H) 字型,寫入這些塑形後的字形,讓自身沒有字元碼的形狀能精準渲染;每個字體(face)會建立一個搭配字型並在跨呼叫間重複使用 - 新增
GetShapedTextWidth,會透過相同的塑形程序測量文字,使得連字後的文字能測出其真實的繪製寬度 — 可用來對塑形後的段落進行靠右對齊或置中
Version 3.118.0
新增
- 新增複雜指令碼文字塑形(text shaping)的基礎功能:全新的 Uniscribe (usp10.dll) 綁定可將阿拉伯文、希伯來文等複雜指令碼字串轉換為順序與形狀正確的字形組合 — 包含上下文的阿拉伯字體、如 lam-alef 等強制連字,以及由右至左的排序 — 並回報每個字形的字型索引、推進量(advance)與原始字元叢集;此塑形引擎為後續版本繪製路徑的基礎,並採用延遲載入,因此在沒有 Uniscribe 的平台上,系統將直接維持現有的逐字元路徑
Version 3.117.0
新增
- 新增 ICC 設定檔內省(introspection)功能:
GetOutputIntentICCInfo會解析文件 OutputIntent 附加的 ICC 設定檔,並回報其版本、裝置類別、資料色彩空間、設定檔連接空間、渲染意圖(rendering intent)與分量數量 — 適用於檢查 PDF/A 與 PDF/X 檔案的列印條件;渲染器的 ICCBased 色彩空間處理現在也會在漸層(shading)色彩空間不包含/Alternate與/N時,直接從設定檔標頭擷取分量數量
Version 3.116.0
新增
- 新增支援表格的文字擷取模式:
GetPageText的選項 10 會將頁面文字區塊的左邊緣分群為全域欄位位置,並輸出以 Tab 分隔的列,使得表格排版可直接擷取為立即可匯入的 TSV 格式,且各列的儲存格能在垂直方向上保持對齊
Version 3.115.0
新增
- 新增頁面落版(imposition)功能:
ImposePagesNUp可將文件的每一頁配置到全新紙張上的 N-up 網格(2-up、4-up、9-up 或任何行 x 列的排列方式)中,每頁皆維持原比例縮放並置中於其儲存格內,且保留為即時的向量內容;或是透過小冊子(booklet)選項產生騎馬釘紙張,在雙面列印並堆疊後,配對的頁面即可摺疊成一本小冊子
Version 3.114.0
新增
- 擴充強型別動作讀取器(
GetAnnotActionInfo與GetOutlineActionInfo)以支援另外四種動作類型 — Hide(包含隱藏目標數量與隱藏/顯示旗標)、SubmitForm(提交 URL 與欄位數量)、ResetForm(欄位數量)與 ImportData(來源檔案)— 並暴露 Named 動作(例如NextPage)的名稱負載;兩個讀取器現在共用同一個剖析器,使註解連結與書籤能回報一致的資訊
Version 3.113.0
新增
- 新增表單欄位格式化輔助:
SetFormFieldNumberFormat(小數位數、分隔符號樣式、負數樣式與貨幣符號位置)、SetFormFieldPercentFormat與SetFormFieldDateFormat(如mm/dd/yyyy等 Acrobat 日期圖片字串),各自將標準的 Acrobat 格式化 JavaScript 配對寫入欄位的額外動作中 — 一個是按鍵過濾器,另一個是顯示格式化器 — 使得相容的讀取器無需手寫 JavaScript 即可驗證輸入並渲染格式化的值
Version 3.112.0
新增
- 新增 Sound 註解建立功能:
AddSoundAnnotationFromFile可讀取未壓縮的 PCM WAV 檔案(8 或 16 位元,單聲道或立體聲),將其樣本作為/Sound串流以 PDF 聲音機制預期的 signed 編碼格式,嵌入至喇叭圖示註解的後方,與現有的GetAnnotSoundToFile/GetAnnotSoundToString讀取器完成往返支援
Version 3.111.0
新增
- 新增對話串註解回覆功能(ISO 32000-1 §12.5.6.3):
AddAnnotationReply會為任何現有註解附加回覆,該回覆作為一個隱藏的 Text 註解,其/IRT會帶有/RT回覆關聯並指向目標,使得 Acrobat 與其他讀取器能將其以對話串形式顯示在評論面板的目標下方;結合AddAnnotationState與 FDF 評論交換,可支援完整的協作審閱往返流程
Version 3.110.0
新增
- 新增網格(mesh)與以函數為基礎的漸層渲染,補齊全數七種 PDF 漸層類型的支援:任意形式的 Gouraud 三角形網格(類型 4)、晶格形式的 Gouraud 網格(類型 5)、Coons 補丁網格(類型 6)與張量積(tensor-product)補丁網格(類型 7)可從其位元打包的資料串流中解碼 — 包含共用邊補丁旗標、
/Decode值對應與可選的色彩/Function漸變 — 並透過 Cairo 引擎的原生網格漸層進行繪製;以函數為基礎的漸層(類型 1)會透過在網域內對漸層函數進行取樣為精細補丁網格來模擬;支援的色彩空間涵蓋 DeviceRGB、DeviceGray、DeviceCMYK 與 ICCBased 替代方案(GDI+ 引擎因缺少網格漸層基礎圖元,會將網格漸層區域保留為未繪製狀態)
Version 3.109.0
新增
- 完成內容編輯框架的最後階段(第 4 階段),新增文字層級的編輯功能:
TPDFContentProgram.GetTextRuns會列舉頁面的文字顯示指令,並提供每個指令作用中的字型資源與大小(透過追蹤 save/restore 嵌套狀態以掌握字型狀態),而ReplaceTextRun則可直接原地替換所顯示的文字 — 這是一個真正的內容串流替換,能保留原始的座標、字型與顏色,這與透過遮罩舊文字並在其上繪圖的覆蓋法不同
Version 3.108.0
新增
- 為內容編輯框架新增頁面幾何的物件模型(第 3 階段):
TPDFContentProgram.LiftPath將路徑物件(move/line/curve/rectangle 建構運算子以及結束它的剪裁與繪製運算子)提取為可編輯的TPDFPath,內含子路徑與線段;TPDFPath.Transform則為每個端點套用仿射矩陣(可對現有插圖進行移動、縮放、旋轉或傾斜);LowerPath會將修改後的幾何形狀覆寫回原始指令上,準備供WritePageContentLayer使用
Version 3.107.0
新增
- 擴充內容編輯框架(第 2 階段),在
TPDFContentProgram新增指令層級的便利功能:InsertFromSource會剖析內容片段並將其指令拼接在任意位置;SetOperand可從來源語法重寫單一運算元(為座標重新編號,或是為填色重新上色);OperandText讀取運算元字串;InstructionGroup、FindNextOp與FindNextGroup支援依運算子或 ISO 32000-1 運算子類別導覽指令清單
Version 3.106.0
新增
- 新增結構化內容編輯框架的首個階段:
ParsePageContentLayer會將頁面內容層解碼為可編輯的TPDFContentProgram— 一個指令清單,其中每個皆為 PDF 內容運算子(ISO 32000-1 表 51 的所有 73 個運算子)及其解碼後的運算元物件 — 接著WritePageContentLayer會將該程式序列化並寫回頁面,呼叫端得以剖析、檢查、刪除或重新排序繪圖指令並重寫頁面;GetPageContentLayerCount回報內容層的數量,這些內容層為獨立編輯;發射器能保留原有行為(未修改的往返測試中像素一致),未知的運算子也會原樣保留,並且內嵌影像會被完整轉移
Version 3.105.0
新增
- 新增閱讀順序文字擷取模式:
GetPageText選項 9 使用遞迴空白分析(XY-cut)以視覺閱讀順序回傳頁面文字,使得多欄位排版能逐欄呈現 — 全寬的標題優先,接著是整個左欄,然後才是右欄 — 取代幾何上由上而下再由左而右的逐行交錯輸出
Version 3.104.0
新增
- 在簽章驗證器中新增簽署者憑證的內省功能:
GetSignerCertificate會解碼第一個簽章欄位的 PKCS#7 負載,並回傳內嵌簽署者憑證的型別化摘要 — 主體與發行者的顯示名稱、常規十六進位形式的序號、UTC 有效期區間(NotBefore/NotAfter)以及一個方便的旗標,用以指出該憑證目前是否位於有效區間內;簽署者是透過發行者與序號在內嵌憑證中進行比對
Version 3.103.0
新增
- 新增
NewRGBRadialShader,作為NewRGBAxialShader的徑向對應:註冊一個命名的雙圓徑向漸層(ShadingType 3,ISO 32000-1 §8.7.4.5.3),在兩個 RGB 顏色間融合,並可選配超過圓形範圍的色彩延伸;透過現有的SetFillShader、SetLineShader或SetTextShader來選擇它,即可繪製出圓形的「發光」填色、筆劃與文字
Version 3.102.0
新增
- 新增徑向(ShadingType 3)漸層渲染(ISO 32000-1 §8.7.4.5.4):頁面渲染器除了原先支援的軸向(ShadingType 2)漸層外,現在也會繪製用於
sh運算子與漸層圖案填色的雙圓徑向漸層;這在 GDI+ 與 Cairo 點陣引擎上皆有支援,包含多色標函數、DeviceRGB/DeviceCMYK/DeviceN/Separation/ICCBased 色彩空間與/Extend處理
Version 3.101.0
新增
- 新增雲朵邊框效果(ISO 32000-1 §12.5.4):
SetAnnotCloudyEffect可透過寫入/BE邊框效果字典,將 Square、Circle、Polygon 或 FreeText 註解的邊框變成由半圓相連的「修訂雲」,強度 1 或 2 對應至 Acrobat 的 Cloudy 樣式,而強度 0 則會移除此效果;GetAnnotCloudyEffect可讀回設定值(0 = 無雲朵效果,否則為 1..2 強度)
Version 3.100.0
新增
- 新增註解審閱狀態功能(ISO 32000-1 §12.5.6.3):
AddAnnotationState可藉由附加一個隱藏的 Text 註解來記錄現有註解的審閱狀態變更,其/IRT指向目標,且/State與/StateModel會攜帶狀態;支援 Acrobat 評論審閱工作流程使用的Review模型(None/Accepted/Rejected/Cancelled/Completed)與Marked模型(Unmarked/Marked);GetAnnotState與GetAnnotStateModel則可從任何註解讀取所記錄的字串(不存在時為空)
修復
- 修復導致使用近期開發版本建置之應用程式無法啟動的載入時間錯誤(Windows 憑證名稱尋找綁定在一個不存在的 DLL 進入點),並修復 FDF 評論匯入、頁面範圍旋轉以及簽章旗標路徑的編譯退化問題
Version 3.99.0
Added
- 新增文件指紋與轉場讀取 API:
GetDocumentFileID會從結尾的/ID陣列回傳永久文件識別碼(十六進位編碼的第一個元素),可作為穩定的快取鍵或文件指紋使用;GetPageTransition是SetPageTransition的讀取端對應函式,透過反向映射儲存的/Trans/S、/Dm與/M項目,以型別化的TPDFlibPageTransition值回傳轉場樣式,加上顯示持續時間與轉場持續時間
Version 3.98.0
Added
- 新增頁面範圍旋轉與縮圖內省功能:
RotatePageRange會對範圍內的每一頁套用 0/90/180/270 度旋轉(包裝現有的單頁RotatePage,讓呼叫端不再需要每頁執行迴圈);HasPageThumbnail報告頁面是否帶有/Thumb項目;GetPageThumbnailInfo讀取縮圖影像 XObject 的寬度、高度與每組件位元數(bits-per-component)
Version 3.97.0
Added
- 新增擴充的註解屬性讀取器:
GetAnnotColor讀取/C顏色陣列(0..1 RGB,並帶有 HasColor 標籤以區分「無明確顏色」與「明確的黑色」);GetAnnotBorderWidth讀取/BS /W,若無則退回使用舊版的/Border陣列;GetAnnotOpacity讀取/CA筆畫 alpha 值(預設為 1.0);GetAnnotCreationDate讀取/CreationDate時間戳記;GetAnnotFlags讀取/F可見度/列印旗標位元組
Version 3.96.0
Added
- 新增讀取端安全內省 API:
IsEncrypted報告載入的文件是否帶有/Encrypt字典;GetEncryptionLevel回傳符合寫入端加密選項的型別化強度(0=none, 1=RC4-40, 2=RC4-128, 3=AES-128, 4=AES-256, 5=AES-256 Acrobat X);GetUserPermissions回傳原始的/P權限字組以供直接位元測試;IsOwnerPassword報告文件是否以擁有者憑證開啟
Version 3.95.0
Added
- 新增進階列印與文字替換:
PrintDocumentAdvanced透過型別化的TPDFlibPrintSettings記錄,在份數/自動分頁的基礎上驅動完整的印表機 DEVMODE(雙面列印、方向、顏色、列印品質、紙張大小、紙匣),並透過現有的自訂印表機設定檔機制套用每個非預設的欄位;SearchAndReplaceText會跨頁面範圍執行搜尋,對於每個符合的項目,會用不透明的白色矩形遮罩原始文字區塊,並以呼叫端選擇的字型在區塊原點重新繪製替換文字,鏡像了 PDFtoolkit SearchAndReplace 的覆蓋替換行為
Version 3.94.0
Added
- 新增註解 FDF 交換(Acrobat「匯出/匯入註解」):
ExportAnnotationsToFDFString與ExportAnnotationsToFDF會走訪每一頁的/Annots,並將每個註解序列化為 FDF/Annots陣列中的/Type /Annot項目,包含/Subtype、/Contents、/Rect、/T作者標籤、/Subj以及從 0 開始的/Page索引;ImportAnnotationsFromFDFString與ImportAnnotationsFromFDF會使用小型狀態機解析此類 FDF,並在對應的頁面上將每個項目重新建立為新的註解,保留完整的註解字典而不會將其摺疊成便利貼
Version 3.93.0
Added
- 新增簽章認證與表單欄位屬性 API:
SetSignProcessDocMDP會附加層級為 1/2/3(無變更 / 表單填寫 / 註解)的 DocMDP/Reference轉換,並設定 AcroForm/SigFlags的 AppendOnly 位元,將簽章處理程序產生的下一個簽章轉變為認證(作者)簽章;GetSigFlags/SetSigFlags直接讀取與寫入原始的 AcroForm/SigFlags位元組;GetFormFieldIsComb、GetFormFieldIsMultiLine、GetFormFieldJustification與GetFormFieldAllowedValues將每個欄位的/Ff樣式位元、/Q文字對齊方式與/Opt選項陣列公開為型別化的值
Version 3.92.0
Added
- 新增附件匯出與表單欄位便利 API:
SaveAllAttachments走訪統一的附件清單(文件層級/EmbeddedFiles加上每頁的/FileAttachment註解),並將每個串流寫入目錄中其指定的檔案名稱下,並以數字後綴來區分衝突;RemoveFormFieldByName會將完全限定的欄位名稱解析為其索引並將其刪除;RenameFormField會依名稱重新命名欄位,而無需進行獨立的索引尋找
Version 3.91.0
Added
- 新增全文件列舉 API:
EnumDocumentFonts走訪每個 Font 字典(如有需要會先呼叫FindFonts),並為每個字型回傳一個TPDFlibDocumentFont,包含其物件編號、/BaseFont名稱、類型、編碼與內嵌/子集狀態,從而免去了對每個項目使用SelectFont以及查詢純量取得函式的需求;EnumAttachments將文件層級的/EmbeddedFiles名稱樹狀結構與每頁的/FileAttachment註解統一成單一的TPDFlibAttachment清單,記錄每個項目的來源、從 1 開始的來源索引、檔案名稱、MIME 子類型、描述與位元組大小
Version 3.90.0
Added
- 新增適用於註解、書籤與文件版本的唯讀內省 API:
GetPDFVersion回傳有效的文件版本字串(例如1.7);GetAnnotType、GetAnnotTitle、GetAnnotSubject、GetAnnotContentsEx、GetAnnotModifiedDate、GetAnnotName與GetAnnotRectEx在現有的AnalyseAnnot快取之上,將每個註解的欄位公開為具名包裝(讓呼叫端不再需要神祕的屬性 Tag 編號);GetOutlineLevel回傳書籤相對於大綱根目錄的深度,而GetOutlineIsOpen報告它在檢視器中是否展開(負值的/Count表示已摺疊),鏡像了書籤面板會渲染的佈局狀態
Version 3.89.0
新增
- 新增 JBIG2 影像編碼器單元
PDFlibJBIG2Enc(TPLJBIG2Encoder.EncodeToByteArray),由 HotPDF 兄弟產品移植而來,包含兩個後端:在 Win64 上,C++jbig2enc算術編碼器(ITU-T T.88)透過PDFlibJBIG2EncC+HPDFCLibs靜態連結(thirdparty/Win64x/下的 228 個 leptonica/jbig2enc 物件),並註冊為預設後端,與 HotPDF 的產品路徑一致;在其他目標,或者當UseExternalEncoder為 False 時,純 Pascal MMR 後備方案會透過 CCITT G4 編碼器壓縮雙色掃描線,並將其封裝至 JBIG2 區段標頭中(頁面資訊類型 48 + 立即通用區域類型 38) - 新增 LZW 編碼器單元
PDFlibLZWEnc(TPLLZWEncoder.Compress),這也是現有PDFlibLZW解碼器的對應端:可產生符合 PDF 規格的/LZWDecode串流,採用 9..12 位元的可變寬度代碼、ClearCode/EOI 與 PDF 預設的 EarlyChange 語意,加上可選的 TIFF Predictor 2(水平差異化),如此即可透過解碼器完成往返處理並重現原始位元組
Version 3.88.0
Added
- Added a CCITT Group 3 / Group 4 (T.6) bi-level image encoder unit
PDFlibCCITTEnc(TPLCCITTEncoder), the encoder counterpart to the existingPDFlibCCITTdecoder: it encodes apf1bitbitmap to a CCITT G3 1D / G3 2D / G4 (T.6) byte stream viaCompressImage/Execute, ported from the HotPDF sibling product (both share the losLab license); this supplies the missing encoder so monochrome image data can be produced forCCITTFaxDecodeoutput, with full image-pipeline andRenderPageToMonochromeFileG4-output integration to follow
Version 3.87.0
Added
- Implemented cryptographic signature verification for detached PKCS#7 signatures:
TPDFlibSignatureVerifier.VerifySignature(previously a stub returningvsUnknown) now recomputes the document digest over the two/ByteRangesegments and validates it against the signedmessageDigestattribute and the signer's public key via the Windows CryptoAPI (CryptVerifyDetachedMessageSignature), returningvsValid/vsInvalidforadbe.pkcs7.detachedandETSI.CAdES.detachedsubfilters; this is the first verification layer and covers digest+signature integrity only (certificate chain, CRL/OCSP revocation and RFC 3161 timestamp-token validation remain out of scope and will be added in later layers)
Version 3.86.0
Added
- Added a merge-time per-bookmark callback: the
OnMergeOutlineevent fires for each top-level source outline whileMergeFileList/MergeFileListFast/MergeFileListStrictlinks the merged outline tree, letting the caller rename (Title) or drop (Skip=True) an incoming bookmark before it lands in the target document; the callback receives the 0-based source document index so callers can apply per-document policies
Version 3.85.0
Added
- Added signing from the Windows system certificate store:
SetSignProcessCertFromStoreresolves the signing certificate from a named store ("MY"/"Root"/...) by Subject simple-display name (typically the CN, matched case-insensitively; an empty name picks the first certificate that has a private key) and reuses the existing PKCS#7 sign pipeline, so a document can be signed without supplying a.pfx/.p12file; pair it withSetSignProcessKeysetto chooseCURRENT_USER(1) vsLOCAL_MACHINE(2)
Version 3.84.0
Added
- Added font program embedding for already-loaded documents:
EmbedMissingFontswalks every Font dictionary, reads the matching installed system font program by BaseFont name and writesFontFile2orFontFile3back, returning the number of fonts that gained a program;EmbedFontProgramembeds a single font by name using the installed system font;EmbedFontProgramFromFileembeds a single font using a caller-supplied.ttfor.otffile for fonts not installed on the system - Added
SetEmbedAllFonts, a writer-side guard that promotesAddTrueTypeFontEmbed=0toEmbed=1so newly created documents cannot accidentally reference non-embedded system fonts outside PDF/A mode as well
Version 3.83.0
新增
- 新增渲染便利 API:
RenderPageToMonochromeFile將頁面渲染為 1 位元單色點陣圖(傳真/歸檔/OCR 場景),透過 GDI 半色調抖動從 24 位元降級,不更動渲染核心;RenderPageRegionToFile僅渲染頁面指定子矩形(“Left,Top,Width,Height”)為點陣圖,接線了此前斷開的RenderPageToDCClipClip 管道
Version 3.82.0
新增
- 新增 FDF 表單資料匯出:
ExportFormDataToFDF將目前文件的全部表單欄位名稱與值寫入獨立的 FDF 檔案(%FDF-1.2包裹的/Fields陣列),ExportFormDataToFDFString傳回同結構的字串,便於將表單資料從 PDF 中分離儲存或後續合併;非 ASCII 位元組按 ISO 32000-1 三位八進位跳脫
Version 3.81.0
新增
- 新增頁面與結構便利 API:
SetPageTransition為指定頁面寫入簡報轉場效果(/Trans的 17 種標準轉場,含 Split/Blinds/Wipe/Dissolve/Glitter 等)與頁面顯示時長;GetPageFontCount、GetPageFontID列舉指定頁面參照的字型;SetMeasurementUnit接受型別化單位列舉(在原有像素/公釐/英吋基礎上增加 twips 與 points),配套ConvertToPoints、ConvertFromPoints單位換算助手;SaveToFileOptions用一個記錄聚合壓縮、線性化與保留修改日期等儲存選項
Version 3.80.0
新增
- 新增安全與簽章便利 API:
EncryptFileEx接受型別化的命名權限集(TPDFlibUserPermissions,區分低解析度列印與高解析度列印等 8 個具名權限位元)替代原始權限位元整數;TPDFlibSignatureVerifier.GetSignatureMetadata直接從簽章字典讀取欄位名稱、Filter、SubFilter、簽章時間、原因、地點、聯絡資訊、簽署人及 ByteRange 結構校驗,無需 PKCS#7 解碼;PrintDocumentEx在一次呼叫中指定列印份數與排序方式
Version 3.79.0
新增
- 新增編輯便利 API:
MaskRect在指定頁面繪製不透明填滿矩形覆蓋區域(遮蓋/打碼);SetPageThumbnailFromFile直接從影像檔案掛頁面/Thumb而不污染內容流繪製狀態;FlattenFormFieldsOnPageRange按頁碼範圍扁平化全部表單欄位(外觀烘焙為靜態內容並移除活動欄位);InsertAnnotation在指定位置插入已建註解字典;NewMarkupAnnotation一步建立高亮/刪除線/底線/波浪線標記註解並寫入 quad 點、顏色與透明度;StampText、StampImage按頁碼範圍加蓋浮水印,支援透明度、旋轉角度與疊放位置
Version 3.78.0
新增
- 新增文字查詢與頁面元素列舉 API:
SearchText按查詢詞搜尋指定頁碼範圍,傳回每個命中的頁碼與包圍矩形,支援大小寫敏感與整詞匹配選項;EnumPageElements列舉指定頁的全部文字區塊與嵌入影像元素,統一傳回元素種類、矩形、文字、字型名稱與影像 ID;GetTextInAreaEx是GetTextInArea的帶矩形版本,傳回區域內每個文字區塊及其包圍矩形
Version 3.77.0
新增
- 新增唯讀自省 API,補全此前“能寫不能讀”的不對稱:
FindOutlineByTitle按標題尋找書籤(支援僅同層級/僅子級/全子樹三種深度),GetOutlineActionInfo與GetAnnotActionInfo以型別化結構傳回書籤或註解的動作種類(GoTo/GoToR/URI/Launch/Named/JavaScript)及 URI、JavaScript、檔案名稱載荷,GetOutlineDestinationInfo傳回目標頁與 Fit 類型(XYZ/Fit/FitH/FitV/FitR/FitB/FitBH/FitBV)及座標,EnumSignatures、GetSignatureFieldCount、GetSignatureFieldInfo列舉簽章欄位並報告是否已簽章
Version 3.76.3
變更
- E-Invoice 範例的 Factur-X EXTENDED profile 改用標準的 conformance 值與 guideline ID,ZUGFeRD 1.0 發票補上了
ChargeTotalAmount與AllowanceTotalAmount彙總元素;全部 6 個 profile 的 PDF/A-3b 與 PDF/A-3u 輸出現在已同時通過 veraPDF(PDF/A 合規)與 Mustang(電子發票業務規則)驗證
Version 3.76.2
修復
- Factur-X/ZUGFeRD 混合發票的 XMP 中繼資料現在宣告 PDF/A 延伸 schema(
pdfaExtension:schemas)以描述fx:發票屬性;先前缺少此宣告會導致產出的 PDF/A-3 在 veraPDF 等驗證器下被判為不符合規範
變更
- E-Invoice 範例的發票 XML 補上了賣方與買方電子地址及賣方聯絡電話,讓更多 profile 能通過 ZUGFeRD/Factur-X 業務規則驗證
- E-Invoice 範例的 profile 目錄、XML 建構與 PDF/A-3 產生流程已抽取到共享單元,GUI 與新增的外部驗證器測試工具沿用同一程式路徑
Version 3.76.1
修復
- 修正 E-Invoice 範例點擊產生時崩潰的問題:PDF/A 模式下內建標準字型不可用,範例改為嵌入 TrueType 字型來繪製發票頁面
變更
- E-Invoice 範例移除 PDF/A-3a 選項(電子發票情境罕用),XRechnung profile 的預設模式改為 PDF/A-3u
Version 3.76.0
變更
- E-Invoice GUI 範例升級為資料驅動:可編輯發票號碼、開立日期、買賣雙方、淨額、稅率與幣別,發票 XML 與可視頁面金額完全一致,不再使用固定佔位內容
- 範例依 profile 產生結構正確的發票 XML:Factur-X、XRechnung 與 ZUGFeRD 2.0 使用
CrossIndustryInvoice結構,ZUGFeRD 1.0 COMFORT 使用其專屬的CrossIndustryDocument結構並包含明細行項目、稅額與付款條款 - 金額以固定的英文小數點格式寫入 XML,避免在地化千分位或逗號破壞 schema,使用者輸入在寫入前先進行轉義
- 範例新增即時 XML 預覽、profile 級內容自我檢查,以及對同名
.validation.json外部驗證報告的解析,並於產生時明確載入倉庫內的 sRGB ICC 輸出意圖
Version 3.75.6
新增
SetPDFAMode新增模式7,可產生 PDF/A-3u 中繼資料並繼續允許 PDF/A-3 關聯檔案;E-Invoice GUI 範例也提供 PDF/A-3u 選項,ZUGFeRD 2.0 BASIC profile 預設使用 PDF/A-3u
Version 3.75.5
新增
- 新增 Delphi E-Invoice GUI 範例,可選擇 Factur-X、ZUGFeRD 與 XRechnung profile,產生 PDF/A-3 混合發票,嵌入對應的 XML 檔名與 guideline ID,並在介面中執行容器驗證、顯示 XMP 發票資訊、驗證問題與擷取出的 XML
Version 3.75.4
新增
- 新增 PDF/A-3 關聯檔案與電子發票 XML 支援:
AddPDFA3AssociatedFileFromString可直接從記憶體位元組建立 Catalog/AF關聯檔案,AddFacturXAssociatedFileFromString可寫入 Factur-X、ZUGFeRD 與 XRechnung XML,同步 XMP 中繼資料,並驗證檔名、profile、XMP 命名空間和 XML guideline ID 的組合,讀取端新增偵測、驗證、問題清單與 XML 擷取 API
Version 3.75.3
修復
- PDF 合併函式:區域變數
GlobalRootObjNum、GlobalRootGenNum、StructRootGlobalObjNum與StructRootGlobalGenNum只在條件區塊內賦值,導致 Delphi Win64 編譯器 26 與 29(RAD Studio 12 與 16)出現 W1036 “變數可能尚未初始化” 警告;已在函式進入點加入零初始化
Version 3.75.2
修復
- 多版本建置相容性:十六進位字串解析器(
PDFlibStruct)中的for迴圈使用了Int64控制變數,而 Delphi XE3/XE5(編譯器 26/27)會將其拒絕為非序數型;已改寫為While迴圈,以恢復與 RAD Studio 12 與 14 的相容性 - 參照 XObject 檢查器(
PDFlibPDFUA):非串流/非字典分支上的字典指標D未初始化,導致所有目標都出現編譯器提示;已重構該分支,在Assigned檢查之前一律先指派D CreateFontPackage包裝器(PDFlibFont):透過{$IF CompilerVersion}守衛,在 Delphi ≤ XE8 上抑制多餘的 W1035 “傳回值可能未定義” 警告,同時避免較新編譯器上的對應 H2077 死碼指派提示- BMP DPI 寫入器與 PDF 增量儲存路徑:將過時的
TStream.Seek(Longint, Word)呼叫改為Position :=指派(PDFlibPDFium、PDFlibDocument)
Version 3.75.1
修復
- TIFF 多頁解析器:針對過大頁數的迴圈終止保護無效,因為
FPageCount被宣告為Word(最大 65,535),使> 65535比較永遠為 false;已改為Integer,因此該保護現在會在異常檔案上正確觸發 - CFF/Type 2 字元集解析器(Format 1 與 Format 2):移除了緊接在
Break之前、因而從未被讀取的死碼Done := True指派,消除了編譯器提示
Version 3.75.0
安全
- 加固對不受信任的嵌入字型(TrueType、Type 1、CFF 與 CMap)的解析,防止越界寫入、無上限的 charstring 遞迴,以及來自異常字型資料的過大記憶體配置
- 加固影像解碼器(PNG、GIF、TIFF、JBIG2 以及 CCITT Group 3 與 4),防止越界讀寫、寬高計算中的整數溢位,以及惡意影像造成的空色盤解參考
- 加固串流篩選器(LZW、ASCII85 與 Flate predictors),防止緩衝區過度讀取、除以零,以及在刻意構造的串流資料上出現無終止迴圈
- 加固交叉參照、文件重建與名稱樹解析,防止因格式異常或循環交叉參照資料造成的越界存取與無限迴圈
- AES-CBC 解密現在會驗證密文區塊對齊並將輸出緩衝區零初始化,防止未初始化的 heap 記憶體洩漏到解密後的字串與串流中
修復
- SHA-256、SHA-384 與 SHA-512 分離式簽章摘要現在會由正確的密碼學 provider 產生;先前它們會回傳空摘要並導致無效簽章
- ASCII85 與 RC4 解碼在輸入截斷或金鑰為空時,不再回傳未初始化資料或拋出例外
- GIF 背景色現在會讀取正確的藍色通道,而不再重複綠色通道
Version 3.74.1
修復
- 修正 PAdES 簽章驗證資料(VRI)支援中的 E2010 incompatible-types 編譯錯誤,該錯誤原本會阻止函式庫編譯
- 移除了最後的編譯器警告與未使用變數提示;所有 Win32 與 Win64 trial 和 release 函式庫建置現在都能乾淨編譯
Version 3.74.0
新增
EncryptFile與DecryptFile的直接檔案路徑現在會讀取交叉參照資料位於交叉參照流中的 PDF,包括增量更新鏈與帶有/XRefStm側節的 hybrid-reference 檔案,而不再退回較慢的完整 reader:1.25 GB 基準文件的 AES-256 保護時間從約 4.4 秒降至 2.5 秒,解密從約 1.7 秒降至 1.3 秒- 會攜帶儲存在壓縮物件流中的物件的重寫現在會輸出交叉參照流尾端記錄,讓這些物件在加密或解密輸出中仍可定址
修復
- 在增量更新檔案中,若某次修訂沒有文件
/ID,在直接重寫期間將不再抹除沿用自較早修訂的識別碼
Version 3.73.2
變更
DASaveAsFile現在會彙整其輸出寫入,並在不逐步配置字串的情況下找出每個物件的結束關鍵字,將一份含有超過一百萬個物件的 2 GB 基準文件重寫時間從約 57 秒縮短到 11 秒
Version 3.73.1
變更
EncryptFile與DecryptFile的直接檔案路徑現在會透過滑動視窗讀取來源並彙整輸出寫入,因此對含有數百萬個物件的超大 PDF 進行 AES-256 保護會快上數倍:在一份 2 GB 基準文件上,加密從約 123 秒降至 32 秒,解密從約 127 秒降至 23 秒- 落在讀取視窗內的物件內容在直接 AES-256 重寫期間不再會從磁碟讀取兩次
修復
- 混合參照 PDF(攜帶
/XRefStmtrailer 項目的檔案)的直接 AES-256 重寫現在會退回完整 reader,而不會冒著遺失壓縮物件的風險 - 直接檔案路徑中的交叉參照解析不再一次讀取從交叉參照區段到檔案結尾的所有內容,這在
/Prev鏈指向檔案靠前位置的多 GB 檔案上可能耗盡記憶體,而且損壞的/Prev鏈現在會退回完整 reader,而不是產生不完整文件
Version 3.73.0
新增
- SigningWorkbench demo 現在透過 Windows CryptoAPI 對分離式 CMS 簽章(
adbe.pkcs7.detached與ETSI.CAdES.detached)執行完整的密文摘要驗證:會重新雜湊已簽署的位元組範圍並與 CMS 簽章比對,遭竄改的文件會以新的 SG203 失敗代碼回報,而且每個簽章在 JSON、CSV 與 HTML 報告中都帶有三態digestValid欄位 - 新的 SigningWorkbench 自動化開關:
--quiet只列印批次摘要與報告路徑,--fail-fast在第一個失敗檔案處停止批次,而 JSON 報告現在會記錄函式庫版本
Version 3.72.0
新增
- ComplianceWorkbench demo 新增專業批次工作流程:
--policy-file從 JSON 檔載入稽核政策,讓團隊可以版本化並共用文件規則,--baseline將執行結果與較早的 compliance-report.json 比對並列出新失敗、已修正的檔案與持續失敗的檔案,而--preflight-details會把 preflight 問題行嵌入 JSON 與 HTML 報告 - 新的 ComplianceWorkbench 自動化開關:
--quiet只列印批次摘要與報告路徑,--fail-fast在第一個失敗檔案處停止批次,而 JSON 報告現在會記錄函式庫版本
Version 3.71.2
修復
AppendToFile再次能將增量更新附加到同一個以LoadFromFile載入的 PDF 檔;串流載入器現在會保持來源檔案可讀,同時不阻擋更新所需的寫入 handle
Version 3.71.1
新增
- ComplianceWorkbench 與 SigningWorkbench 報告現在包含發現嚴重度標籤、每檔案最高嚴重度欄位、批次嚴重度頻率摘要,以及對應的 JSON、CSV、HTML 與主控台輸出,以加快政策分流
Version 3.71.0
新增
- SigningWorkbench demo 檢視現在會回報每個簽章的修訂順序與 DocMDP 認證等級,透過
--forbid-weak-digest(SG303/SG405)標記弱 MD5/SHA-1 憑證簽章演算法與舊版 adbe.pkcs7.sha1 SubFilter,透過--forbid-self-signed(SG406)標記自簽憑證,透過--require-certified(SG304)標記沒有認證簽章的文件,並且一律檢查簽章時間是否落在憑證有效期內(SG407) - SigningWorkbench 簽章模式現在改用 sign process API,並加入新的
--subfilter(sha1、detached,或供 PAdES baseline signatures 使用的 cades)與--digest(auto 到 sha512)開關,而現代的adbe.pkcs7.detached搭配 SHA-256 則是新的預設簽章方式 - 新的
TPDFlibSignDoc.GetSignatureDocMDPLevelByName讀取端存取器可依 ISO 32000-1 §12.8.2.2 回傳簽章欄位的 DocMDP 認證等級
Version 3.70.0
新增
- ComplianceWorkbench demo 現在也會強制執行權限、後設資料與大小政策:
--require-print-allowed與--require-copy-allowed檢查文件權限位元(PC205/PC206),--require-author與--require-creation-date檢查後設資料完整性(PC306/PC307),而--max-pages與--max-file-size會限制文件規模(PC308/PC309) - 存檔設定檔現在也要求作者與建立日期,而可存取設定檔則要求輔助技術所依賴的複製權限
- ComplianceWorkbench 報告現在會彙整整個批次的失敗代碼頻率摘要,而每檔案指標則包含作者、建立日期、檔案大小,以及列印與複製權限狀態
Version 3.69.1
修復
DecryptFile再次可移除 AES-128 與 RC4 保護文件的加密,包括只帶有擁有者密碼的文件;自 v3.67.4 起,大片檔案快速路徑會把這些文件誤報為密碼錯誤(error 404),而不是交給一般解密路徑,AES-256 文件則不受影響
Version 3.69.0
新增
- 新的 SigningWorkbench Delphi demo:一個簽章與憑證工作台控制台工具,可檢查單一 PDF 或整個目錄的簽章欄位(SubFilter、簽章時間、ByteRange 覆蓋,以及含到期檢查的簽章憑證),使用 PKCS #12 憑證批次簽署 PDF,並稽核 PFX 檔;每個違規都對應到穩定的政策失敗代碼(SG101–SG501),且結果會以 JSON、CSV 與 HTML 報告輸出,並為全部 18 種文件語言提供本地化 demo 指南
TPDFlibSignDoc新增簽章讀取端存取器:GetSignatureFieldNames列出文件中的簽章欄位,GetSignatureTextValueByName會回傳 /M 簽章時間、/Name、/Reason、/Location、/ContactInfo 與 /Type 項目(加密文件則會先解密),而GetSignatureValueByName會依欄位名稱回傳 /Filter、/SubFilter、/Contents 與 ByteRange 項目
修復
- 修正
CertCloseStoreWindows CryptoAPI 匯入,原本宣告時漏掉 flags 參數,當關閉憑證存放區時可能在 Win32 上損毀呼叫端堆疊
Version 3.68.0
新增
- 新的 ComplianceWorkbench Delphi demo:一個批次政策稽核控制台工具,可將單一 PDF 或整個目錄對照可設定的合規政策進行檢查,涵蓋 PDF/A 與 PDF/UA preflight、加密規則、PDF 版本範圍、Tagged PDF、線性化以及文件標題,並將每項違規回報為穩定的政策失敗代碼(PC101–PC501),同時輸出具備自動化友善離開代碼的 JSON、CSV 與 HTML 報告
- 這個新 demo 隨附的政策設定檔會把常見需求集合—archive、accessible、secure 與 web—打包在一起,並可透過明確的命令列開關覆寫設定檔值,同時包含 18 種文件語言的本地化 demo 指南
Version 3.67.4
變更
EncryptFile與DecryptFile現在對大型 classic-xref PDF 改用直接 AES-256 重寫路徑,在檔案之間串流加密資料,而不再載入並重新序列化每個物件;一份 2 GB 基準檔現在可透過 Direct File API 以 result code 1 與LastErrorCode0 完成檔對檔 AES-256 加密與解密
修復
- 修正直接 AES-256 字串 token 處理,讓字典分隔符不會被誤認為十六進位字串,且加密的空字串能正確解密
Version 3.67.3
變更
- 擴充了 DrawShapes、CreateWithImage、CreateTable、EditFormField 和 EmbeddedFonts 的 Delphi 與 C++Builder 示範,讓產生的 PDF 現在展示實用的繪圖、影像放置、表格版面配置、表單欄位樣式和字型嵌入比較工作流程,而不再只是最小化的單一操作輸出
修正
- 修正了 CreateTable 示範,讓它在轉譯表格前明確設定 A4 頁面大小,避免 Delphi 範例中先前未初始化的頁面大小變數
Version 3.67.2
修復
- 修復 v3.67.0 引入的載入器端延遲偵測回歸:內容特性偵測可能在儲存時執行,並覆寫明確要求的儲存版本 (SetInformation 0) 或鎖定版本 (LockSaveVersion),導致嚴格的低版本儲存不再拒絕高版本內容,鎖定版本也可能向上漂移;偵測現在會在任何明確版本設定之前執行,並且不會對新建而非載入的文件執行,從而恢復 v3.67.0 之前的版本控制行為,同時保留延遲載入帶來的時間節省
Version 3.67.1
變更
- 特性偵測現在使用淺層解析讀取 stream 物件,只檢查物件字典並跳過 stream 本文,因為掃描從不檢查 stream 內容;對於包含大型影像 stream 的文件,這避免了偵測期間讀取本文位元組,使一次偵測過程的物件讀取時間降低約 40%(在 2 GB、160 萬物件檔案上約為 13 s,而不是 20 s),同時偵測到的特性列表和有效 PDF 版本保持完全一致
Version 3.67.0
變更
- 載入期內容特徵偵測現在改為惰性執行(lazy)– 不再於載入時掃描整份文件,而是在首次使用時才執行,即查詢有效 PDF 版本或偵測到的特徵清單時、或儲存文件時;取得頁數、擷取文字或影像、算繪等從不查詢版本也不重新儲存的唯讀操作會完全略過此掃描,使超大文件的載入時間縮短約 80%(一個 2 GB、160 萬物件的檔案約 10 秒而非 56 秒),而偵測到的特徵集與有效 PDF 版本在偵測執行後保持完全相同
Version 3.66.1
變更
- 載入超大型多頁文件現在明顯加快:載入期內容特徵偵測會略過不會改變結果的規則檢查(既包含已經比對過的規則,也包含對特定物件不適用的規則),在超大檔案上將載入時間縮短約一半,同時讓偵測到的特徵與有效 PDF 版本完全相同
Version 3.66.0
變更
- 載入超大型多頁文件時的尖峰記憶體用量大幅降低。載入器端的內容特徵偵測不再一次性將整個物件模型完整建構至記憶體中 – 改為透過隨機存取讀取器逐物件串流逐一讀取 – 使大型檔案的 working set 峰值降低約 90 %,同時保持偵測到的特徵與有效 PDF 版本完全一致。
Version 3.65.0
新增
- 現在可以開啟大於 2 GB 的文件。已移除先前將文件大小限制在約 2 GB 的記憶體緩衝區。
變更
- 從檔案載入 PDF 時,現在會依需求從來源讀取物件資料,而不再將整份文件緩衝至記憶體中,因而大幅降低大型檔案的尖峰記憶體用量。
- 從檔案載入的文件會以共用讀取方式保持該檔案開啟,直到文件關閉或清除為止。
修復
- 提升了載入在 %PDF- 標頭前含有前導位元組的文件、以及處理格式錯誤的 cross-reference 資料時的穩健性。
Version 3.64.0
變更
- 針對超大或物件數眾多的 PDF,Direct API 操作 – EncryptFile、DecryptFile 和 DASaveAsFile – 現在大幅加快,不再卡住。一個約 160 萬物件的 2 GB 文件此前無法處理完成,現在約一分鐘即可完成加密,處理時間隨文件大小近似線性增長,而不再隨物件數量激增而急劇惡化。
- 大型文件的加密顯著加快 – 以往需要數分鐘的操作現在僅需數秒到約一分鐘 – 且加密強度、密文相容性與輸出均無變化。
Version 3.63.0
修復
- 修復了載入內部位元組偏移跨越 32 位元(約 2 GB)邊界的大型 PDF 檔案時的程序崩潰;載入器現在全程使用 64 位元偏移,因此接近 2 GB 的檔案可靠載入,2 GB 及以上的檔案會正常回報載入錯誤而不是崩潰。
Version 3.62.0
變更
- AES-256-CBC 加密與解密現在不僅在 64 位元、在 32 位元 Windows 上也走硬體加速的 AES-NI 路徑,並在不支援 AES-NI 的處理器上繼續自動回退到可攜的 C 實作。各平台的密文保持不變。
Version 3.61.0
變更
- AES-256-CBC 加密與解密現在在 64 位元 Windows 上使用硬體加速的 AES-NI 後端,並在不支援 AES-NI 的處理器上自動回退到可攜的軟體實作。各平台的密文完全相同,僅基於密碼的 AES-256 PDF 加密速度有所變化。
Version 3.60.0
新增
MergeFileList現在會將輸入文件的邏輯結構(Tagged PDF)樹合併為單一、可達的結構樹,而不再只保留第一個文件的結構樹、將其餘文件的結構樹留作不可達物件。頂層結構元素、parent tree(重新對應頁面/StructParents與註解/StructParent鍵)、/RoleMap、/ClassMap和/IDTree都會被合併,且合併後的 catalog 會被標記為 Tagged(/MarkInfo /Marked true)。
變更
- 合併存在
/RoleMap、/ClassMap或/IDTree鍵衝突的文件時,保留第一次出現的項目。快速路徑(MergeFileListFast)仍會捨棄結構資訊。
Version 3.59.0
變更
MergeFileList現在以單遍方式合併文件(O(N) 而非 O(N²)),使大量檔案的合併顯著加快;它也獲得了快速路徑新增的多文件書籤合併。- 預設情況下,
MergeFileList現在會略過無法讀取或加密的輸入檔案並繼續合併其餘檔案,而不再在遇到第一個壞檔案時中止整個操作。使用新增的MergeFileListStrict可還原先前遇首個失敗即停止的行為。 - 輸入檔案的邏輯結構(Tagged PDF)物件現在會被
MergeFileList保留(快速路徑仍會丟棄它們)。
新增
MergeFileListStrict合併檔案清單,但在遇到第一個無法讀取或加密的檔案時停止,保留早期版本嚴格的遇失敗即停止語意。
Version 3.58.0
新增
MergeFileListFast現在會合併所有輸入檔案的文件書籤(大綱),使快速合併路徑在 AcroForm 表單欄位之外也保留書籤。- 合併後的書籤保留其階層和頁面目標;合併輸出的頂層書籤數量等於各輸入之和。
Version 3.57.1
變更
- 超大文件的 Direct File API 儲存(
DASaveAsFile、DASaveToStream、DASaveCopyToStream)顯著提速:未變更的物件直接重用來源檔案位元組,而不再重新解析和序列化。重新儲存一個 60,000 頁 / 883 MB 文件的耗時從約 33 秒降至約 23 秒。
Version 3.57.0
變更
- 進一步優化
TPDFlib.MergeFileListFast的多文件合併效能:後續被追加文件中的未修改非流物件現在直接複用其原始來源位元組並執行位元組級間接參照偏移,跳過解析與重序列化的往返開銷,提升了多頁文件的合併吞吐量。合併輸出不變,頁數與原始輸入完全一致。 - 包含串流資料或屬於結構樹的物件繼續使用現有的解析路徑,位元組快速路徑僅在可確認安全的情況下啟用。
Version 3.56.44
變更
- 最佳化
TPDFlib.MergeFileListFast:預先配置合併中繼資料,並將第一個文件中未修改的物件直接從原始來源資料寫出,減少快速多檔合併中的記憶體搬移以及可避免的物件解碼/輸出工作。 - Delphi
MergePDFGUI 現在會批次記錄 fast mode 結果,並避免反覆掃描整個 memo 文字,使大型輸入清單在合併完成後仍更流暢。
Version 3.56.43
變更
- 最佳化了一般
TPDFlib.MergeFileList合併路徑:現在會交替使用中間暫存檔,而不是在追加每個輸入檔案前複製不斷增長的已合併 PDF,從而降低多檔案工作流程的磁碟 I/O,並保留既有的傳回計數約定。
Version 3.56.42
新增
- 新增 AES 回歸覆蓋,驗證儲存時回復加密 stream 所用的輸入緩衝區/回傳結果別名場景,包括此前暴露故障的 504 KB 大 payload。
變更
- 普通 API 的
LoadFromFile、Encrypt、SaveToFile、重新載入、Decrypt、SaveToFile流程現在可再次在已載入的大型 PDF 上完成,同時保留減少複製的 AES-CBC 解密最佳化。
修復
- 修復 v3.56.41 引入的基於緩衝區的 AES-256 解密路徑,使呼叫端可以把解密結果重新指定給提供密文緩衝區的同一個
AnsiString,而不會觸發存取違規。
Version 3.56.41
新增
- 新增
TPDFlib.DACopyFile,面向只需要頁數和原樣檔案副本、但不想建構完整普通物件圖的 Direct Access 工作流程。 - Delphi
HugeFileBenchmarkdemo 新增direct-copy列,並加入--ops與--skip篩選器,便於聚焦執行大型檔案測試。
變更
- 透過新增基於緩衝區的 AES-CBC 解密路徑並在載入後的字串和 stream 解密中重用它,最佳化 AES-256 解密,減少大型加密 stream 上的額外密文複製。
Version 3.56.40
變更
- Delphi 和 C++Builder 的
HelloWorld範例現在會建立更完整的入門 PDF,包含文件資訊、選定標準字型輸出、樣式化標題區、簡單向量繪圖和後續範例指引,同時保持原有的建置並執行流程。 - 所有 Delphi 和 C++Builder 範例說明都已替換為適合瀏覽器閱讀的
Readme.html頁面,包括密碼、受限檔案和簽章結果等輔助說明;兩個範例索引現在也會引導使用者查看 HTML 說明。
Version 3.56.39
變更
- 直接檔案 API 的儲存路徑現在以線性方式建構交叉引用查詢表,使
DASaveAsFile和相關直接儲存路徑在物件數量極高或頁樹密集的 PDF 上明顯更快。 - 最佳化後的 writer 保持相同的自由物件鏈語義,同時避免完整 xref 產生過程中的重複物件號碼掃描,在不改變公開 API 或輸出契約的情況下改善大型直接儲存工作流程。
Version 3.56.38
變更
- 普通 API 的
LoadFromFile、Encrypt、SaveToFile、重新載入、Decrypt、SaveToFile工作流現在會在明確Decrypt前保留加密狀態,與直接檔案 API 處理大型舊版 PDF 的行為一致。
修復
- 修復普通 API 的加密輸出,使
Encrypt在寫入 AES-256 安全資料前建立或保留 trailer/ID,從而讓加密後的 PDF 在重新載入時仍可透過EncryptionStatus識別為加密狀態。
Version 3.56.37
新增
- 新增
TPDFlib.ComparePreflightReports,用於逐行比較純文字 preflight 報告;它會忽略易變的Generated:時間戳行,並在穩定報告內容一致時返回空字串。 - Delphi
PreflightReport示例現在支援單檔案模式下的--compare <file>,當生成的文字報告與 baseline 不同時,會寫出 UTF-8.diff.txt報告並返回退出碼 2。
Version 3.56.36
新增
- Delphi
PreflightReport示例現在支援使用--input-dir、--output-dir和--recursive進行目錄批處理,併為每個 PDF 寫出一個<basename>.preflight.<ext>報告。
變更
- 批處理模式會寫出 UTF-8
preflight-summary.csv,記錄每個源 PDF、通過/失敗狀態、問題數量和生成的報告路徑,同時保留現有退出碼約定,便於自動化使用。
Version 3.56.35
新增
ReportFormat = 3為TPDFlib.CreatePreflightReportEx和TPDFlib.SavePreflightReportEx增加 CSV 輸出,生成 UTF-8 行來表示報告後設資料、每個選中的合規檢查、單項問題程式碼與訊息,以及最終摘要。- Delphi
PreflightReportdemo 現在支援--format csv和--csv,命令列 preflight 執行結果可直接供電子表格或簡單 CI 解析器使用,無需後處理 JSON 或擷取文字。
Version 3.56.34
新增
- 新增支援格式選擇的
TPDFlib.CreatePreflightReportEx與TPDFlib.SavePreflightReportExAPI,可在保留現有純文字報告 API 的同時,將 PDF/A 與 PDF/UA-1 preflight 報告生成為純文字、JSON 或獨立 HTML。 - Delphi
PreflightReport例程現在支援--format text|json|html,並提供--json與--html快捷選項,同一套命令列流程既能輸出面向人工閱讀的報告,也能生成便於 CI 消費的機器可讀產物。
Version 3.56.33
新增
- 新增
TPDFlib.CreatePreflightReport和TPDFlib.SavePreflightReport,應用程式可以基於內建 PDF/A 與 PDF/UA-1 合規檢查生成可複用的純文字報告,不再需要手動列舉字串列表控制代碼。
變更
- Delphi
PreflightReport例程現在直接呼叫庫級報告 API,使示例聚焦於命令列流程、選擇檢查項、首個問題模式以及便於自動化使用的退出碼。
Version 3.56.32
新增
- 新增 Delphi 控制台示例
PreflightReport,使用CheckFileCompliance執行 PDF/A 與 PDF/UA-1 檢查,透過GetStringListCount和GetStringListItem列舉問題列表,並寫出純文字 preflight 報告。
變更
- 該示例支援
--input、--output、--pdfa、--pdfua、--both和--first-issue選項,並提供便於自動化判斷的通過、發現問題和執行錯誤退出碼。
Version 3.56.31
變更
GetCustomKeys(2)現在能夠一致地隱藏由庫管理的 Catalog 系統條目,包括 /OutputIntents、 /Extensions、 /Requirements、 /Collection 和 /NeedsRendering。
修復
- 使用
SetPDFAMode建立的 PDF/A 輸出意圖不再顯示為自定義 Catalog 鍵,從而將應用程式後設資料列舉與 PDF 合規性結構分開。
Version 3.56.25
變更
- 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 遍歷模式。
Version 3.56.24
變更
- PDF/UA-1 審計增加了 ISO 14289-1 §7.4.4 H標籤唯一性檢查。
10044報告任何結構節點,如果該節點攜帶超過一個直接的H子節點,則違反規範(在強結構文件中,此操作是被禁止的),並且相同的約束適用於任何標籤樹節點,無論整體結構模式如何。 另一個 § 7.4.4 SHALL(文件應要麼是強結構,要麼是弱結構,而不能兩者兼有)需要文件範圍的啟發式方法,並且有意地未包含在此次審計中。 - 一個新的前序結構樹遍歷器(UAVisitStructNodeForHUniqueness / ScanStructTreeForHUniqueness)計算每個節點的直接H子節點數量,並以深度優先方式遞迴。它重用與現有的標題/列表/註釋遍歷器相同的K形解碼器。
Version 3.56.23
新增
- 新的
Lib/PDFlibPDFUAFontInspect.pas實現了對 SFNT 表目錄的容錯掃描器和 cmap 子表目錄解析器。 在上一個基礎設施提交中新增的包含 4281 個名稱的 Adobe Glyph List 表現在已透過 Differences 檢查連線到系統中。 無法解析為 SFNT (Type 1 PFB / PFA, OpenType 集合,任意垃圾) 的程式將被靜默跳過。 在審計層,優先考慮避免誤報,而不是漏報。
變更
- 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 中。
Version 3.56.22
變更
- 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 系列的第一個後續子類。
Version 3.56.21
新增
- 新的
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條目結合使用;呼叫者負責確保不要同時設定這兩個屬性。
Version 3.56.20
新增
- 新的
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標籤遍歷目錄的工具能夠識別該結構,而無需重新解析父路徑。
Version 3.56.19
新增
- 新的 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佔位符中。 - 新的
SetSignProcessReserveContentsBytes在初始簽名時擴充套件/Contents佔位符,以便在簽名後增強的 CMS 可以放入,而不會超出原始預留的空間。 通常,TSA 發出的 TimeStampTokens 會在 SignerInfo 上增加 2-6 位元組;此處傳遞 1024-8192 以保留空間。 如果沒有足夠的預留空間,增強呼叫將返回13(輸出溢位)。
變更
BuildPAdESSignatureTimeStampAttribute是一個無狀態的輔助函式,它將 TSA 發出的 TimeStampToken 封裝在 CMS 屬性 SEQUENCE 中,SignerInfo.unsignedAttrs期望該屬性,因此已經擁有 CMS 庫的呼叫者可以跳過 OID + SET 的配置。- 該庫不包含 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 位元組路徑。
Version 3.56.18
新增
- 新的 ASN.1 輔助函式
DER_IntegerFromLittleEndian(處理 Win32CRYPT_INTEGER_BLOB位元組順序) 和DER_ContextTagExplicit(將負載封裝在構造的上下文特定標記中) 完善了PDFlibASN1微編碼器。PDFlibCryptoAPI中的新的CERT_INFO/CRYPT_ALGORITHM_IDENTIFIER/CRYPT_INTEGER_BLOB/PCERT_CONTEXT宣告為簽名路徑提供了訪問解析的證書欄位。
變更
- 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引用。
Version 3.56.17
新增
- 新增
PDFlibASN1單元,提供一個聚焦的 DER (X.690) 微編碼器 —— length prefix、OCTET STRING、SEQUENCE、SET、OBJECT IDENTIFIER —— 用於構造SigningCertificateV2屬性值。該編碼器遵循 base-128 OID 弧的標準規則,並在可選的hashAlgorithm欄位只是重複 SHA-256 預設值時省略該欄位,與 OpenSSL 和 BouncyCastle 的輸出一致。
變更
- 內建的
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只攜帶必需的屬性。 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)。
Version 3.56.16
新增
- 新增
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。
Version 3.56.15
新增
- 新增
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。
Version 3.56.14
新增
- 新增 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 介面。
Version 3.56.8
變更
- 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。
Version 3.56.13
變更
- 當 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診斷訊息現在會提示自動修復將在儲存時掩蓋該問題,讓使用者既瞭解缺失的屬性也瞭解自動修復行為。
Version 3.56.12
變更
- 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 與內聯形式行為一致。
Version 3.56.11
變更
- 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 標籤都需要其中之一。
Version 3.56.10
變更
- 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 必須存在)出於同樣原因仍不在範圍內 —— 它們需要字型程式檢視。
Version 3.56.9
變更
- 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。這避免了同一違規在兩個程式碼下被重複計數。
Version 3.56.7
變更
- 當 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 在儲存時自動剝除它們。
Version 3.56.6
變更
- 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”這類問題。
Version 3.56.5
變更
- 當 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 字典。
Version 3.56.4
變更
- 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 字串列表)。
Version 3.56.3
變更
- 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,反之亦然。
Version 3.56.2
變更
- 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)。
Version 3.56.1
變更
- 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 介面。
Version 3.56.0
新增
- 新增 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。
Version 3.55.6
變更
- 每個新生成的 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 路徑。
Version 3.55.5
變更
- 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,給驗證器留下零歧義。
Version 3.55.4
變更
- 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 新增)會在驗證時標記任何不合規的輸出。
Version 3.55.3
變更
- 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 新增)會標記其缺失,讓使用者在驗證時看到問題。
Version 3.55.2
變更
- 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 間接滑入輸出的路徑提供驗證時的第二道防線。
Version 3.55.1
變更
- 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 觸發。
Version 3.55.0
變更
- 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)暴露。
Version 3.54.0
變更
- 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 主動啟用。
Version 3.53.0
變更
- 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 不匹配時拒絕。
Version 3.52.0
變更
- 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。
Version 3.51.0
變更
- 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 檢測使用標準的六個大寫字母字首約定。
Version 3.50.0
變更
- 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。
- 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 部分。
修復
- 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 對映一致性級別現在被驗證器識別。
Version 3.49.0
變更
- 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 兩種形式)暴露。
Version 3.48.0
變更
- 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 兩種形式)暴露。
Version 3.47.0
變更
- 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 介面中提供。
Version 3.46.1
變更
- 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 支援。
Version 3.46.0
變更
- 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 根據所有筆畫的合併範圍自動計算,並加上少量內邊距以確保筆畫始終位於註解包圍盒內。
Version 3.45.0
變更
- 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。
Version 3.44.1
變更
- 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 根據兩個端點加上與邊框寬度成比例的內邊距計算,確保端點裝飾保持在註解包圍盒內。
Version 3.44.0
變更
- 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 既有的審閱工作流都可以在建立後繼續編輯這些註解。
Version 3.43.0
變更
- 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 屬性分支。
Version 3.42.0
變更
- 新增三項合規檢查:程式碼 00006 標記加密文件(所有 PDF/A 版本禁止加密);程式碼 00007 標記目錄中缺少 OutputIntents 項的文件(所有 PDF/A 版本要求該項);程式碼 00011 與 00012 標記一致性級別為 -a(無障礙)時缺少 MarkInfo 或 StructTreeRoot 的文件。
修復
- 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 允許圖層,不再標記。
Version 3.41.0
變更
- 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 明確允許任意嵌入檔案。
Version 3.40.0
新增
- 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 結構標記。
變更
- GetInformation(201) 返回 '1' 至 '6',對應活動的 PDF/A 模式,與新的模式編號保持一致。
修復
- 修復:SetPDFAMode(1)(PDF/A-1a)原本因為 v3.20.0 引入的內部路由 bug 是 no-op,現已正確寫入 /MarkInfo 與 /OutputIntents,並設定 XMP pdfaid:part=1/conformance=A。
Version 3.39.0
變更
- 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 介面中提供。
Version 3.38.0
變更
- 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,用於完整描述複雜或跨越式表頭表格中的單元格。
Version 3.37.2
變更
- GetPDFUADiagnostics 現在會在 N 個互動表單欄位(Widget 註解)缺少 TU(工具提示 / 無障礙名稱)項時報告 FORM-NO-TOOLTIP:N。ISO 14289-1 §7.18.4 要求所有互動表單欄位都攜帶 TU 項,以便欄位獲得焦點時輔助技術能向使用者朗讀欄位用途。/TU 是螢幕閱讀器朗讀的無障礙名稱;它與 /T 不同,後者是用於程式設計訪問與表單提交的部分欄位名。
Version 3.37.1
變更
- GetPDFUADiagnostics 現在會在 N 個 LI 或 LBody 結構元素出現在所需父元素之外時報告 LIST-STRUCT:N。ISO 32000-1 §14.8.4.4 要求 LI 是 L(列表)的直接子元素,LBody 是 LI(列表項)的直接子元素。列表巢狀畸形會導致輔助技術無法正確遍歷與朗讀列表內容,並可能在 PDF/UA-1 校驗器中觸發文件結構校驗失敗。
Version 3.37.0
變更
- 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 介面中提供。
Version 3.36.1
變更
- 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')。
Version 3.36.0
變更
- 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 介面中提供。
Version 3.35.1
變更
- GetPDFUADiagnostics 現在會在文件資訊字典 /Title 項缺失或為空時報告 DOCINFO-TITLE-MISSING。PDF/UA-1(ISO 14289-1)要求文件具備標題,以便文件開啟時螢幕閱讀器能朗讀。既有的 DISPLAYDOCTITLE-FALSE 檢查確認 viewer 標題欄顯示該標題;DOCINFO-TITLE-MISSING 是互補檢查 — 它確認標題值本身已設定。透過呼叫 SetDocumentInfo('Title', ...) 提供該值。
Version 3.35.0
變更
- 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 介面中提供。
Version 3.34.0
變更
- 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 介面中提供。
Version 3.33.1
新增
- 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 種標準結構型別都會被識別並從報告中排除。
Version 3.33.0
變更
- SetStructElemLang 是新增 API,在當前開啟的結構元素上設定 /Lang 項(ISO 32000-1 §14.9.2)。該語言標籤覆蓋 SetDocumentLanguage 或 SetPDFUAMode 宣告的文件級語言,對該元素及其所有後代生效,使混合語言文件能為每段標記其正確的 BCP 47 語言標籤(例如 'en-US'、'fr'、'zh-Hant-TW')。螢幕閱讀器使用元素級 /Lang 來選擇合適的文字到語音引擎或朗讀語音。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
Version 3.32.0
變更
- SetStructElemActualText 是新增 API,在當前開啟的結構元素上設定 /ActualText 項(ISO 32000-1 §14.9.4)。當內容流提取會得到錯誤結果時,用它指定字形序列實際代表的精確 Unicode 文字 — 最常見的情況是 OpenType 連字字形(U+FB00 ff、U+FB01 fi、U+FB02 fl)以及展開形式不明顯的縮寫。ActualText 補充而非替換渲染內容;它會覆蓋該元素對輔助技術與文字擷取器的朗讀/輸出,但不會抑制可視渲染。該函式在 Delphi 庫、ActiveX 和 DLL 介面中提供。
Version 3.31.1
變更
- 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。
Version 3.31.0
修復
- 現已支援結構元素 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 文字字串陣列。
Version 3.30.1
新增
- GetPDFUADiagnostics 現在包含 HEADING-LEVEL-SKIP:N 檢查,用於檢測文件順序中的標題級別跳躍(例如 H1 後緊跟 H3 而中間沒有 H2)。該檢查對整棵結構元素樹執行前序遍歷,並統計下一個標題級別比前一個高出超過一級的每個位置。通用 H 元素按 H1 處理。回到更高級別標題(H3 → H1)不算作跳躍。WCAG 2.x 成功準則 1.3.1 與 ISO 14289-1 §7.1 要求標題巢狀不出現缺口。
Version 3.30.0
變更
- 結構元素屬性現已支援標籤化 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 介面中提供。
Version 3.29.1
新增
- GetPDFUADiagnostics 現在包含兩項額外檢查:是否有 Figure 結構元素缺少 Alt 文字值(報告為 FIGURE-NO-ALT:N,依據 ISO 14289-1 §7.5 和 ISO 32000-1 §14.9.3),以及是否有結構元素因 EndTag 未被呼叫而仍處於開啟狀態(報告為 STRUCT-UNCLOSED:N)。figure 檢查對結構元素樹進行完整遞迴遍歷,覆蓋所有巢狀深度的元素。
Version 3.29.0
變更
- 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 介面中提供。
Version 3.28.5
變更
- PDF/UA-1 註解無障礙改進:當 FileAttachment 註解沒有 Contents 項且沒有 /T 欄位時,現在使用註解內嵌檔案規範(/FS /UF 或 /F)中的檔名作為回退的無障礙描述。這就完整了註解 Contents 回退鏈:/T → Link URI → Stamp name → FileAttachment filename。螢幕閱讀器會讀出附件檔名而非靜默,滿足 ISO 14289-1 §7.18.1 對最常見註解型別的要求。
Version 3.28.4
變更
- PDF/UA-1 註解無障礙改進:當 Stamp 註解沒有 Contents 項(或為空)且沒有 /T 欄位時,現在使用註解 /Name 項中的圖章型別名作為回退的無障礙描述(例如 "Approved"、"Draft"、"Confidential"、"Final")。這將 v3.28.3 引入的註解 Contents 回退鏈擴充套件到圖章註解,後者常見於審閱或批准工作流,往往缺少明確的 Contents 值。
Version 3.28.3
變更
- PDF/UA-1 註解無障礙改進:當 Link 註解沒有 Contents 項(或為空)且沒有 /T 欄位時,現在使用註解 URI 動作中的 URI 作為回退的無障礙描述。該回退僅在 SetPDFUAMode 處理過程中、且僅針對攜帶 /URI 動作的 Link 註解生效。螢幕閱讀器收到 URL 作為兜底標籤,滿足 ISO 14289-1 §7.18.1 在作者建立超連結時未提供人類可讀描述的常見情景。
Version 3.28.2
變更
- SetEmbeddedFileAFRelationship 是新增 API,用於在嵌入檔案的檔案規範字典上明確設定 AFRelationship 值。ISO 14289-1(PDF/UA-1)§7.11 要求該欄位,允許呼叫方從五個有效值中選擇嵌入檔案與文件內容的語義關係:Source、Data、Alternative、Supplement 或 Unspecified。當 SetPDFUAMode 啟用時,任何缺少 AFRelationship 項的嵌入檔案會被自動賦值 Unspecified;用此函式可在儲存前覆蓋該預設值。在 Delphi 庫、ActiveX 和 DLL 介面中提供。
Version 3.28.1
變更
- 當 SetPDFUAMode 在 XMP 後設資料攜帶通用庫預設標題(而非文件特定標題)的文件上被呼叫時,標題會自動替換為文件 /Info Title 項的值(若存在)。這確保 pdfuaid:part-1 XMP 包反映實際文件標題而非佔位符,滿足 PDF/UA-1 校驗器的預期。
- XMP 解析器(LoadFromString)現在載入文件時會從既有 XMP 後設資料中讀取 dc:title 值,所以已含 dc:title 的 PDF 進行迴環往返時能正確保留該標題,而不再回退到預設佔位符。
Version 3.28.0
變更
- 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。
Version 3.27.2
修復
- 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 的輸出。
Version 3.27.1
變更
- 當 PDF/UA 模式啟用且文件含嵌入檔案時,每個缺少 AFRelationship 項的檔案規範字典在儲存時會自動獲得該項。寫入的值為 /Unspecified,滿足 ISO 14289-1 §7.11 要求每個嵌入檔案都攜帶 AFRelationship 鍵的規定。該自動補全既適用於透過 EmbedFile 新增的檔案,也適用於已載入文件中既有的嵌入檔案。
Version 3.27.0
變更
- AddRoleMap(CustomType, StandardType) 是新增的標籤化 PDF API,用於註冊一個從自定義(非標準)結構元素型別名到標準 PDF 結構型別的對映。儲存時這些對映寫入結構樹根的 RoleMap 字典,滿足 ISO 14289-1 §7.1 對使用應用特定 tag 名的文件的要求。可註冊多個對映;重複鍵會被最後一次呼叫覆蓋。同時匯出 DLL 入口點 DLAddRoleMap 和 DLAddRoleMapA。
Version 3.26.0
變更
- BeginTagEx(TagType, AltText, ActualText, Lang) 是新增的標籤化 PDF API,擴充套件 BeginTag,新增一個明確自然語言屬性。當 Lang 非空時,它會被寫入結構元素的 /Lang 屬性,啟用 ISO 14289-1 §7.2 多語言文件所需的元素級語言標註。傳入空 Lang 字串等效於 BeginTag。同時匯出 DLL 入口點 DLBeginTagEx 和 DLBeginTagExA。
Version 3.25.1
變更
- 以預設 Windows 內碼表(WinAnsiEncoding)載入的非子集化 TrueType 字型現在會寫入 ToUnicode CMap 流,為這些字型啟用可靠的 Unicode 文字擷取與複製貼上。此前只在明確覆蓋內碼表或存在 Differences 陣列時才寫 ToUnicode 流;常見的預設編碼路徑缺少該流。
- 同樣的修復也適用於以明確非預設內碼表載入且不帶 Differences 陣列的 TrueType 字型,以及透過 packaged-font 格式載入的字型。
Version 3.25.0
變更
- 當 PDF/UA 模式啟用時,所有缺少非空 Contents 項的非豁免註解(除 Widget、PrinterMark 和 TrapNet 外的全部型別)會在儲存時自動獲得該項。註解的 /T(標題 / 作者)值作為回退使用,滿足 ISO 14289-1 §7.18.1 對攜帶標題但沒有明確無障礙描述的註解的要求。
Version 3.24.0
變更
- 當 PDF/UA 模式啟用時,所有缺少 TU(工具提示 / 替代描述)項的互動表單欄位會在儲存時自動獲得該項。欄位的部分名(/T 項)作為回退值,確保螢幕閱讀器能識別每個欄位。按 ISO 14289-1 §7.18.4,下壓按鈕被正確排除在該要求之外。
Version 3.23.1
變更
- 當所選文件啟用了 PDF/UA-1 模式時,GetInformation(200) 返回 '1',使呼叫方能在執行時查詢一致性模式狀態。
- GetInformation(201) 在 PDF/A-1a 時返回 '1',PDF/A-1b 時返回 '2',PDF/A 模式關閉時返回空字串。
- GetInformation(313) 返回儲存目標當前鎖定的 PDF 版本字串,對於版本自由的文件返回空字串。
修復
- GetInformation(311) 和 GetInformation(312) 現在能正確返回最近一次版本鎖定衝突的版本要求字串與功能名(先前已在 v3.20.3 公佈但尚未實現)。
Version 3.23.0
變更
- 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 參考文件,包含完整語法表與使用示例。
Version 3.22.0
變更
- 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 文字擷取與複製貼上。
Version 3.21.0
變更
- 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 賦予有意義的標籤。
Version 3.20.3
變更
- Encrypt 和 AddSWFAnnotationFromFile 現在在儲存版本被鎖定到所選加密強度或註解型別所需最低版本以下時,立即返回 0 並設定 LastErrorCode 602,而不再靜默繼續直到儲存時才失敗。
- GetInformation(311) 與 GetInformation(312) 現在能在寫時反映衝突的版本要求,當鎖定版本阻止擴充套件級功能(如 AES-256 或 RichMedia 註解)時。
Version 3.20.2
變更
- AddU3DAnnotationFromFile 現在在向更低版本文件新增 3D 註解時會將文件版本自動 bump 到 PDF 1.6,與其他所有 PDF 1.6+ API 入口點的版本自動 bump 行為保持一致。
Version 3.20.1
變更
- 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 個已存在的樣本依賴測試被跳過。
Version 3.20.0
變更
- 另外八個 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 中。
Version 3.19.0
變更
- 儲存時與載入時 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 條新增)。
Version 3.18.6
變更
- 儲存時與載入時 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 條新增)。
Version 3.18.5
新增
- 新規則:AcroForm /NeedAppearances 按 PDF 1.5 Table 218 被識別為 PDF 1.5 功能。
變更
- PDFFeatureRules 表現在含 96 條規則(95 + 1 條新增)。
修復
- 儲存時與載入時 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)"。
Version 3.18.4
新增
- zlib-ng 迴歸覆蓋現在包含邊界尺寸 payload、PNG 類掃描線資料、stored 多塊流以及已知的 zlib 流,覆蓋 Delphi 與 C++Builder 測試 runner。
變更
- PDFlibZLib 在常規庫建置中始終使用打包的靜態 zlib-ng obj 後端,移除了餘下的 System.ZLib 回退路徑。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 194/194,C++Builder Win64x GoogleTest 通過 58 個測試,2 個已存在的樣本依賴測試被跳過。
Version 3.18.3
變更
- 生成 PDF 或文字輸出的 Delphi 與 C++Builder demo 現在在成功儲存後自動開啟生成的文件。
- Installer 打包現在把建構產物排除在 demo 目錄之外,並將 C++Builder 樣例以及 DLL、ActiveX/OCX 模組變為 opt-in 元件;只有在選擇對應元件時才會安裝匹配檔案。
Version 3.18.2
變更
- Delphi 與 C++Builder 的 EditFormField demo 現在在更新欄位值前清除 /NeedAppearances,使每個被編輯過的文字欄位在儲存的 PDF 中獲得重新整理過的 normal appearance stream。
- 這能讓儲存的 /AP 流與儲存的 /V 值保持同步,避免不同 viewer 在聚焦欄位時顯示靜態外觀流缺失的文字。
Version 3.18.1
變更
- 儲存時與載入時 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。
Version 3.18.0
變更
- 儲存時與載入時 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。
Version 3.17.0
變更
- 另外八個 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。
Version 3.16.3
新增
- 新 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。
Version 3.16.2
變更
- 載入的 PDF 現在透過 GetInformation(103)("ContributorFeatures")暴露一個僅顯示貢獻者特徵的檢視。列表只包含其最低所需版本嚴格高於 HeaderVersion(鍵 100)的功能,因此直接回答 "為什麼有效版本高於檔案頭版本?" 這個問題。
- GetInformation(101)("DetectedFeatures")保持不變,仍列出每一個匹配的功能,無論是否對版本提升做出貢獻。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 181/181,C++Builder Win64x GoogleTest 通過 57/57。
Version 3.16.1
新增
- 擴充套件了載入端檢測的測試覆蓋,新增六個合成 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。
Version 3.16.0
新增
- 新增 GetInformation 鍵:100 返回 HeaderVersion(字面 %PDF-X.Y),101 返回 DetectedFeatures(載入時匹配的功能,CRLF 分隔),102 返回 AutoBumpedFeatures(觸發 writer 端 EnsureMinVersion 的功能,CRLF 分隔)。
變更
- 載入的 PDF 文件現在會經過內容驅動的版本檢測過程:每個間接物件都透過儲存時合規門所用的功能-最低版本表進行遍歷,當內容實際要求更高版本時,FVersion 會被 bump 到高於字面 %PDF-X.Y 頭部值的水平。例如某個 /UserUnit 頁面項會把有效版本 bump 到 PDF 1.6,即使檔案頭說 PDF 1.4。
- 儲存時合規門不受影響:在載入時被 bump 了有效版本、隨後透過 SetInformation(0, ...) 明確降級的文件,儲存時仍會觸發 LastErrorCode 602。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 173/173,C++Builder Win64x GoogleTest 通過 57/57。
Version 3.15.0
變更
- 生成需要特定最低 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。
Version 3.14.3
變更
- 儲存時 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。
Version 3.14.2
變更
- 儲存時 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。
Version 3.14.1
變更
- 儲存時 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。
Version 3.14.0
變更
- 儲存時 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。
Version 3.13.0
變更
- 把儲存時拒絕高版本功能的 PDF 版本合規門重構到獨立模組中,使規則集可以擴充套件而不會擾動文件核心。
- 對比 v3.12.7,無使用者可感知的行為變化:同一批越版本功能仍會被以 LastErrorCode 602 拒絕。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 155/155,C++Builder Win64x GoogleTest 通過 57/57。
Version 3.12.7
新增
- 擴充套件了 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。
Version 3.12.6
變更
- 以 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 失敗。
Version 3.12.5
新增
- 新增對未知字面字串轉義以及混合八進位制/非八進位制轉義序列的迴歸測試覆蓋。
變更
- 改進 PDF 1.7 字面字串解析,使未知轉義序列按標準要求忽略反斜槓。
- 字面字串的八進位制轉義現在只消費八進位制數字,並將緊隨其後的非八進位制數字保留為普通字串資料。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 141/141。
Version 3.12.4
新增
- 新增對右花括號名字分隔符與稀疏壓縮物件 xref 流項的迴歸測試覆蓋。
變更
- 改進 PDF 1.7 詞法解析,使名字物件正確在右花括號分隔符處停止。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 139/139。
修復
- 修復 SmartAccess 載入 xref 流壓縮物件項時,物件流編號大於 PDF 位元組長度的情況。
Version 3.12.3
新增
- 新建的 AES 加密 PDF 現在將加密過濾器 Length 值按位長度寫出,與 PDF 1.7 加密過濾器字典契約一致。
變更
- 改進對使用標準安全處理器、含 StrF、StmF、EFF、Identity、None 或 StdCF 風格命名加密過濾器的 PDF 1.7 加密文件的相容性。
- 後設資料流現在在解密、加密以及複製/儲存工作流中遵守 EncryptMetadata=false,而不再當成普通流處理。
- 嵌入檔案流現在攜帶 /Type /EmbeddedFile,並在載入或儲存加密文件時使用嵌入檔案加密過濾器決策路徑。
- 外部嵌入檔案流現在在 FFilter 升級為 Filter 時同步將 FDecodeParms 升級為 DecodeParms,保留流解碼引數。
- XRef 流的 Prev/XRefStm 值以及較大數值偏移量現在在解析器與 SmartAccess 路徑中保持 64 位精度。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 137/137。
Version 3.12.2
變更
- 改進 PDF 1.7 流解碼相容性。通用流解碼現在把 /DP 視作 DecodeParms 別名、解析間接解碼引數陣列項,並接受 /AHx 與 /LZW 標準過濾器縮寫。
- 大檔案 PDF 輸出現在通過 64 位格式化路徑寫入 xref、startxref、linearization 以及數字簽名 ByteRange 偏移量,而不再通過 32 位整數 helper 將這些值收窄。
- 已載入文件現在把目錄 /Version 項當作有效 PDF 版本(當其比檔案頭版本更新時)。
- 驗證:Delphi Win32 與 Win64 DUnitX 套件各通過 134/134。
修復
- 重寫的 xref-stream trailer 在 PDFlibPas 把它們儲存為經典 trailer 字典時,不再保留僅流相關的 DecodeParms 鍵。
Version 3.12.1
變更
- 生成的 PDF 開啟時第一頁會按 viewer 視窗的可用高度調整大小,因此整頁能在視窗允許的最大縮放下從上到下完整可見。在文件上配置自定義 OpenAction(SetOpenActionDestination、SetOpenActionMenu、SetOpenActionJavaScript)可覆蓋此預設行為。
Version 3.12.0
新增
- 為靜態 C 庫新增 32 位元組對齊的 malloc/calloc/realloc/free CRT 樁,並修復 TPDFJPEGImage.Compress,使 jpeg_mem_dest 緩衝區透過分配它們的同一 C free 路徑釋放。
- 擴充套件公共驗證說明,標明本次釋出背後的嚴格自動化覆蓋:庫建置、壓縮往返、HelloWorld /FlateDecode 輸出、JPEG 渲染、影像工作流、字型、表單、安全、簽名、列印以及 C++Builder demo 衍生工作流。
變更
- 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 原始檔,而不再依賴單一全域性編譯器開關。
Version 3.11.0
新增
- 為 Win64 建構新增一小段 zlib-ng 橋接 obj,讓 Pascal 程式碼保持穩定的 zlib 相容入口點,而 Delphi 和 C++Builder 各自使用自己的連結器相容 obj 集合。
變更
- 將 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 集合。
- 更新了所有 C++Builder demo 專案以定義 PDFLIB_CPPBUILDER,與 GoogleTest runner 匹配,防止 Win64x demo 連結到 Delphi Win64 的 zlib-ng obj。
修復
- Win64 路徑不再經過 Delphi 的 System.ZLib 單元,因此 PDF 流壓縮/解壓可以像 32 位建構一樣享受 zlib-ng 後端的最佳化。
Version 3.10.3
新增
- 擴充套件 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。
Version 3.10.2
新增
- 在 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 引擎選擇的渲染器切換測試。
Version 3.10.1
新增
- 在 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.
Version 3.10.0
新增
- 為 Demo 下的每個 Delphi 樣例新增 C++Builder 原生版本。PDF 建立、頁面操作、字型、影像、安全、簽名、渲染與列印 demo 現在都可從 C++Builder 建置並執行,無需任何 Delphi 端封裝。
- 為每個 Delphi demo 目錄新增簡短的英文 Readme.txt,描述該 demo 展示什麼、關注哪個 API 以及如何執行;位於 Demo\Delphi\index.html 的 HTML 總覽按主題分組連結到所有 demo。
變更
- 每個新 demo 位於 Demo\C++Builder\<Name>\ 下,是一個直接消費 Lib\PDFlibrary.pas 的控制台專案,並附帶執行所需的輸入檔案。
- 為每個 C++Builder demo 映象同一份 Readme.txt,其 Run 段為控制台工作流重寫(用 argv 引數替代 Open/SaveDialogs);位於 Demo\C++Builder\index.html 的對應總覽以同樣的主題分組列出每個 C++Builder demo。
修復
- 修復 ImportEMF demo 的記憶體洩漏(TPDFlib 例項被建立但未釋放)。
Version 3.9.14
變更
- 整理換行文字與 HTML 分頁 demo,使每個 demo 專注於自己的 API 並透過單一按鈕執行。
- 重新命名兩個 demo 專案(EmbeddedFonts 與 PdfPermission),使編譯出的執行檔與資料夾名匹配,而不是早期的原型名。
修復
- 修復頁面範圍複製 demo,使其真正複製頁面而不是總是報告失敗。
Version 3.9.13
新增
- 引入自動化 DUnitX 測試套件(控制台與 VCL GUI runner),覆蓋工具單元(buffer、AES、ZLib、Unicode、摘要雜湊)以及庫級工作流,包括文件建立、儲存到檔案與儲存到流、載入迴環以及 AES-128/AES-256 加密。
修復
- 修復內部緩衝區 reader 的流位置 bug:兩位元組字讀取原本把讀取游標推進了四位元組而不是兩位元組。在長度超過兩位元組的緩衝區中,後續讀取會落到錯誤的偏移並靜默返回錯誤資料。該影響在解析交錯位元組與字讀取的二進位制資料結構時最明顯。
Version 3.9.12
變更
- GDI+ 影像渲染現在在把光柵影像縮放到螢幕或匯出解析度時預設使用平滑、高品質的雙三次插值。此前預設為最近鄰,會在螢幕預覽或高 DPI 匯出中放大小影像(logo、縮圖)時產生明顯的臺階狀偽影。偏好更銳利的最近鄰模式的呼叫方可透過 SetGDIPlusOptions 恢復舊行為。
Version 3.9.11
修復
- 修復 Cairo 渲染中使用顏色鍵透明度(影像字典中的 /Mask 顏色範圍陣列)的 PDF 影像。此前當頁面包含該形式透明度的影像時,Cairo 渲染器會完全省略該影像,而不是把它合成到頁面背景上。修復後會按宣告的顏色鍵範圍派生逐畫素 alpha 通道,並以透明影像渲染,輸出在視覺上與 GDI+ 渲染器一致。
Version 3.9.10
修復
- 修復 Cairo 渲染迴歸:所有跟在被裁剪影像序列之後的頁面內容都被錯誤地限制在影像的裁剪矩形內。儲存 graphics state、應用 clip path、繪製圖像、然後恢復 state — 這是帶框或帶邊框影像的常見佈局技術 — 這樣的 PDF 頁面會把後續所有文字、形狀和圖形都渲染在裁剪區域之內。Cairo 的 state save/restore 現在與 PDF q/Q 運算子正確對映,所以影像繪製完後裁剪區域會被丟棄。
Version 3.9.9
新增
- 在 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 輸出,無需任何程式碼修改。
Version 3.9.8
修復
- 抑制了 Win32 C 執行時樁中兩個偽編譯器診斷,這兩個診斷在 RAD Studio 13.1 及更新版本出現。一個廢棄警告(W1000)因為編譯器版本能力守衛沒有傳播到 Delphi 2009 以後的編譯器,導致它們以廢棄的記憶體管理器 API 編譯。一個未使用變數提示(H2164)針對一個僅 Delphi 7 建置需要的內部相容變數;該變數現已限定在那個版本的條件塊內。兩個問題都僅為診斷性,無執行時影響。
Version 3.9.7
新增
- 為 Windows 新增可選的基於 PDFium 的頁面渲染,包括 BMP 流渲染、裝置上下文渲染、記憶體渲染以及印表機輸出。
變更
- 更新 Delphi MultiFunction View/Print demo,增加渲染器選擇器,使使用者可在既有 GDI+ 渲染器與 PDFium 之間切換。
Version 3.9.6
新增
- 為完整 PDFlibPas 包和試用包提供獨立的 Inno Setup 指令碼,針對釋出場景排除版本控制後設資料、建置輸出、IDE 快取、本地 agent 檔案以及非釋出範圍內的打包第三方原始碼樹。
變更
- 試用 installer 現在在生成 setup 執行檔之前,為 RAD Studio 11.3、12.3 和 13.1 建置並打包試用版二進位制庫以及試用版 Delphi demo。
Version 3.9.5
修復
- 修復在 RAD Studio 9.0 / Delphi XE2 下的 Win32 庫建置。建置指令碼此前傳遞的 DCU 輸出目錄標誌只在 Delphi 2010 及以後存在;XE2 的編譯器以不同方式解釋該標誌,產生錯亂的輸出路徑並在處理任何原始檔前發生致命錯誤。指令碼現在會根據目標編譯器版本自動選擇合適的標誌。
- 修正了庫原始碼中相關的編譯器版本守衛,它原本在 XE2+ 條件下呼叫一個 XE4 才引入的命名限定執行時函式。針對 XE2 與 XE3 的建構現在會改用正確的相容匯入。
Version 3.9.4
修復
- 修復網路與伺服器共享印表機的設定:透過印表機 DEVMODE handle(而非印表機裝置上下文 handle)來應用紙盒、介質、雙面、品質等列印設定。
Version 3.9.3
變更
- 在 Win32 與 Win64 上將打包的 AES 後端重新整理到 Brian Gladman 2018 年的 AES 原始碼。可復現的建置指令碼現在允許隨時從原始碼重建靜態 AES obj。過程中發現並修復了 Pascal 繫結的一個 ABI 缺陷:AES-CBC 加密與解密函式缺少 C 呼叫約定宣告,因此 Win32 建構會靜默地以錯誤的暫存器順序傳遞引數,可能產生錯誤的加密輸出。Win64 建構不受影響,因為該平臺強制統一呼叫約定。
安全
- 加固第三方重建指令碼,使基於 MSVC 的 zlib、JPEG 和 CRT 樁指令碼可以從倉庫根和 thirdparty 目錄啟動;此前需要工作目錄設為 thirdparty 目錄。
Version 3.9.2
修復
- 在 Win32 與 Win64 上把 JPEG 2000 後端從舊版 OpenJPEG 1.5 升級到 OpenJPEG 2.5.4。兩個平臺現在都使用靜態物件連結,因此 JPEG 2000 的編碼與解碼無需額外執行時 DLL。新版編解碼帶來當代 JP2/J2K 頭部處理、回撥驅動的流 API,以及來自上游專案積累的 bug 與安全修復。公共 TJpeg2000Bitmap API 保持不變。
Version 3.9.1
修復
- 修復 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 流載入。
Version 3.9.0
變更
- 把打包的 JPEG 2000 後端從舊版 OpenJPEG 1.5 升級到 OpenJPEG 2.5.4。JPEG 2000 載入與儲存現在使用當代編解碼、回撥驅動的流 API 以及當代 JP2/J2K 頭部處理,同時保留公共 TJpeg2000Bitmap API。
修復
- JPEG 2000 輸出現在為小影像自動選擇有效的 OpenJPEG 解析度數,並且 Win32 靜態後端不再依賴缺失的 MSVCRT helper 匯出。
Version 3.8.1
修復
- 消除了 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 輸出乾淨無警告。
Version 3.8.0
安全
- Win64 JPEG 編解碼從 IJG 風格 libjpeg 升級到 libjpeg-turbo 3.1.90,完成了 v3.7.0(Win32)啟動的 JPEG 遷移。Win32 與 Win64 路徑現在共享同一現代 JPEG 編解碼,配同樣的 SIMD 最佳化內部迴圈以及來自上游累積的 30 多個 CVE / fuzz 修復。公共 PDFlibPas API 保持不變。
Version 3.7.0
安全
- Win32 JPEG 編解碼從 IJG libjpeg-6b 升級到 libjpeg-turbo 3.1.90。透過 SIMD 最佳化的內部迴圈顯著提升 JPEG 編碼/解碼速度,外加 libjpeg-turbo 上游累積的 30 多個 CVE / fuzz 修復。公共 PDFlibPas API(TPDFJPEGImage 類、DumpJPEG 函式)保持不變;既有 PDF/JPEG 程式碼路徑無需原始碼改動即可獲得加速。
Version 3.6.0
變更
- 本次釋出 Win64 zlib 路徑未變 — 它繼續使用 Delphi 打包的 System.ZLib 單元。
- 為 Win32 zlib 路徑啟用 Win64 連結期 CRT 樁 PDFlibCLibs.pas(v3.5.0 引入),提供新 zlib 1.3.2 obj 檔案所引用的 memcpy / memset / malloc / free 符號。
安全
- Win32 zlib 從 1.2.x 升級到 1.3.2。包含 1.2.8 以來上游累積的標準 25 多個 CVE / fuzz 修復,外加 64 位視窗流所用的新 inflateBack9 / inflateTree9 入口點。公共 PDFlibPas API(DeflateStr / InflateStr / InflateStrParms)保持不變。
Version 3.5.0
新增
- 為 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。
變更
- 為打包的 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 檔案。
Version 3.4.0
安全
- 加固加密金鑰、AES 初始化向量與 Perms 許可權塊的生成,使其不受可預測隨機數源影響。在牆鍾時間接近的系統上生成的加密 PDF 不再可輕易關聯;AES-256 文件現在保持完整的金鑰強度。
- 加固影像字典解析,使其能抵禦聲明瞭不合理 Width、Height、BitsPerComponent 或 DeviceN 分量數的畸形或惡意 PDF。越界值在任何畫素緩衝區算術之前被夾緊,防止開啟此類檔案時崩潰。
- 加固交叉引用與頁面樹遍歷,使其能抵禦 /Prev xref 鏈或 /Parent 頁面連結形成迴圈或過深的文件。reader 現在乾淨地拒絕畸形結構,而不是遞迴到棧耗盡。
Version 3.3.1
新增
- 在已經存在於初始 Git 基線中的 PDFlibRenderer.pas 渲染修復周圍新增內聯說明性註釋。註釋記錄了 SetPen 為何按活動 canvas 變換縮放筆畫寬度,以及 Type 3 字型 CharProc d0/d1 運算子為何必須消費它們的運算元。無執行時行為變化。
修復
- 精簡每個元件的 Windows 建置指令碼。DLL/、OCX/ 與 Dylib/ 目錄不再帶各自的 build12-* / build13-* 變體:每個平臺現在只有一個 build-Win32 / build-Win64 指令碼,固定到最新的 RAD Studio,並接受一個可選的 "debug" 引數。
Version 3.3.0
修復
- 修復 PDFlibRenderer.pas 中變換後筆畫的渲染。SetPen 現在在呼叫 Picasso 前把當前 canvas 變換比例應用到 PDF 線寬,避免在座標已被變換的路徑上出現過粗或過細的筆畫。這修復了 Type 3 字形輪廓可能被渲染為粗大不規則塊的問題。
- 修復內容流解析器中 Type 3 字型 CharProc d0/d1 處理。d0 現在消費它的兩個寬度運算元,d1 在後續繪圖命令執行前消費它的六個寬度/包圍盒運算元,防止陳舊運算元破壞字形或路徑幾何。