更新日志
版本发布历史
PDFlibPas 库的版本历史。条目按时间倒序排列,每个版本遵循项目发布策略中的语义化版本规范。
最新发布
- 最新版本: v3.76.3; 发布日期: 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 对字段与 widget
/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 的自由变形和库恩斯曲面块生成正确的填充
- 密件撰写现在在现有内容清除的基础上,输出一个真实的
/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 个操作符进行分桶,将每个标记的线性扫描缩减为简短 of 残留比较 - PDF/A 颜色空间审核现在递归处理 Indexed、Separation、DeviceN 和 ICCBased 的基色或替代空间,深度可达 8 层,因此能够标记隐藏的 DeviceCMYK 色调转换或裸 Lab 名称,而不会静默通过
- 整形字体完成操作现在遍历绘制时记录的已使用字符集,而不是在每次保存时将所有 65536 个字符槽扫描四次
- 字符串转义程序 (字面量字符串、XFDF、印章和变量标记展开) 通过
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,并报告其资源名称、对象编号 and 变换后的边界 - 窗体快照公开了原始的
/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
- 页面内容状态枚举现在使用简单或复合字体度量、水平缩放、间距和 vertical 书写规则来推进
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
- 增加了完整的显式远程目标写入,支持从零开始的页码、所有标准适应类型、可空 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中,从页面字典中读取页面显示持续时间,并清除过渡和计时条目 - 标准的 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 搜索面板 and 搜索高亮层现在一次性消耗流式 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 文件,已准备好用于SignFileand 签名处理 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) 动作及可选的新窗口请求,打开当前文档中嵌入的 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控件中添加了交互式表单填充:单击复选框或单选按钮可切换其状态,单击文本或选择字段会在该字段上打开一个就地编辑器(回车提交,Esc 取消,离开编辑器提交);只读字段保持不变,修改后的页面会自动重新渲染 - 每次写入都会触发新的
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和可配置 ofSearchHighlightColor 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 现在还接受标准 data 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>回退时仍然 apply 该回退
Version 3.187.0
Changed
- 改进多选选择字段的 XFDF 表单数据交换:重复的
<value>元素现在会导入到已选值数组中,导出 multi-select choice field 现在会为每个已选项写入一个<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>元素,跳过非终端父字段值,将 file exports 写入为 UTF-8,并导入支持嵌套字段、单引号属性、CDATA、XML 实体 and 数值字符引用的具有灵活空白字符的 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):可通过命名空间 + 键设置 any 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将每个匹配矩形映射 to 其覆盖的指令,进行重写并写回图层
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,新增注释变体矩阵,在配套 the 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 子集更新、已安装字体探测、文档字体枚举 and 字体诊断报表
Version 3.170.0
Added
- 新增 CanvasMigrationMatrix Delphi 控制台 Demo,用于 Canvas DC 迁移、原始内容和路径入口点、Delphi 颜色助手、图案填充文本、水印、页面缩略图工作流和渲染的验证预览
Version 3.169.0
Added
- 新增专用的 LayerCompositionMatrix、TransparencyMaskMatrix 和 ComplianceFormWorkflowMatrix Delphi 控制台 Demo,用于可选内容打印/导出策略、Pattern/Form XObject 组合、transparent mask 比较、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
新增
- 新增
AddLinkToSubmitForm和AddLinkToResetForm,使得页面热点可以通过标准 PDF 动作提交或重置 AcroForm 字段,而无需 JavaScript
Version 3.140.0
新增
- 新增
AppendToStream,使得增量更新工作流可以直接写入调用者提供的流,而无需先将更新实体化为AnsiString
更改
SaveToStream现在直接序列化到目标流中,并且AppendToString(1)现在仅返回增量更新部分,而无需将原始源字节复制到临时缓冲区中
Version 3.139.0
新增
- 新增
GetAnnotReplyTo和GetAnnotReplyType,使得线索化的注释回复可以通过命名的读取端访问器进行检查,而无需使用通用的注释属性标签
Version 3.138.0
新增
- 新增 Delphi
DocumentInspectionWorkbench示例,用于批量检查 PDF,包含组合的字体诊断、图像采样、颜色空间发现、加载计时,以及 JSON、CSV 和 HTML 报告
Version 3.137.0
新增
- 新增 Delphi
ImageDecodeBenchmark示例,用于测量页面图像发现、解码的图像字节,以及带有 CSV 和 HTML 计时报告的页面颜色空间发现
Version 3.136.0
新增
- 新增
GetDocumentFontDiagnostics和TPDFlibFontDiagnostics,通过一次调用即可汇总文档字体内嵌、子集化、Standard 14、CID、Type3 和未知字体的数量
Version 3.135.0
新增
TPDFlibSignatureVerifier.VerifySignerCertificateChain现在使用 Windows CryptoAPI 构建嵌入的签名者证书链,并仅当该链满足 Windows 基本信任策略时返回vsValid,而自签名或其他不受信任的签名者证书则返回vsInvalid,且不改变VerifySignature的内容完整性结果
Version 3.134.0
修复
TPDFlibSignatureVerifier.VerifySignature现在可以验证旧的adbe.pkcs7.sha1签名,当签名的摘要与所覆盖的/ByteRange字节匹配时返回vsValid,并在覆盖的内容发生更改后返回vsInvalid
Version 3.133.0
新增
- 新增
RenderPagesToFiles和DARenderPagesToFiles,用于将任意页面范围渲染到编号的输出文件中,同时在所选页面之间重用渲染器设置
Version 3.132.0
新增
- 新增
AddPageHeader和AddPageFooter便捷印章功能,用于在页面范围内的每一页固定的顶部或底部边距处放置文本,支持左/中/右对齐以及标记展开(&P当前页,&N总页数,&D日期,&T文档标题,&&字面量 & 号) - 使用
soUnderlay的StampText和StampImage现在通过前置一个新的内容层,真正地将内容放置在现有页面内容之下(以前它像soOverlay一样绘制在顶部);由一个新的PrependContentLayer页面树方法提供支持
Version 3.131.0
新增
- 新增
ScalePage(ScaleX, ScaleY, Anchor),通过将每个内容层包装在q sx 0 0 sy tx ty cm ... Q图形状态块中并调整 MediaBox 和 CropBox 的大小来缩放所选页面的内容;锚点保持左下角原点(0),使内容居中(1)或保持左上角(2) - 通过新的
ekPath元素种类扩展了EnumPageElements:现在,每个页面还会报告其矢量路径,包括边界框、点数、闭合标志和绘制操作符,这些路径是通过结构化内容模型从内容流中提取的
Version 3.130.0
新增
- 新增三个文件大小优化 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
新增
- 为之前仅支持读取/解析的四种着色类型新增了网格着色创建 API:
NewRGBFreeFormTriangleMesh(ShadingType 4,自由形式 Gouraud 三角形)、NewRGBLatticeTriangleMesh(ShadingType 5,晶格形式 Gouraud)、NewRGBCoonsPatchMesh(ShadingType 6,Coons 补片网格)和NewRGBTensorPatchMesh(ShadingType 7,张量积补片网格)—— 每个 API 都从平坦的顶点或补片列表中构建一个命名的网格着色图案,具有可选的坐标/颜色位深度和边界框,可像现有的轴向和径向着色器一样通过SetFillShader/SetLineShader/SetTextShader进行选择
Version 3.128.0
新增
- 为查看器增加了一个缩略图条:
TPDFlibThumbnailBar会显示每一页的缩微图,并在行滚动到视图中时延迟渲染,下方带有页码;点击缩略图会使附加的查看器跳转到该页 —— 从而完善了查看器控件系列(查看器、书签面板、搜索面板、缩略图)
Version 3.127.0
新增
- 为查看器增加了一个搜索面板:
TPDFlibSearchPanel.RunSearch搜索整个附加的文档,并为每个命中项列出一行,包含其页码和匹配的文本;点击命中项会使查看器跳转到该页
Version 3.126.0
新增
- Added a bookmark panel for the viewer:
TPDFlibOutlineViewerlists the document outline tree with indentation and jumps the attached viewer (viaAttachViewer) to a bookmark's destination page when clicked; it is built on a reusable panel base class that later side panels share
Version 3.125.0
新增
- 为查看器控件增加了文本选择功能:使用鼠标左键拖动以选择,按 Ctrl+C 或调用
CopySelectedText将所选内容复制到剪贴板;捕获的文本可以通过SelectedText属性获取,按从上到下的顺序排列,并在带区之间带有换行符 - 新增
GetTextInRegion,可直接返回页面矩形区域的文本 —— 这与鼠标选择使用相同的基于块的查找方式,可供自定义选择界面使用
Version 3.124.0
新增
- 查看器控件现在可以在后台线程上预渲染相邻的页面,因此向前或向后翻页时会立即显示下一页;工作线程使用其自身的文档实例,并将完成的渲染结果提交给缓存,而不会阻塞 UI
- 为查看器增加了链接交互功能:点击链接注释会触发
OnLinkClick,并带有页码以及与GetAnnotActionInfo生成的相同的类型化动作摘要(网址、文档目标、命名动作等);LinkActionAtPagePoint暴露了底层的命中测试以供自定义处理
Version 3.123.0
新增
- 查看器控件获得了连续滚动功能:
SetDisplayMode可将TPDFlibViewer在单页显示和整个文档的垂直连续滚动之间切换,仅渲染视口中可见的页面,并且当前页面会跟踪滚动位置(当页面进入视图时触发OnPageChange) - 渲染后的页面现在保留在最近最少使用的位图缓存中,因此来回滚动时不会重新渲染;内存预算默认为 128 MB 并可通过
SetCacheLimit进行调整,当预算缩小或填满时会逐出最旧的页面 - 为查看器增加了鼠标滚轮滚动和键盘导航功能:PageUp/PageDown(在单页模式下为页面步进,在连续模式下为视口步进)、方向键、Home 和 End
Version 3.122.0
新增
- 增加了一个交互式 PDF 查看器控件:
TPDFlibViewer是一个 VCL 滚动控件,它可从文件打开文档或附加到现有的TPDFlib实例上,通过选定的渲染引擎(GDI+、Cairo 或 PDFium)显示页面,并提供页面导航(GoToPage/NextPage/PrevPage带有OnPageChange事件)和缩放控制 —— 固定百分比、适合宽度或适合页面,在控件调整大小时自动重新计算;比视口宽的页面会滚动,较窄的页面则居中 - 增加了一个设计时包(
Package\PDFlibViewerPkg.dpk),它将该控件注册到 losLab PDF 面板页上,以便在 IDE 中拖放使用
Version 3.121.0
新增
DrawText中的自动复杂脚本(complex-script)塑形功能:包含阿拉伯语、希伯来语、印度语族或其他复杂脚本字符的文本现在会被自动检测并塑形 —— 上下文的字母形式、强制连字和从右到左的排序在无需更改代码的情况下均能正确输出;Standard 14 名称映射到其度量兼容的已安装字体面(Helvetica 对应 Arial,Times 对应 Times New Roman,Courier 对应 Courier New),并且GetTextWidth也是通过相同的塑形通道进行测量,因此对齐保持一致;拉丁语、西里尔语、希腊语和 CJK 文本保留其现有的绘制路径(逐字节一致)- 新增
SetTextShaping以切换自动路由(默认启用;传入 0 以恢复确切的塑形前行为)
Version 3.120.0
更改
- 塑形文本的配套字体现在在保存时仅会子集化为文档显示的字形,从而极大地缩小了输出文件(超过一兆字节的完整字体程序缩减为仅包含使用的字形);子集化的字体保留了其字形编号,带有一个加了子集标签的
BaseFont名称和真实的每个字形/W宽度,并获得了一个 ToUnicode 映射表,可将每个塑形的字形转译回其源字符 —— 因此,复制或提取DrawShapedText的输出将会返回原始字符串,包括 lam-alef 连字背后的两个字母
Version 3.119.0
新增
- 增加了复杂脚本文本绘制功能:
DrawShapedText会在绘制阿拉伯语、希伯来语和其他复杂脚本字符串之前对它们进行塑形 —— 上下文的字母形式、强制连字(如 lam-alef)以及从右到左的排序均能正确输出 —— 并通过嵌入整个字体程序的配套 Type0(Identity-H)字体写入这些成形的字形,因此没有自己字符代码的形式也能精确渲染;每个字体面会创建一个配套字体,并在后续调用中重用 - 新增
GetShapedTextWidth,它通过相同的塑形通道测量文本,因此连字文本会按照其真实的绘制宽度进行测量 —— 可使用它来右对齐或居中对齐塑形的段落
Version 3.118.0
新增
- 增加了复杂脚本(complex-script)文本塑形的基石:新的 Uniscribe(usp10.dll)绑定能将阿拉伯语、希伯来语等复杂脚本字符串转换为正确的顺序和成形的字形序列 — 包括上下文阿拉伯字形、强制连字(如 lam-alef)以及从右到左的排序 — 并报告每个字形的字体字形索引、advance 和源字符簇;这是后续版本在其上构建绘制路径的塑形引擎,它是延迟加载的,因此没有 Uniscribe 的平台只需保留现有的每字符路径即可
Version 3.117.0
新增
- 增加了 ICC 配置文件自省功能:
GetOutputIntentICCInfo可以解析附加在文档 OutputIntent 上的 ICC 配置文件,并报告其版本、设备类、数据颜色空间、配置文件连接空间、渲染意图和组件数量 — 这对于检查 PDF/A 和 PDF/X 文件的打印条件非常有用;现在当着色颜色空间既没有/Alternate也没有/N时,渲染器的 ICCBased 颜色空间处理也会从配置文件头部提取组件数量
Version 3.116.0
新增
- 增加了支持表格的文本提取模式:
GetPageText的选项 10 会将页面文本块的左边缘聚类到全局列位置,并发出制表符分隔的行,因此表格布局会被提取为可供导入的 TSV 格式,并且垂直对齐的单元格在各行之间保持对齐
Version 3.115.0
新增
- 增加了页面拼版功能:
ImposePagesNUp会将文档的每一页排列在新纸张上的 N 拼网格中(如 2 拼、4 拼、9 拼或任意 列 x 行 的排列),每页都作为活动矢量内容等比缩放并居中放置在单元格内,或者 — 使用小册子选项 — 生成骑马钉纸张,当双面打印并堆叠时,其页面配对可以折叠成小册子
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 声音机制所期望的有符号编码,从而完善了与现有GetAnnotSoundToFile/GetAnnotSoundToString读取器的数据往返
Version 3.111.0
新增
- 增加了线索化的注释回复(ISO 32000-1 §12.5.6.3):
AddAnnotationReply可作为隐藏的 Text 注释向任何现有注释追加回复,该注释的/IRT引用了目标,并具有/RT回复关系,从而使得 Acrobat 和其他阅读器能在注释面板中将其显示在目标的线程下;将其与AddAnnotationState和 FDF 注释交换功能结合,可实现完整的协同审查往返
Version 3.110.0
新增
- 增加了网格和基于函数的着色渲染,从而完成了对所有七种 PDF 着色类型的覆盖支持:自由形式的 Gouraud 三角网格(类型 4)、晶格形式的 Gouraud 网格(类型 5)、Coons 补片网格(类型 6)和张量积补片网格(类型 7)均可从其位打包的数据流中解码 — 包括共享边缘的补片标志、
/Decode值映射以及可选的颜色/Function渐变 — 并通过 Cairo 引擎的原生网格渐变进行绘制;基于函数的着色(类型 1)通过在其定义域内将着色函数采样到精细的补片网格中来近似;支持的颜色空间涵盖 DeviceRGB、DeviceGray、DeviceCMYK 以及基于 ICC 的替代方案(GDI+ 引擎没有网格渐变图元,网格着色区域将保持未绘制状态)
Version 3.109.0
新增
- 通过文本级别的编辑完成了内容编辑框架(第 4 阶段):
TPDFContentProgram.GetTextRuns能遍历页面的文本显示指令,并带有每个指令处活动的字体资源和字号(通过保存/恢复嵌套来跟踪字体状态),且ReplaceTextRun能够在原地交换所显示的文本 — 这是一种真正的内容流替换,它保留了原始位置、字体和颜色,不同于那些遮蔽旧文本并在顶层重绘的覆盖式方法
Version 3.108.0
新增
- 为内容编辑框架添加了页面几何的对象模型(第 3 阶段):
TPDFContentProgram.LiftPath会将路径对象(移动/线条/曲线/矩形构造操作符,以及结束路径的剪裁和绘制操作符)提升为包含子路径和分段的可编辑的TPDFPath;TPDFPath.Transform会对每个点应用仿射矩阵(从而移动、缩放、旋转或倾斜现有艺术图形);LowerPath会将修改后的几何体覆写回原始指令上,以便WritePageContentLayer进行写入
Version 3.107.0
新增
- 通过在
TPDFContentProgram上新增指令级便利功能,扩展了内容编辑框架(第 2 阶段):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)注释的边框转换为由相连半圆组成的“修订云(revision cloud)”,其中强度 1 或 2 匹配 Acrobat 的云状样式,0 则移除该效果;GetAnnotCloudyEffect会读回该设置(0 = 无云效果,否则为 1..2 的强度)
Version 3.100.0
新增
- 增加了注释审查状态(ISO 32000-1 §12.5.6.3):
AddAnnotationState可通过追加一个隐藏的 Text 注释来记录现有注释的审查状态更改,其/IRT指向目标且/State+/StateModel承载了该状态,支持 Acrobat 注释审查工作流中使用的Review模型(无/接受/拒绝/取消/完成)以及Marked模型(未标记/标记);GetAnnotState和GetAnnotStateModel会从任意注释中回读记录的字符串(缺失时为空)
修复
- 修复了阻止基于近期开发版本构建的应用程序启动的加载时故障(某 Windows 证书名称查找绑定到了不存在的 DLL 入口点上),并修复了 FDF 注释导入、页面范围旋转以及签名标志路径中的编译回归问题
Version 3.99.0
新增
- 新增文档指纹和过渡效果读取 API:
GetDocumentFileID返回来自 trailer 的/ID数组中的永久文档标识符(十六进制编码的首个元素),可用作稳定的缓存键或文档指纹;GetPageTransition是SetPageTransition的读取端对应方法,通过反向映射存储的/Trans/S、/Dm和/M条目,返回作为强类型TPDFlibPageTransition值的过渡样式,以及显示持续时间和过渡持续时间
Version 3.98.0
新增
- 新增页面范围旋转和缩略图内省功能:
RotatePageRange对范围内的每个页面应用 0/90/180/270 旋转(封装了现有的单页RotatePage,以便调用者不再需要每页循环);HasPageThumbnail报告页面是否带有/Thumb条目;GetPageThumbnailInfo读取缩略图图像 XObject 的宽度、高度和每个组件的位数(bits-per-component)
Version 3.97.0
新增
- 新增扩展的注释属性读取器:
GetAnnotColor读取/C颜色数组(0..1 RGB,包含一个区分 “无显式颜色” 与 “显式黑色” 的 HasColor 标志);GetAnnotBorderWidth读取/BS /W,并回退到旧的/Border数组;GetAnnotOpacity读取/CA描边 alpha(默认 1.0);GetAnnotCreationDate读取/CreationDate时间戳;GetAnnotFlags读取/F可见性/打印标志字节
Version 3.96.0
新增
- 新增读取端安全内省 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
新增
- 新增高级打印和文本替换功能:
PrintDocumentAdvanced在副本/排序之上,通过强类型的TPDFlibPrintSettings记录驱动完整的打印机 DEVMODE(双面打印、方向、颜色、打印质量、纸张大小、纸张托盘),通过现有的自定义打印机配置文件机制应用每个非默认字段;SearchAndReplaceText在页面范围内运行搜索,并对于每个命中项,使用不透明的白色矩形遮罩原始文本块,然后在调用者选择的字体中于该块原点处重绘替换文本,以镜像 PDFtoolkit 的 SearchAndReplace 的覆盖替换行为
Version 3.94.0
新增
- 新增注释 FDF 交换(Acrobat “Export/Import Comments”):
ExportAnnotationsToFDFString和ExportAnnotationsToFDF遍历每个页面的/Annots并将每个注释序列化为 FDF/Annots数组内的一个/Type /Annot条目,携带/Subtype、/Contents、/Rect、/T作者标签、/Subj以及从 0 开始的/Page索引;ImportAnnotationsFromFDFString和ImportAnnotationsFromFDF使用小型状态机解析此类 FDF 并将每个条目作为匹配页面上的新注释重新创建,保留完整的注释字典而不是将其折叠为便利贴
Version 3.93.0
新增
- 新增签名认证和表单字段属性 API:
SetSignProcessDocMDP通过在级别 1/2/3(无更改 / 表单填写 / 注释)处附加 DocMDP/Reference转换并设置 AcroForm 的/SigFlagsAppendOnly 位,将签名过程产生的下一个签名转换为认证(作者)签名;GetSigFlags/SetSigFlags直接读取和写入原始的 AcroForm/SigFlags字节;GetFormFieldIsComb、GetFormFieldIsMultiLine、GetFormFieldJustification和GetFormFieldAllowedValues将每字段的/Ff样式位、/Q文本对齐以及/Opt选项数组暴露为强类型值
Version 3.92.0
新增
- 新增附件导出和表单字段便利 API:
SaveAllAttachments遍历统一的附件列表(文档级别的/EmbeddedFiles加上每页的/FileAttachment注释),并将每个流写在其文件规范名称下的目录中,使用数字后缀消除冲突;RemoveFormFieldByName将完全限定的字段名解析为其索引并将其删除;RenameFormField按名称重命名字段而无需单独的索引查找
Version 3.91.0
新增
- 新增文档范围的枚举 API:
EnumDocumentFonts遍历每个 Font 字典(如果需要,首先调用FindFonts),并为每种字体返回一个带有其对象编号、/BaseFont名称、类型、编码和嵌入/子集状态的TPDFlibDocumentFont,从而消除了为每个条目调用SelectFont并查询标量获取器的需要;EnumAttachments将文档级别的/EmbeddedFiles名称树与每页的/FileAttachment注释统一到单个TPDFlibAttachment列表中,记录每个条目的来源、从 1 开始的来源索引、文件名、MIME 子类型、描述和字节大小
Version 3.90.0
新增
- 新增用于注释、书签和文档版本的只读内省 API:
GetPDFVersion返回有效的 PDF 版本字符串(例如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 + 立即的 generic-region 类型 38) - 增加了一个 LZW 编码器单元
PDFlibLZWEnc(TPLLZWEncoder.Compress),它是现有PDFlibLZW解码器的对应编码器:生成符合 PDF 规范的/LZWDecode流,具有 9..12 位可变宽度编码、ClearCode/EOI 以及 PDF 默认的 EarlyChange 语义,另外还有可选的 TIFF Predictor 2(水平差分),以便经过解码器往返后仍能精确重现原始字节
Version 3.88.0
新增
- 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
新增
- 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 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 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 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 “variable might not be initialized” 警告;已在函数入口处添加零初始化
Version 3.75.2
修复
- 多版本构建兼容性:
for循环在十六进制字符串解析器(PDFlibStruct)中使用了Int64控制变量,而 Delphi XE3/XE5(编译器 26/27)将其拒绝为非序数类型;已改写为While循环,以恢复对 RAD Studio 12 和 14 的兼容性 - 引用 XObject 检查器(
PDFlibPDFUA):非流/非字典分支中的字典指针D未初始化,导致所有目标上都出现编译器提示;已重构该分支,确保在Assigned检查前始终为D赋值 CreateFontPackage包装器(PDFlibFont):在 Delphi ≤ XE8 上抑制了多余的 W1035 “return value might be undefined” 警告,同时通过{$IF CompilerVersion}守卫避免在新编译器上触发对应的 H2077 死赋值提示- BMP DPI 写入器和 PDF 增量保存路径:将已弃用的
TStream.Seek(Longint, Word)调用替换为Position :=赋值(PDFlibPDFium、PDFlibDocument)
Version 3.75.1
修复
- TIFF 多页解析器:用于防止页数异常增大的循环终止保护实际上无效,因为
FPageCount被声明为Word(最大 65 535),使得> 65535比较始终为假;已改为Integer,因此该保护现在会在畸形文件上正确触发 - CFF/Type 2 字符集解析器(格式 1 和格式 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 预测器),防止构造的流数据引发缓冲区越界读取、除零和无法终止的循环
- 加固了交叉引用、文档重建和名称树解析,防止畸形或循环交叉引用数据导致越界访问和无限循环
- AES-CBC 解密现在会验证密文块对齐并将输出缓冲区零初始化,避免未初始化的堆内存泄漏到解密后的字符串和流中
修复
- SHA-256、SHA-384 和 SHA-512 的分离签名摘要现在由正确的加密提供者生成;此前它们返回空摘要并生成无效签名
- ASCII85 和 RC4 解码不再在截断输入或空密钥时返回未初始化数据或抛出异常
- GIF 背景颜色现在读取正确的蓝色通道,而不再复制绿色通道
Version 3.74.1
修复
- 修复了 PAdES 签名验证数据(VRI)支持中的 E2010 incompatible-types 编译错误,该错误会阻止库编译
- 移除了最后一个编译器警告和未使用变量提示;所有 Win32 和 Win64 试用版及正式版库构建现在都能干净编译
Version 3.74.0
新增
EncryptFile和DecryptFile的直接文件路径现在会读取其交叉引用数据位于交叉引用流中的 PDF,包括增量更新链以及带有/XRefStm侧段的混合引用文件,而不再回退到较慢的完整读取器:1.25 GB 基准文档的 AES-256 保护时间从约 4.4 秒降至 2.5 秒,解密从约 1.7 秒降至 1.3 秒- 携带存放在压缩对象流中的对象的重写现在会输出交叉引用流 trailer,确保这些对象在加密或解密后的输出中仍可寻址
修复
- 在增量更新文件中,不包含文档
/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 重写现在会回退到完整读取器,而不是冒着丢失压缩对象的风险 - 直接文件路径中的交叉引用解析不再一次性读取从交叉引用区到文件末尾的全部内容,这在
/Prev链指向文件开头附近的多 GB 文件上可能耗尽内存;而损坏的/Prev链现在会回退到完整读取器,而不是生成不完整的文档
Version 3.73.0
新增
- SigningWorkbench 演示现在通过 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 演示新增专业批处理工作流:
--policy-file从 JSON 文件加载审计策略,便于团队对文档规则进行版本管理和共享;--baseline将本次运行与较早的 compliance-report.json 比较,并列出新增失败、已修复文件以及仍然失败的文件;--preflight-details将预检问题行嵌入 JSON 和 HTML 报告 - 新的 ComplianceWorkbench 自动化开关:
--quiet只打印批处理摘要和报告路径,--fail-fast在第一个失败文件处停止批处理,JSON 报告现在记录库版本
Version 3.71.2
修复
AppendToFile再次会把增量更新追加到通过LoadFromFile加载的同一个 PDF 文件;流式加载器现在会保持源文件可读,而不会阻塞更新所需的写句柄
Version 3.71.1
新增
- ComplianceWorkbench 和 SigningWorkbench 报告现在包含发现项严重级别标签、每文件最高严重级别字段、批处理严重级别频率摘要,以及匹配的 JSON、CSV、HTML 和控制台输出,便于更快分流策略问题
Version 3.71.0
新增
- SigningWorkbench 演示检查现在会报告每个签名的修订顺序和 DocMDP 认证级别,使用
--forbid-weak-digest标记弱 MD5/SHA-1 证书签名算法及旧版 adbe.pkcs7.sha1 SubFilter(SG303/SG405),使用--forbid-self-signed标记自签名证书(SG406),使用--require-certified标记没有认证签名的文档(SG304),并始终检查签名时间是否落在证书有效期内(SG407) - SigningWorkbench 签名模式现在使用签名流程 API,并提供新的
--subfilter(sha1、detached,或用于 PAdES baseline 签名的 cades)和--digest(auto 到 sha512)开关,现代的adbe.pkcs7.detached与 SHA-256 现在是新的默认签名方式 - 新的
TPDFlibSignDoc.GetSignatureDocMDPLevelByName读取侧访问器按照 ISO 32000-1 §12.8.2.2 返回签名字段的 DocMDP 认证级别
Version 3.70.0
新增
- ComplianceWorkbench 演示现在还强制执行权限、元数据和大小策略:
--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 演示:一个签名与证书工作台控制台工具,可检查单个 PDF 或整个目录的签名字段(SubFilter、签名时间、ByteRange 覆盖情况以及带过期检查的签名证书),使用 PKCS #12 证书批量签名 PDF,并审计 PFX 文件;每个违规项都会映射到稳定的策略失败代码(SG101–SG501),结果会以 JSON、CSV 和 HTML 报告输出,并附带面向 18 种文档语言的本地化演示指南
- 新的签名读取侧访问器位于
TPDFlibSignDoc上:GetSignatureFieldNames列出文档的签名字段,GetSignatureTextValueByName返回 /M 签名时间、/Name、/Reason、/Location、/ContactInfo 和 /Type 条目(对加密文档会先解密),GetSignatureValueByName则按字段名返回 /Filter、/SubFilter、/Contents 以及 ByteRange 条目
修复
- 修复了
CertCloseStore的 Windows CryptoAPI 导入声明,它原本缺少 flags 参数,并且在 Win32 上关闭证书存储时可能破坏调用方堆栈
Version 3.68.0
新增
- 新的 ComplianceWorkbench Delphi 演示:一个批处理策略审计控制台工具,可根据可配置的合规策略检查单个 PDF 或整个目录,策略覆盖 PDF/A 和 PDF/UA 预检、加密规则、PDF 版本范围、Tagged PDF、线性化以及文档标题;它会将每个违规项报告为稳定的策略失败代码(PC101–PC501),并以自动化友好的退出码写出 JSON、CSV 和 HTML 报告
- 新演示随附的策略配置文件捆绑了常见需求集—archive、accessible、secure 和 web—并允许用显式命令行开关覆盖配置文件值,同时包含面向全部 18 种文档语言的本地化演示指南
Version 3.67.4
变更
EncryptFile和DecryptFile现在为大型 classic-xref PDF 使用直接 AES-256 重写路径,在文件之间流式传输加密数据,而不是加载并重新序列化每个对象;一个 2 GB 基准文件现在可通过 Direct File API 完成文件到文件的 AES-256 加密与解密,返回码为 1 且LastErrorCode为 0
修复
- 修复了直接 AES-256 字符串标记处理,使字典分隔符不再被误认为十六进制字符串,并且加密的空字符串能够正确解密
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 现在批量记录快速模式结果,并避免反复扫描整个 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
HugeFileBenchmark示例新增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,用于逐行比较纯文本预检报告;它会忽略易变的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
PreflightReport示例现在支持--format csv和--csv,命令行预检运行结果可直接供电子表格或简单 CI 解析器使用,无需后处理 JSON 或抓取文本。
Version 3.56.34
新增
- 新增支持格式选择的
TPDFlib.CreatePreflightReportEx与TPDFlib.SavePreflightReportExAPI,可在保留现有纯文本报告 API 的同时,将 PDF/A 与 PDF/UA-1 预检报告生成为纯文本、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枚举问题列表,并写出纯文本预检报告。
变更
- 该示例支持
--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 无需额外接线即可声明所需的目录扩展。
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 等价扩展标记现在是/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 写入端检查现在有了配套,也能捕获“首个标题是 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) 保持可选启用。
- 验证: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 类扫描线数据、存储式多块流以及已知的 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 示例现在在成功保存后自动打开生成的文档。
- 安装程序打包现在把构建产物排除在 示例目录之外,并将 C++Builder 样例以及 DLL、ActiveX/OCX 模块变为可选启用组件;只有在选择对应组件时才会安装匹配文件。
Version 3.18.2
变更
- Delphi 与 C++Builder 的 EditFormField 示例现在在更新字段值前清除 /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 示例衍生工作流。
变更
- 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 示例项目以定义 PDFLIB_CPPBUILDER,与 GoogleTest 运行器匹配,防止 Win64x 示例链接到 Delphi Win64 的 zlib-ng obj。
修复
- Win64 路径不再经过 Delphi 的 System.ZLib 单元,因此 PDF 流压缩/解压可以像 32 位构建一样享受 zlib-ng 后端的优化。
Version 3.10.3
新增
- 扩展 C++Builder GoogleTest 套件以覆盖 Demo\C++Builder 下的每一个示例。7 个 fixture 的 第一阶段布局扩展为 15 个 fixture / 52 个 GoogleTest 用例,全部在 Win64x 上通过。新覆盖的示例:AddFormattedTitle、AddTextImage、AddTrueTypeSubsettedFont、AddWebLink、CanvasText、CaptureToNewSize、CopyPageRanges、CreateWithImage、CreateWithImageToStream、DoInTheStream、DrawWrappedText、EditFormField、EmbeddedFonts、ExtractAnnotAttach、ExtractEmbeddedFonts、ExtractImage、ImageToPdf、ImportEMF、MultiFunction(渲染器切换)、PageOperations、PdfDecrypt、PdfPermission、PrintPDF、TextMeasure、TextPaging。
Version 3.10.2
新增
- 在 Tests\C++Builder 下新增 C++Builder GoogleTest 运行器,通过 C++Builder 示例所用的同一 {$JPHNE} 生成的 HPP 头来运用 Lib\PDFlibrary.pas。第一阶段以 17 个 GoogleTest 用例镜像了七个核心 Delphi 场景(HelloWorld、DrawShapes、CreateTable、PdfEncrypt、ExtractText、PdfSigning、PdfToImage 渲染),全部在 Win64x 上通过。
- 扩展 Delphi DUnitX 套件,增加 Tests.Print 覆盖 PrintPDF 与 ShowPrinterBins 示例(默认打印机枚举、自定义打印机设置、打印选项、重定向到文件的打印作业),以及 Tests.Render 中针对 MultiFunction 示例在同一源 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 照片打印尺寸,以及中国大陆/台湾常用的八开与十六开纸张格式 LARGE/STANDARD/CROWN/ROC 8K 和对应的 16K 半张尺寸
Version 3.10.0
新增
- 为 Demo 目录下的每个 Delphi 样例新增 C++Builder 原生版本。PDF 创建、页面操作、字体、图像、安全、签名、渲染与打印示例现在都可从 C++Builder 构建并运行,无需任何 Delphi 端封装。
- 为每个 Delphi 示例目录新增简短的英文 Readme.txt,描述该示例展示什么、关注哪个 API 以及如何运行;位于 Demo\Delphi\index.html 的 HTML 总览按主题分组链接到所有示例。
变更
- 每个新示例位于 Demo\C++Builder\<Name>\ 下,是一个直接消费 Lib\PDFlibrary.pas 的控制台项目,并附带运行所需的输入文件。
- 为每个 C++Builder 示例镜像同一份 Readme.txt,其 Run 章节为控制台工作流重写(用 argv 参数替代 Open/SaveDialogs);位于 Demo\C++Builder\index.html 的对应总览以同样的主题分组列出每个 C++Builder 示例。
修复
- 修复 ImportEMF 示例的内存泄漏(TPDFlib 实例被创建但未释放)。
Version 3.9.14
变更
- 整理换行文本与 HTML 分页示例,使每个示例专注于自己的 API 并通过单一按钮运行。
- 重命名两个示例项目(EmbeddedFonts 与 PdfPermission),使编译出的可执行文件与文件夹名匹配,而不是早期的原型名。
修复
- 修复页面范围复制 示例,使其真正复制页面而不是总是报告失败。
Version 3.9.13
新增
- 引入自动化 DUnitX 测试套件(控制台与 VCL GUI 运行器),覆盖工具单元(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 示例现在暴露三向渲染器选择器,使用户能在同一份文档上并排比较 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 示例,增加渲染器选择器,使用户可在既有 GDI+ 渲染器与 PDFium 之间切换。
Version 3.9.6
新增
- 为完整 PDFlibPas 包和试用包提供独立的 Inno Setup 脚本,针对发布场景排除版本控制元数据、构建输出、IDE 缓存、本地 agent 文件以及非发布范围内的打包第三方源码树。
变更
- 试用安装程序现在在生成安装可执行文件之前,为 RAD Studio 11.3、12.3 和 13.1 构建并打包试用版二进制库以及试用版 Delphi 示例。
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 在后续绘图命令运行前消费它的六个宽度/包围盒操作数,防止陈旧操作数破坏字形或路径几何。