PDFium Delphi Component 发行说明
PDFium Delphi Component 的版本历史,涵盖用户可见的功能、修复、查看器改进、文档生成、PDF/A 输出、渲染与文档更新
最新发布
- 最新版本: 3.137.1;发布日期:
Version 3.137.1
修复 (Fixed)
- OpenSSL 在线吊销检查在没有可用 OCSP 证据或响应者时,保留此前的 CRL 状态、原因、原生错误和受影响证书,避免丢失准确的 CRL 过期诊断
Version 3.137.0
新增 (Added)
- 原生 Free Pascal/LCL 构建支持 Linux Qt6 和 macOS Cocoa,提供平台字体解析、专用临时存储,以及文档加载、编辑、表单、保存和渲染
- macOS Keychain 签名支持仅限本次查询的 Keychain 路径和带上限的离线证书链导出,并提供原生 Free Pascal 与 Delphi 签名及时间戳传输
- 并行渲染报告每个 worker 的真实模块路径、初始化地址和卸载结果,并拒绝复用已有 PDFium 映像的原生加载器
修复 (Fixed)
- Unix PDFium 绑定保留 LP64 unsigned-long Callback 和缓冲区宽度,包括超过 4 GiB 的自定义流读取
- 原生 LCL 渲染按位图字节序与通道布局处理,保留 Cocoa 输出和设备上下文渲染中的颜色
- 位图、tile 和渐进式渲染对 clNone 与 clDefault 保留透明背景 alpha,不依赖原生页面透明性查询
- 签名正确识别包括 EC 密钥在内的证书公钥算法;macOS CMS 验证保留外层签名与时间戳的独立结果,并明确报告不支持的 RSA-PSS 验证
- PAdES 时间戳验证要求 critical 且仅含 id-kp-timeStamping 的 EKU;OpenSSL 评估基本 TSA 证书链时不再错误套用 S/MIME 证书用途
- Unix 原子文件提交在替换后目录 flush 失败时仍保留新的增量基线,并提供已提交输出的异常和持久性未完成结果
变更 (Changed)
- Delphi POSIX future 接受默认线程优先级,并在启动 worker 前拒绝不支持的优先级请求
Version 3.136.0
新增 (Added)
- 可选的 LittleCMS ICC 转换和文档颜色转换直接处理原始文本、矢量及 8-bit 或 16-bit 图像分量,保留选定专色,并明确报告不支持的内容
- 复杂擦除保留嵌套 Form XObjects、实色填充曲线路径及旋转、反射或剪切图像中的受支持内容,提供有限几何预算和详细移除报告
- 有效对象读取在展开和解码前分别提供对象体与压缩对象流预算
安全 (Security)
- 擦除拒绝 Tagged 替代文本、XFA、可选内容图层、文本裁剪及无法验证的绘制状态,包括操作符跨内容流拆分的情况,防止导出不受支持的敏感内容语义
Version 3.135.0
新增 (Added)
- 注解与 AcroForm widget 比对独立于页面像素报告属性变化,使用稳定名称、明确页面映射、歧义报告和变更前后的叠加边界
- 表格单元格支持混合文本样式和带替代文本的图像,可选地允许跨页续排跨行单元格,并提供小计行和续排标签,同时保留 Tagged PDF 关系
修复 (Fixed)
- Tagged 布局生成在检查能力前初始化原生库,因此可作为新文档组件的首次操作
- 同一文本对象中的多次替换只针对原始边界适配一次,统一执行最小水平缩放约束,避免不必要的中间编辑
Version 3.134.0
新增 (Added)
- 导航合并在所选、重排和重复页面间保留命名目标及内部页面链接,提供明确冲突策略和事务验证
- 保留样式的文本替换新增已验证源计划、独立预览、原生字体复用、显式后备、受限水平适配,以及编辑失败或取消后的回滚
- OpenSSL 签名接受明确配置的私钥和证书链,支持 RSA-PSS、RSA PKCS#1 v1.5 和 ECDSA,并支持 Windows 以外平台的默认签名者解析
- OpenSSL 验证新增经认证的离线及受限在线 OCSP 证据、失败证书标识,以及每个 CMS 签名者的可选诊断
- FPC macOS Security.framework 验证器分别报告密码学、证书链信任和吊销结果,支持显式信任锚及传入的 OCSP 证据
修复 (Fixed)
- 链接注解 URI 提取提供包含结束符的完整原生缓冲区,正确返回有效目标
Version 3.133.0
新增 (Added)
- 事务式 AcroForm 合并支持所选页面、字段拒绝、重命名、命名空间及兼容共享文本/选项字段,隔离资源、外观和计算顺序
- 可选条码提供器生成 Code128、QR、DataMatrix 和 PDF417,并识别灰度图像,明确指定原生依赖并限制处理预算
修复 (Fixed)
- FormField 读取继承的父字段值,并在共享 widget 间一致提交文本编辑,保证保存/重新打开后的值持久化及只读检查
- 继承文本 widget 的外观重生成恢复父字段值,不在 widget 上留下遮蔽值;字段赋值成功后使共享页面缓存失效
Version 3.132.0
新增 (Added)
- 可选页面对齐识别插入、删除和移动页面,提供受限 Unicode 文本变更、连通视觉区域和可导出的比对叠加图
- 事务式导航合并在所选、重复和重排页面导入中保留书签层次、样式、URI 动作和重映射目标
- 可选 Tesseract OCR 提供器支持明确依赖诊断、Unicode 单词几何、取消和识别预算,并验证可搜索层保存及重新打开
安全 (Security)
- RSA-PSS 策略评估完整签名和受限公钥参数,拒绝格式错误的 DER,以及不兼容的哈希、掩码、salt 或 trailer 限制
修复 (Fixed)
- 书签保存验证不再因仅适用于分支的展开状态差异而拒绝叶子书签
Version 3.131.0
新增 (Added)
- WatermarkStamp 现可接受目标和印章 PDF、目标页区间及仅页码输出,并对混合页面尺寸按比例放置
- MergePDF 在合并前预览各输入的所选页和目标区间,并支持用单个输入提取页面
修复 (Fixed)
- MergePDF 导入前验证所有源,遇到不可读输入、无效范围、导入失败或取消即停止,避免保存不完整合并结果
- WatermarkStamp 保留源文件和模板文件,即使禁用两个印章叠加层,也能可靠保存页码
变更 (Changed)
- 各原生示例目录集中提供 22 个完整工作流,SecurityAudit 和 XfdfLab 移入 Miscellaneous,并修正项目路径和导航
移除 (Removed)
- 移除固定的 AnnotationsLab 演练;注解创建、检查和交换仍由 XFDF、内容提取示例及 API 测试覆盖
Version 3.130.0
变更 (Changed)
- 每个原生 demo 目录都围绕 24 条完整工作流重新编排,Miscellaneous 下另设九个聚焦的 API 主题,并单独提供了挑选第一个 demo 的指引
- 注释、无障碍、字体、导航、文本导出、页面图像渲染、打印首选项、交互和 XFA 等聚焦型示例继续提供,各自携带源码与内置输入数据
移除 (Removed)
- 移除了精简的 CJKTextLab 与 RTLTextLab 工程;Unicode 创作仍可使用 CreatePDF 完成,整形文本 API 也继续保留在 API 参考中
修复 (Fixed)
- 修复 C++Builder 无障碍 API 走查导出语音脚本时失败的问题
- 修复 C++Builder 注释示例为高亮坐标使用错误数组偏移的问题
Version 3.129.0
变更 (Changed)
- 所有原生 demo 改为自包含:示例逻辑移入使用它们的工程,相关的查看与提取工程内置展示 PDF,并移除了 Demo/Shared 目录
- 工程被单独复制时,离线特性导览、实时预览、可编辑表单、预填充报告、附件、导航、打印首选项与静态 XFA 检视依然可用
- FontProperties 打开时即已显示真实的字体与字符指标,另开一份文档后也会立刻分析第一个文本对象
修复 (Fixed)
- 统一了各原生变体 PDFViewer 体验栏的位置与背景,并让 FontProperties 在关闭前释放查看器关联
Version 3.128.0
新增 (Added)
- 新增一份可离线使用的六页 demo 展示文档,带真实文本、矢量图表、嵌入图像、表格、AcroForm 字段、书签、链接、注释和附件
- 所有原生 PDFViewer 变体新增一键体验:文本搜索、双页布局、夜间阅读、文档检查和表单探索
变更 (Changed)
- CreatePDF 现在打开实时两页预览,带可编辑的元数据与内容选项、真实的图像和注释对象,并可在保存前选择追加一页 Unicode 页面
- 聚焦型的查看、搜索、提取、表单和导航样例现在打开即是装好数据的工作流;附件、打印首选项和静态 XFA 样例带上了各特性对应的真实数据
修复 (Fixed)
- 修复查看器在启动、文档替换、预览重建和关闭期间的生命周期与焦点处理
- 修复 Lazarus FormFill 值编辑器在启动后选中第一个字段仍处于禁用状态的问题
- 修复 SearchAndSelect 的文档绑定,以及提取报告遗漏后续页表单字段、对内存生成的样例查询不可用文件头的问题
Version 3.127.0
变更 (Changed)
- MultiPageViewer demo 改用查看器内置的文本选择与剪贴板 API,让选择行为在各种页面布局间保持一致,并移除了原来单独的双击选择模式
- 示例指南把全部 35 个 demo 主题对应到各自独立的工作流,Delphi 与 Lazarus 的 accessibility、intake 和 preflight 控制台示例共用同一套 Pascal 实现
新增 (Added)
- XfdfLab 现在可以在导入 XFDF 后保存 PDF:Delphi GUI 提供 Save PDF 按钮,控制台变体则接受显式指定的第二个输出路径
修复 (Fixed)
- C++Builder 与 Lazarus 的 MultiPageViewer demo 打开时不再携带不支持的表单属性,所有 MultiPageViewer demo 都会在关闭前断开文档连接
- Lazarus accessibility workbench 现在会为其 HTML 审阅报告生成 JPEG 页面缩略图
- ExtractImages demo 会创建一个两页的样例文档,其中包含真实的嵌入图像对象,默认提取工作流因此能产出四张图像
- 控制台 XFDF 往返样例会保留注释内容与作者数据,并在写出前拒绝冲突或已存在的 PDF 输出路径
Version 3.126.2
修复 (Fixed)
- 完整 XFA 查看在默认文本选择设置下正常工作,键盘输入时替换选中文本,尊重只读字段和已禁用的表单事件,并在动态布局变化后刷新显示的页面句柄
- Windows V8 库在改写保存的 XFA 流之前,会拒绝畸形的 XDP 属性、重复属性、无效的命名空间使用和不匹配的 XML 声明
安全 (Security)
- 签名修订分析在小部件与外观对象引用同一对象图时保留页面内容所有权,防止后续页面编辑在 DocMDP 下被当作许可的表单或注释更新接受
- 被锁定字段与注释共享间接值对象时,FieldMDP 锁定依然有效
Version 3.126.1
修复 (Fixed)
- 动态 XFA 重新分页现在会在页面增删后用实际总页数更新
TPdf.PageCount和OnXfaPageCountChanged,让宿主导航与表单布局保持同步 - 更新后的 Windows V8 库会在动态 XFA 布局变化后刷新输入小部件的几何信息,字段移到其他页面时文本与输入命中区域保持对齐
Version 3.126.0
新增 (Added)
- 更新后的 Win32 与 Win64 V8 库在保存受支持的单流 XFA 文档时,保留活动数据集和表单数据包之外的 XML 注释与处理指令,包括 UTF-8 和 UTF-16 输入
修复 (Fixed)
- 单流 XFA 保存会拒绝无效的 UTF-8/UTF-16 编码、不完整的标签、无效的实体引用和畸形的处理指令,而不是静默改写这些输入;活动数据包中不受支持的构造、DTD 声明和 XMLDSig 仍然是明确的保存失败
- 查看器的复制、剪切和表单粘贴在其他线程或程序占用 Windows 剪贴板时会短暂重试,等瞬时争用解除;剪切失败时仍保留字段原文本
Version 3.125.3
修复 (Fixed)
- 更新后的 Win32 与 Win64 普通
pdfium.dll库现在会在最终缓冲 PDF 写入失败时报告错误,与此前 V8 库中的修复保持一致
Version 3.125.2
修复 (Fixed)
- 更新后的 Windows V8 库在保存并重新打开后仍保留编辑过的 XFA 文本,包括空值、原始空白、换行和增补 Unicode 字符,覆盖数据包数组和受支持的单流 XDP 文档
- 更新后的 V8 库中,XFA 数据包导出错误和最终缓冲写入器失败现在会报告保存失败,且不清除文档的修改状态;包含不受支持 XML 构造或 XML 签名的单流文档会被拒绝
- 更新后的 V8 库在 PDFium 初始化和销毁全程保留宿主程序显式提供的 V8 platform 和 isolate
LibraryName中的显式路径现在在两种引擎模式下都会选中那个确切的运行时,包括EnableV8Engine=True;显式路径不存在时直接失败,而不是转而加载其他捆绑库
Version 3.125.1
修复 (Fixed)
ValidatePdfFilesParallel不再破坏共享的 PDFium 引擎:此前工作线程并发打开并检查文档,导致部分文档加载失败或触发 access violation,可能让进程崩溃或让后续 PDF 操作出错;现在每个文档的 PDFium 部分逐个处理,规则求值仍并行执行- 批量验证中打不开的文档现在报告实际的加载错误,而不是后续那条关于没有活动 PDF 文档的提示
Version 3.125.0
新增 (Added)
PdfLibraryConfigurationSupportError报告某个TPdfLibraryConfiguration能否用于具备给定 Skia 和 Fontations 能力的 PDFium 构建
修复 (Fixed)
- 在没有 Skia 的 PDFium 构建上请求
prpSkia,或在没有 Fontations 的构建上请求pfbpFontations,现在会让库加载抛出EPdfError,而不是触发那个会终止进程或让 PDFium 半初始化的原生检查;配置保持未密封状态,程序可以改选其他设置后重新加载
Version 3.124.0
变更 (Changed)
- PAdES 验证现在对 RSA 签名套用 ETSI TS 119 312 签名套件,不再接受所有 RSA 算法:MD2、MD4 和 MD5 摘要的
AlgorithmPolicyStatus为pcsInvalid,SHA-1 和 SHA-224 这类 112 位摘要为pcsIndeterminate,它们已不再被当前验证认可;SHA-1 签名保留整体完整性结果,只是标记为待复核而不是直接拒绝 - RSA 签名的
digestAlgorithm与签名算法固定的摘要不一致时(例如 sha256WithRSAEncryption 搭配 SHA-1 摘要),现在报告ppeiSignatureAlgorithmMismatch并判定完整性失败;RSA 签名算法配非 RSA 签名者密钥同样如此 - 找不到签名者证书的 RSA 签名现在报告
pcsIndeterminate,与既有 ECDSA 行为一致;无法识别的摘要和非签名用途的 RSA OID 报告pcsUnsupported - 带 SHA3 摘要的 RSA PKCS #1 v1.5 签名和遗留的 OIW sha1WithRSASignature 标识符现在都能识别为 RSA
Version 3.123.0
新增 (Added)
PdfNativeRendererType报告某个TPdfRendererPreference在给定 PDFium 构建上选中哪个渲染器:prpDefault在启用 Skia 的运行时解析为 Skia,否则为 AGG
修复 (Fixed)
- 在
ConfigurePdfLibrary中启用BrotliEnabled或IsolatePerDocument,且渲染器偏好保持prpDefault时,不再把渲染从 Skia 切到 AGG;捆绑的启用 Skia 的运行时现在保持默认渲染器,页面输出不再随这些无关选项变化
Version 3.122.2
修复 (Fixed)
- Free Pascal 和 Lazarus 构建现在在所有加载路径(文件、内存、自定义流和渐进加载)中都把文件名和密码以 UTF-8 传给 PDFium,因此位于中文、日文或其他非 ASCII 名称文件夹下的文档,以及带非 ASCII 密码的加密文档,即使程序未使用 Lazarus UTF-8 字符串模式也能打开
Version 3.122.1
修复 (Fixed)
LastLoadReport现在在每次加载失败时都会被替换:Active:= True失败(组件保持非激活且不抛异常)以及普通LoadDocument或LoadCustomDocument调用失败,都会报告plsFailed及错误文本,复用同一个TPdf的批量代码不会再看到上一个文件被报告为已加载Active帮助页现在描述实际失败行为(无异常、组件保持非激活、详情见LastLoadReport),并说明FileName只能在组件非激活时更改
Version 3.122.0
新增 (Added)
FPdfAssocFiles中的EPdfAssocFilesError报告InjectAssociateFiles无法注入的原因:源中没有可读的 trailer 或 catalog,或TargetPage为负数、指向不存在的页;目标流保持不变
变更 (Changed)
SaveAsWithAssociateFiles和SaveAsWithAssociateFilesToStream现在会在TAssocFilesOptions.TargetPage超出0..PageCount时抛出EPdfError;此前这类值会被挂到文档 catalog 上,与文档描述的行为不符
修复 (Fixed)
SaveAsWithAssociateFiles和SaveAsWithAssociateFilesToStream在保存的文档无法解析用于注入时现在返回False,不再原样写出文档并在缺少所请求文件的情况下返回TrueSaveAsWithAssociateFiles不再在输出产生前截断既有目标文件;被拒绝或失败的保存不会改动该文件
Version 3.121.4
修复 (Fixed)
- 页面级关联文件(
TAssocFilesOptions.TargetPage)现在挂到文档页序中该位置上的页面;此前当页对象在文件中的存储顺序与显示顺序不一致时(例如页面被重排或插入后),文件可能落到别的页上
Version 3.121.3
修复 (Fixed)
- 用
SaveAsWithAssociateFiles保存的关联文件现在完整保留中文、日文及其他非 ASCII 文件名和描述:/UF和/Desc以 Unicode PDF 文本字符串写出,不再经系统 ANSI 代码页转换(Delphi)或以原始 UTF-8 字节输出(Free Pascal) - 遗留的
/F文件名现在始终是可移植的可打印 ASCII,非 ASCII 字符以_替换,用自己的代码页解码/F的阅读器不再显示乱码
Version 3.121.2
修复 (Fixed)
- 关联文件现在会把 MIME 类型编码为合法的 PDF 名称,
text/plain这类值不再产生畸形的嵌入文件字典,也不会再阻断 PDF/A-3 验证
Version 3.121.1
修复 (Fixed)
- 读取注解再写回更改时,不再为缺失的 rollover 和 down 外观流创建空流,PDF/A 对注解外观的要求由此得以保留
Version 3.121.0
新增 (Added)
- 启用
OnlineRetrieval后,OpenSSL CMS 验证可以通过 HTTP(S) 检索 AIA 中间证书和 CRL,超时、请求与响应大小限制共享同一套预算;下载的证书要等配置的信任链验证通过后才不再是未受信任状态 - 在线检索在 Windows 上使用 WinHTTP,FPC Unix 上使用可用的 libcurl,HTTPS 证书验证保持开启;不支持的传输配置通过既有的 capability 诊断暴露
修复 (Fixed)
- 经典交叉引用表重建改为一次有界分配并直接填充对象槽位,避免大稀疏对象号带来的二次方开销,同时保留解析器资源限制和最新的对象代
- PDF/X-1a 输出要求结构有效的 ICC v2 CMYK 打印机 profile,不再静默嵌入默认的 RGB profile;profile 无效时,在打开既有目标文件准备覆盖之前就会失败
- PDF/X-1a 验证会检查嵌入的 profile 及其四色分量声明,preflight 报告能识别无效的输出 profile;默认 output-condition 标签跟随所提供的 profile,调用方显式指定的标签保持不变
Version 3.120.4
修复 (Fixed)
- 表格提取 demo 的目录批处理又能处理文件夹里的每个 PDF 了:此前共享的文档实例跨文件保持激活,第二个及之后的文件会抛出赋值错误并被记为失败;Delphi、Lazarus 和 C++Builder 三个版本现在都给每个文档分配自己的实例
- 水印 demo 的示例文档页面保持创建顺序(1、2、3、4),不再通过按索引插入的调用把第一页转到末尾
- XFA 和 XFDF demo 把打开文档失败作为消息报告,而不是未处理异常;attachments demo 在已加载文档的情况下也能开始新文档;Lazarus 查看器会释放它保存的位图
- Delphi 打印 demo 现在会把方向、双面、灰度、质量和 DPI 设置应用到打印任务,尊重打印对话框中选择的份数,跳过渲染失败的页面,并在打印后恢复预览
- 加载器会吞掉打开失败的交互式 demo 不再显示误导性的已加载状态;提取输出文件带 UTF-8 BOM;CJK 和 RTL 控制台 demo 在打印提取文本前先把控制台切到 UTF-8;置信度输入解析小数时不再依赖系统区域设置
- PAdES 时间戳测试现在真正断言验证器在注入签名时间戳后达到 B-T 级别,并配有一个自洽的 ByteRange 测试文档
- pdfium.dll 已加载时,API 覆盖率和 PDF/A 测试不再把任何加载失败当作环境跳过;新增一个回归测试,覆盖字符串值被第三方写入器序列化为 literal string 的文档解密
Version 3.120.3
修复 (Fixed)
EncryptDocumentBytes不再在源 PDF 以增量方式保存时丢弃基础修订的全部对象:经典交叉引用链现在经/Prev从最新到最旧遍历、新条目优先;源已加密时直接拒绝;stream关键字必须先闭合一个字典才被当作流数据;最后一个对象的范围由源 xref 界定,而不是其字节内部出现的第一个endobj- 字符串值被第三方写入器序列化为 literal string 的加密文档现在可以解密,不再报认证错误
- 源 trailer 没有
/Info时,PDF/E 标记注入不再给合成的 Info 字典与内嵌 ICC profile 流分配相同的对象编号——此前这会让增量 xref 把/DestOutputProfile指向错误的对象 - PDF/X 验证比较 XMP
pdfxid:GTS_PDFXVersion值时会先去掉两侧空白,合法填充的 element 形式 XMP 不再误报 Info 不匹配 - PDF/UA 验证能识别 attribute 形式的
pdfuaid:partXMP,字节扫描前像同族标准验证器一样先展开对象流,对交叉引用流文档也检查加密/P位,并要求dc:title非空;标记注入不再输出空标题条目 - 源文档带有损坏的 DPart 层级、且在页面列表已填充后验证失败时,PDF/VT 标记注入不再把每个页面对象收集和重写两遍
- 签署 PAdES B-T 或更高级别但未提供
TsaUrl时现在会抛出异常,而不是静默产出 B-B 签名;B-LTA 文档时间戳使用自己生成的 nonce,不再重发调用方的 - CMS 签名时间戳注入遇到多签名者输入会直接拒绝,而不是静默丢弃第一个之后的所有 SignerInfo;使用 subjectKeyIdentifier sid 时 SignedData 版本变为 3;时间戳请求按 DER 规则省略
certReq FALSE;WinHTTP 传输在响应体中途失败时报告为传输错误,而不是被截断的 DER 响应体 - 系统字体嵌入会针对请求的字体家族解析 TrueType Collection 中实际的 face,并将其提取为独立字体;请求
.ttc的非首个 face(例如 NSimSun)不再嵌入并渲染 face 0 BuildToUnicodeCMap能正确把字形与代理对字符配对,并把增补平面映射输出为 bfchar 条目,不再让第一个增补平面字符之后的所有条目错位- 整形文本、CID 文本和 OCR 插入现在先检查页面插入结果,再把对象记入回滚清单,插入失败不会再留下被销毁两次的悬空句柄
- 压缩器和 ToUnicode 修复中的 stream 关键字检测接受 ISO 32000-1 7.3.8.1 允许的单独 CR 行结束符
变更 (Changed)
- 试用版 Win64x C++Builder 包构建会移除上一次完整构建遗留的过期 COFF
PDFiumPas.lib,两种导入库形态不会再一起发布;FULL 安装器的兜底清单排除仅本地开发使用的文件(packagefiles.xml、状态文档);安装后的 demo 构建通过构建脚本真正读取的PDFiumPas_BDS_ROOT变量固定 IDE 根目录
Version 3.120.2
修复 (Fixed)
- 用
AddText、SetText、版面生成和 OCR 搜索层放置的文本,现在无论从活动文档还是保存之后提取都保持精确的码点:在当前 PDFium 构建下,空格不再被提取成 U+00A0,连字符不再变成 U+00AD - 系统字体按码点以 CID 字体形式嵌入,每个 Unicode 字符一个 CID 并带显式
CIDToGIDMap,多个字符共享的字形(空格与不换行空格、连字符与软连字符、Omega 与欧姆符号)在任何查看器里都能各自忠实往返;没有 Unicode cmap 子表的字体沿用原来的嵌入路径
Version 3.120.1
修复 (Fixed)
- 带子集字体保存的文档重新加载后提取的文本不再损坏:pdfium 序列化的 ToUnicode CMap 可能把一个 CID 映射到两个不同码点(空格变 U+00A0、连字符变 U+00AD),现在每次完整保存都会就地修复这些矛盾映射,同时保持 CMap 结构逐字节不变,PDFium 阅读器、MuPDF 和 qpdf 提取到的都是原始字符
- 增量保存、稀疏更新和交叉引用流文档绝不会被该修复改写,原样通过;没有矛盾映射的文件逐字节复制
- 仓库中的
sample.pdf测试夹具经修复后的保存路径重新生成,加载策略测试改为动态定位 xref 条目,不再硬编码夹具偏移
Version 3.120.0
新增 (Added)
- 书签现在报告大纲文本样式:
TBookmark.Style携带通过新的FPDFBookmark_GetStyle绑定读取的斜体与粗体标志,BookmarkStyleFeaturesAvailable报告已加载的 pdfium.dll 是否导出该入口 - 附件暴露 PDF 2.0 的关联文件关系:
AttachmentRelationship[]以及TPdfAttachmentMetadata和TPdfAnnotationAttachment的Relationship字段通过新的FPDFAttachment_GetAFRelationship绑定读取/AFRelationship名称,由AttachmentRelationshipFeaturesAvailable守护 GetObjectRenderedStrokePattern通过新的FPDFPageObj_GetRenderedStrokePattern绑定,把路径对象描边所用的平铺图案光栅化为归调用方所有的位图;StrokePatternRenderingFeaturesAvailable报告该导出是否可用TPdfLibraryConfiguration.IsolatePerDocument映射到FPDF_LIBRARY_CONFIG版本 7 的m_IsolatePerDocument标志,V8 构建由此能为每个文档提供独立 isolate;ConfigurePdfLibrary拒绝该标志与显式V8Isolate的组合
变更 (Changed)
- 当前 PDFium 头文件的全部 476 个公开导出均已绑定;三个新入口点采用宽容加载,较旧的 pdfium.dll 部署照常工作,对应功能报告空值或
nil结果
Version 3.119.1
修复 (Fixed)
- Windows 离线信任验证在禁用在线检索时,同样把吊销检索限制为缓存数据,避免隐式发出 CRL 或 OCSP 网络请求
- Windows 吊销失败会保留独立的链信任错误,并把吊销原因与原生诊断暴露给 PAdES 结果和证据报告
Version 3.119.0
新增 (Added)
- PAdES 信任验证和证据报告为文档签名与时间戳分别暴露吊销原因和原生错误,包括 JSON 字段和追加的 CSV 列
Version 3.118.0
新增 (Added)
- CMS 验证结果暴露
RevocationReason和RevocationError,并对过期、不可用和无效的本地 CRL 提供 OpenSSL 诊断
修复 (Fixed)
- 链信任成功且本地 CRL 验证确认吊销时,OpenSSL 把被明确吊销的证书报告为无效,同时保持签名与信任结果相互独立
Version 3.117.1
修复 (Fixed)
- 显式版本保存接受带 predictor 压缩交叉引用流的有效多页表单,不再错误地报告交叉引用节格式损坏
Version 3.117.0
新增 (Added)
- 表格检测现在能识别以填充矩形绘制的边框和底纹:厚度不超过新
MaxRulingThickness的填充框直接算一条 ruling,更大的填充框则贡献自己的边缘,Word、Google Docs 和浏览器导出的表格因此能作为带合并标题行的有线网格被找出来,而不是被拆成空白碎片。DetectFilledRulings可关闭这一行为 - 网格拼装之前,ruling 坐标会在
RulingSnapTolerance范围内吸附,逐单元格的边框碎块、双重边框以及只隔一条窄缝的底纹单元格由此合并成一张表 - Form XObject 内部的 ruling 经组合后的对象矩阵参与检测,由
IncludeFormXObjects控制 ExtractDocumentTables衔接续行片段的判断不再只看是否贴住页面边缘:片段在本页内容结束处收尾、又从下一页内容开头继续时同样会被串接,单独溢出的一行也保留在链内- TableExtractionLab 示例在 Delphi、Lazarus 和 C++Builder 三个版本的选项面板里都暴露了
DetectFilledRulings
变更 (Changed)
- 空白检测会忽略已属于有线网格的单词,并要求每条列边界在其分隔的各行上都是无文本通道,两端对齐的段落和项目符号列表因此不再被误报为表格
- 首行是横跨全宽单个单元格的续表候选,现在按新的带标题表格处理,而不是当作上一张表的延续
- 有线网格允许
MinRows取 1;空白检测仍保留最少两行的下限;MaxRulingSegments的默认预算提高到 16384,因为以填充框表达的单元格边框数量远多于描边网格线 - 单元格文本从相互重叠的单词框逐行拼装,字形框高度不一的单词也能保持从左到右的顺序
TPdf.AboutInfo、Lazarus 包元数据和安装程序版本元数据现在统一报告 3.117.0
Version 3.116.4
新增 (Added)
- TableExtractionLab 新增目录批处理:
Batch folder对所选目录里的每个 PDF 运行ExtractDocumentTables,列出各文档的表格数,把没有文本层的文档标记为待 OCR,损坏或被锁定的文件也不会中断整轮运行 Export all CSV把检测到的每张表写成<document>-<n>-page<p>-t<i>.csv:批处理时放在tables子目录下,单文件时放在被加载文档旁边- 检测预设选择器提供几组调好的
TPdfTableExtractionOptions:Default、Compact columns(MinColumnGap4 搭配AlignmentTolerance5,针对排版紧凑的文字处理导出)以及 Compact + wide rows(MaxRowGapFactor6,针对 1.5-2x 行距) - 单文档与批处理提取中,Default 预设下提不出表格的文档会用 Compact columns 自动重试一次,批处理结果行会标明出自哪个预设
修复 (Fixed)
- 批处理提取改为每个文档使用独立的
TPdf实例,不再反复重载同一个共享组件,目录批跑中途以组件未激活错误露头的静默加载失败由此消除
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装程序版本元数据现在统一报告 3.116.4
Version 3.116.3
变更 (Changed)
- 三套工具链的 TableExtractionLab 示例现在会把生成的示例文档写到 demo 可执行文件旁边的
TableExtractionSample.pdf,不再只留在内存里;目录不可写时退回原来的纯内存行为,并在状态行给出提示 TPdf.AboutInfo、Lazarus 包元数据和安装程序元数据现在统一报告 3.116.3
Version 3.116.2
修复 (Fixed)
- 库一度无法在较老的 Delphi 版本上编译。64 位滴答辅助例程以及可信列表和生产 XML 编解码器从较新编译器才自带的 RTL 单元引用
GetTickCount64和CP_UTF8;reflow HTML 写出器内嵌的 CSS 字符串字面量突破了这些编译器给单个字面量设的 255 个元素上限;XFA datasets 合并又在TBytes与普通动态数组字段之间直接赋值,XE7 之前的编译器拒绝这种写法。现在 RTL 未提供时,老编译器改为从 kernel32 绑定GetTickCount64并在本地声明CP_UTF8,样式表改为短字面量拼接,packet payload 逐元素复制
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装程序元数据现在统一报告 3.116.2
Version 3.116.1
新增 (Added)
Demo\Delphi\TableExtractionLab、Demo\CBuilder\TableExtractionLab和Demo\Lazarus\TableExtractionLab把表格检测串成一条完整工作流。lab 先生成一份示例文档,内含带合并表头单元格的有线表格、没有表格线仅靠空白对齐的表格和一张跨页断开的长表格,然后运行ExtractTables或ExtractDocumentTables,列出行、列、span、表头标志、检测模式、置信度和续表分组- lab 通过
TPdfTable.ToCsv和TPdfTable.ToJson导出选中的表格,选项面板可调整DetectRuledTables、DetectWhitespaceTables、DetectContinuations和MinConfidence,还能把完整报告复制到剪贴板 TPdf.AboutInfo、Lazarus 包元数据和安装程序版本元数据现在统一报告 3.116.1
Version 3.114.21
修复 (Fixed)
- 只要文档带有注释,PDF/A 验证就会误报外部文件引用。ISO 19005-1 §6.1.7 禁止流对象字典出现
/F、/FFilter和/FDecodeParms,但原检查在整个文件里搜这些名字,而/F又是 §6.5.3 要求每个注释必须携带的注释标志键。现在检查只看流对象字典内部
Version 3.114.20
修复 (Fixed)
- 三个签名后端生成的 RSASSA-PSS 签名都带着畸形算法参数。RFC 4055 要求 RSASSA-PSS-params 全部四个字段都带标签;盐值长度此前写成裸整数,解析器会把它当成另一个字段的开头;trailer 字段的值等于 DER 规定必须省略的默认值,却仍被写了出来。验签方要么解析不了参数,要么回退到默认的 20 字节盐值而签名实际用的是 32,PSS 签名因此被拒。PKCS#1 v1.5 和 ECDSA 签名不受影响
Version 3.114.19
修复 (Fixed)
- 请求非 SHA-256 摘要的时间戳时,构造出的请求声明的算法与实际携带的 SHA-256 摘要不符,时间戳权威要么拒绝,更糟的是照单全收地盖章。实际计算的只有 SHA-256,因此其他标识符现在一律拒绝;空标识符仍选用 SHA-256 默认值。Lazarus 和 C++Builder 版 PDF Viewer 示例还绑定了窗体文件里有名字、代码里却没有定义的书签展开 handler,加载窗体时即告失败;该 handler 已从 Delphi 示例移植过来
Version 3.114.18
修复 (Fixed)
- Delphi 版 XFA Lab 和 XFDF Lab 示例以及 Lazarus 版 XFA Lab 示例启动即失败。它们都在窗体的 create handler 里构建控件,但窗体资源既不存在也没有链接,创建主窗体直接抛出资源未找到错误,handler 根本没机会执行。三个示例现在都带上了窗体文件和嵌入它的编译指令
Version 3.114.17
修复 (Fixed)
- 两处原生资源在操作中途失败时处理失当。缩略图渲染失败会先释放目标位图、后关闭原生渲染;当渲染本来就在直接往该位图自己的像素里画时,清理阶段就会读到已释放的内存。
AddBitmap中位图分配失败时,刚创建的图像对象既没有归属者,也无法再次访问
Version 3.114.16
修复 (Fixed)
- 读取 FDF 文本时,
0x7E以上的字符会出错。ISO 32000-1 附录 D.2 的 PDFDocEncoding 表从0x80的 bullet 开始,映射表却从0x7F起算,直到0x9F的整个区段因此整体错开一位:dagger 读成 bullet,em dash 读成省略号,一路错下去,zcaron 更是完全落到表外。0xA0的欧元符号也缺失,返回的是不换行空格。导入 FDF 中的字段名和字段值现在都能正确解码
Version 3.114.15
修复 (Fixed)
- 对 trailer 或 catalog 读不出来的文档做信任验证时会发生数组越界写入。这种情况下合规检查直接放弃、一个签名都不记录,而随后运行的收集器直接在字节流上工作,仍能找到签名字典,于是每找到一个字典就往一个空数组里写一条。计数现在会钳制到合规检查实际产出的数量
Version 3.114.14
修复 (Fixed)
- 执行 PDF/A 修复计划时,规划阶段已阻断的步骤仍被照样执行。文档带有签名、步骤会使签名失效且调用方不允许时,步骤应被阻断;执行器却只检查步骤的安全级别,表达不了这个条件,签名文档的签名因此可能被规划早已拒绝的自动修复作废。被阻断的步骤现在会被跳过,并计入 skipped
Version 3.114.13
修复 (Fixed)
- 给证书集超过 127 字节的 CMS 值添加签名时间戳会把结果写坏,而真实证书无一不超过 127 字节。定位嵌套结构起点的辅助例程反向遍历长度八位组时,把最后一个误当成第一个,切出的片段起点远远早于目标结构。头部长度现在直接从内容长度推导,DER 对此有明确规定。自检没抓到这个问题,因为夹具证书足够小,走的还是短格式
Version 3.114.12
修复 (Fixed)
- 签名属性按构造顺序写出,没有按编码排序,而 X.690 §11.6 要求 DER SET OF 必须如此。OpenSSL 和 BouncyCastle 这类验签方在计算摘要前会重新编码属性集,于是算出不同的摘要,把本来完好的 PAdES 签名判为无效。本库生成的签名现在能在这些验证栈中通过;走 Windows 层的验证不受影响,因为它对收到的字节原样计算摘要
Version 3.114.11
修复 (Fixed)
- 内容字节多于两个的负 DER INTEGER 会被编出错误的值。写入器在逻辑移位后重新注入符号位来模拟算术移位,但它用的掩码把低字节以上的所有位都置 1,而不是只盖住移位腾出的那个字节,其余字节里尚存的数值位因此被覆盖,比如 -100000 会编成 -34464。时间戳请求 nonce 以及其他这一尺寸的有符号整数现在都能正确编码
Version 3.114.10
修复 (Fixed)
- PDF/A 验证从不报告 ISO 19005-1 §6.4 透明度规则中的 constant alpha 部分。辅助例程构造搜索键时会自己加一条斜杠前缀,调用方又传了一条,实际查找的成了
//CA,自然一无所获。两处 alpha 检查还只认1和1.0这两种字面文本,完全不透明的/CA 1.00也会被判违规;现在只要数值是 1,无论写法如何都能识别
Version 3.114.9
修复 (Fixed)
- 页面级 URI action 返回的是乱码文本。路径从原生层返回的是 UTF-8 字节,此前被直接写进宽字符串,字节被两两拼成 16 位代码单元,缓冲区其余部分则留着内存里原有的内容。
GetPageActionURI现在按文档级 action 路径早已采用的方式解码这些字节
Version 3.114.8
安全 (Security)
- 在 Windows 以外的目标平台上,加密密钥、盐值和初始化向量背后的随机字节都来自运行库 PRNG,而其种子是常量,除非程序主动调用
Randomize。于是每个进程都产出相同的文件加密密钥、相同的/UE和/OE盐值、相同的/Perms字节和相同的 AES-GCM nonce,Linux 或 macOS 上 Free Pascal 构建的加密输出可以轻松还原,同一固定密钥下 GCM nonce 还会重复。这些字节现在取自/dev/urandom,内核池不可用时直接抛异常而不是回退,与 Windows 上CryptGenRandom不可用时的行为一致
Version 3.114.7
修复 (Fixed)
- 畸形的对象流可能让压缩与修复入口读到解码缓冲区末尾之外。现在头一解析完就检查流声明的成员偏移的范围与递增顺序;声明的成员数超出头部可容纳的范围时,在任何内存预留之前就拒绝;每个成员的字节范围先验证、再裁剪尾部空白,顺序不再颠倒
Version 3.114.6
修复 (Fixed)
- 把内联图像外置成 image XObject 会得到不可用的结果。字典写出时第一个键前多了一个斜杠,等于开了个空名字,所有键都错位到前一个键的值上;内联缩写表又把 Decode 映射成
G而不是D,/D数组因此被丢弃,DeviceGray 的值缩写被误当成键。从内容流里提取出的图像现在带有结构合法的字典,并保留自己的 Decode 数组
Version 3.114.5
修复 (Fixed)
- HarfBuzz 整形器在从右到左的 run 里把 cluster 长度记到了错误的字形上,对共享同一 cluster 的字形(如 mark 和连字部件)也一律记成长度 1。现在每个字形的
ClusterLength都从其 cluster 起点延伸到逻辑顺序上的下一个 cluster,两个方向都适用,阿拉伯语和希伯来语文本的字符到字形映射因此与 Uniscribe 后端一致
Version 3.114.4
修复 (Fixed)
- libcurl 时间戳传输用 32 位值传数值选项、读 HTTP 状态码,而 libcurl 接收和返回的都是 C
long,在 Linux 和 macOS 上为 64 位。状态码查询可能覆盖栈上目标旁边紧邻的 4 个字节,选项值则取决于寄存器高 32 位里碰巧残留的内容。两处现在都改用平台long宽度,FPdfTsaFpc在 LP64 目标上不再有这类隐患
Version 3.114.3
修复 (Fixed)
- PKCS#11 后端把令牌对象标签的原始字节直接拷进 string,在 Delphi 下等于把 UTF-8 字节落到 UTF-16 代码单元上。通过
TPdfPkcs11Options.CertificateLabel选择的证书因此永远匹配不上,EnumerateCertificates报告的LabelText也是乱码。标签现在按标准规定的 UTF-8 解码,交给C_Login的 PIN 也按 UTF-8 编码而不再经宿主代码页窄化,非 ASCII PIN 能原样送达令牌
Version 3.114.2
修复 (Fixed)
- macOS Keychain 签名器判断密钥是否接受 RSASSA-PSS 时,向
SecKeyIsAlgorithmSupported查询的操作错了:查询传的是 decrypt 而不是 sign,答案永远是 no,所有 RSA 签名都默默回退到 PKCS#1 v1.5。支持 PSS 的密钥现在按TPadesSignerOptions.PaddingScheme的要求用 PSS 签名,operation 参数也按框架声明的宽度传递
Version 3.114.1
修复 (Fixed)
- 从右到左文本中的嵌套括号对被解析成了错误方向。UAX #9 的 BD16 规则按开括号出现的顺序处理括号对,被 N0 解析的对会成为其后开启的对的前置强上下文;此前的实现却按闭括号完成的顺序处理,内层括号对的方向可能跟着它包住的字母走,而不是遵循外层对建立的上下文。阿拉伯语或希伯来语句子中带嵌套括号的插入语现在能按读者预期的方向排版
Version 3.114.0
新增 (Added)
FPdfCryptoSsl通过 OpenSSL 验证 PDF 签名和时间戳令牌,补上了签名验证最后一块平台空白:Linux 此前完全没有 CMS 验证后端。ConfigureSslCmsVerifier负责安装;libcrypto 在运行时按名字解析,不产生链接依赖;1.1 和 3.x 两个系列都能绑定- 签名与证书链分开评估:签名本身完好而证书链够不到信任锚时,报告为签名有效但信任无效,而不是把签名判为损坏
ConfigureSslTrustAnchors把 DER 信任锚加入系统存储,ConfigureSslCrls提供吊销检查可查询的 CRL。只有 CRL 真实存在时吊销才算检查过,因为 OpenSSL 自己不会去取;一个都不提供时结果报 unsupported,而不是放任未检查的链通过SslAvailable、SslMissingSymbols、SslLibraryPath、SslLibraryVersion和SslAbiLayout报告哪些绑定成功、哪些没成;平台默认路径找不到库时,ConfigureSslLibraryPath可以为后端指定具体的库
Version 3.113.0
新增 (Added)
TPdfKeychainCmsVerifier在 macOS 上通过CMSDecoder和 SecTrust 验证 PDF 签名和时间戳令牌,签名验证不再只属于 Windows。ConfigureKeychainCmsVerifier负责安装;与FPdfCryptoWin覆盖 Windows 两半功能一样,同一个单元现在也补齐了 macOS 支持的签名与验证两半- 吊销检查真正生效:按需启用时会在基础 X.509 策略上叠加吊销策略;关闭在线获取后,评估只使用缓存的响应。签名、证书链、在线获取和吊销各阶段的进度检查点与 Windows 后端的报告方式完全一致
KeychainVerificationAvailable把验证支持与签名支持分开报告,因为两者依赖的框架符号不同,可能只有其中一个可用
Version 3.112.0
新增 (Added)
FPdfCryptoMac用 macOS Keychain 身份签署 PAdES,相当于 Windows 证书存储的对应实现:证书和私钥都来自 Keychain,签名由SecKeyCreateSignature完成,密钥从不离开系统 keystore。ConfigureKeychainSignerProvider负责安装,也不需要像 PKCS#11 令牌后端那样随应用部署模块- 签名器跟随证书走:EC 密钥签 ECDSA,RSA 密钥签 RSASSA-PSS;PSS 不可用时(较老的 macOS,或不接受 PSS 的密钥),填充回退到 PKCS#1 v1.5,写出的 AlgorithmIdentifier 也如实标明,而不是冒称 PSS
KeychainMissingSymbols列出所有解析失败的框架符号,部署上报告后端不可用时,能分清是框架缺失还是绑定里的名字写错
Version 3.111.0
新增 (Added)
ConfigurePadesCmsVerifier安装 PAdES 验证器使用的 CMS 验证后端,签名和时间戳验证不再绑定 Windows。IPdfCmsVerifier声明后端要应答的两种操作:PDF 签名对应 detached,时间戳令牌对应 attached;PadesCmsVerificationAvailable报告是否存在任何后端
变更 (Changed)
- 验证结果与选项类型迁入
FPdfCrypto,更名为TPdfCmsVerify*;TWinCmsVerify*名称保留为别名,现有代码继续可用,外接后端与 Windows 后端使用同一套类型 - Windows 行为不变:未安装验证器时仍使用 CryptoAPI,进度检查点、吊销选项和原生错误码都保持原样。没有后端应答时,每项结论都报告 unsupported,而不是留下未检查的空白
Version 3.110.0
新增 (Added)
FPdfPkcs11用一把始终留在 PKCS#11 令牌内的密钥签署 PAdES。ConfigurePkcs11SignerProvider把它安装为签名后端;模块在运行时按路径加载,没有任何链接依赖;同一份代码同时服务 Windows、Linux 和 macOS。IPdfPkcs11SignerProvider接口声明的令牌枚举也随之一并实现:slot、token 以及各自持有的证书- 常见场景下,Windows 之外的签名不再需要宿主提供 provider:一个令牌模块加
TPdfPkcs11Options就够了。RSA PKCS#1 v1.5、RSASSA-PSS 和 ECDSA 全部通过令牌完成 FPdfSha1引入 SHA-1 只为一个用途:按TPadesSignerOptions携带的指纹匹配证书。Windows 在证书存储内部完成这一步;令牌只交回证书字节,匹配留给调用方。它不是签名摘要,PAdES 流程自始至终仍用 SHA-256 签名
变更 (Changed)
- 读取公钥算法 OID、提取 issuer 和序列号、重新包装原始 ECDSA 签名的证书 DER 辅助例程从 Windows 后端移到
FPdfCms,所有签名后端都能使用
Version 3.109.0
变更 (Changed)
- 原生库加载器不再只属于 Windows。
LibraryName按目标平台默认取pdfium.dll、libpdfium.so或libpdfium.dylib,V8 构建按对应名字查找,Free Pascal 下加载与符号绑定走可移植加载器。Windows 行为不变,包括 Win32 和 Win64 的部署布局以及架构不匹配诊断 - 其他目标平台的部署目录沿用编译单元已在用的
<cpu>-<os>命名,DLLs/x86_64-linux/libpdfium.so与Lib/FPC/x86_64-linux并排摆放。回退到系统目录的行为仍是 Windows 专属;其他平台交给加载器搜索路径处理
Version 3.108.0
新增 (Added)
TPdfHarfBuzzTextShaper为没有 Uniscribe 的 Free Pascal 目标整形双向文本和复杂脚本文本。它用FPdfBidi解析嵌入层级,按脚本切分 run,用 libharfbuzz 逐 run 整形,再按视觉顺序摆放 run。通过ConfigureTextShaper安装;libharfbuzz 在运行时解析,缺失时HarfBuzzAvailable会如实报告- 这个整形器不负责枚举字体。Uniscribe 从设备上下文里读字体二进制,没有可移植的等价物,所以由宿主传入
TPdfFontDataResolver,把字体名映射到字体文件字节,这项职责留在它本该在的一侧
Version 3.107.0
新增 (Added)
FPdfBidi用纯 Pascal 实现 Unicode Bidirectional Algorithm(UAX #9):PdfResolveBidiLevels为每个 UTF-16 代码单元返回一个嵌入层级,PdfBidiVisualOrder应用 L2 重排,PdfBidiClassOf暴露码点的 Bidi_Class。覆盖 P2-P3、X1-X10、W1-W7、N0-N2、I1-I2 和 L1-L2 全部规则,包括 isolate 发起符和 BD16 括号对- 该单元不依赖编译器和平台,这正是双向文本能在没有 Uniscribe 的地方排版的前提。整形引擎面对的 run 方向已经确定,定方向这一步必须由它先行完成
Version 3.106.0
新增 (Added)
ConfigureTextShaper安装全库共用的文本整形后端,同时提供ActiveTextShaper、ActiveTextShaperName和ClearTextShaper。ShapePdfText和TPdf.AddShapedText现在都走已安装的整形器,不再直接创建 Uniscribe 整形器,宿主可以换上自己的引擎,测试也能换成确定性的实现
变更 (Changed)
FPdfTextShaping可以在 Windows 以外的目标上编译:Uniscribe 后端现在是平台默认实现而非唯一实现,并被限定在 Windows 构建内。没有可用后端时,整形入口会如实报告,而不是编译失败
Version 3.105.1
安全 (Security)
- 时间戳响应现在在两种传输方式下都以 4 MB 为上限。此前,持续发送数据的 TSA 会让接收缓冲区无限增长,把一次签名调用变成无界的内存增长
Version 3.105.0
新增 (Added)
- RFC 3161 时间戳现在可用于 Windows 以外的 Free Pascal 目标平台:新的 libcurl 后端发送 TimeStampReq 并读取 TimeStampResp,因此
PadesTsaAvailable报告 True,PAdES B-T、B-LT 和 B-LTA 也能在这些平台上获取令牌。libcurl 在运行时解析,不是构建期依赖;当它不存在时,该后端会像 WinHttp 后端一样报告不可用。Windows 继续使用 WinHttp,不受影响 - 在这些目标平台上签名仍然需要库自身不持有的密钥材料:由于
FPdfCryptoWin仅支持 Windows,请通过ConfigurePadesSignerProvider提供IPadesSignerProvider(基于令牌的密钥则使用IPdfPkcs11SignerProvider)
Version 3.104.1
新增 (Added)
- XFA 检查实验室示例现在也提供 Lazarus 版本,因此可以从 LCL 构建中演练 XFA 能力探测、XFA 包列举、XFA 包导出以及
OnXfaRuntimeMissing回退
Version 3.104.0
变更 (Changed)
- 库在 Free Pascal 3.2 上编译时不再出现可避免的诊断信息:内部计时改从
GetTickCount64读取毫秒滴答而非已弃用的 32 位调用,已弃用的 SSE 控制字访问器被GetMXCSR和SetMXCSR取代,内容指纹偏移基数现在显式声明类型以不再触发编译期范围检查,并且在检查位图是否为自上而下布局时按无符号指针比较扫描线地址
Version 3.103.1
修复 (Fixed)
- 在 Free Pascal 上,写入 XMP 的文档元数据保留非 ASCII 字符:传入
SaveAsPdfA、SaveAsPdfUa、SaveAsPdfE、SaveAsPdfX、SaveAsPdfR和SaveAsPdfVT的标题、作者、主题、关键词和创建者名称现在通过字符串代码页进行转换,而不是逐字节复制,因此即使宿主程序不在 UTF-8 代码页上运行,元数据包也能按 ISO 19005-1 6.7.2 的要求保持有效的 UTF-8 - XFDF 导出、生产元数据往返和可信列表 XML 解析使用同样的按代码页正确转换,因此在
TBytes和string之间传递的文本不再依赖宿主代码页
Version 3.103.0
新增 (Added)
TPdfEuropeanTrustedList解析经过鉴权的欧洲可信列表,通过同一鉴权器重新加载带校验和的缓存,接受调用方提供的更新源,公开当前信任锚,并在请求的验证时间评估合格签名服务TPadesTrustValidationOptions.QualifiedTrustEvaluator对每个被验证的签名者应用离线合格信任策略,而不为 PAdES 验证器增加网络访问
Version 3.102.0
新增 (Added)
BeginIncrementalSave和CommitIncrementalSave现在可以向 AES-256 加密文档追加经过鉴别的修订版,同时保留原始/Encrypt引用、安全参数、精确的对象代次和先前的字节内容
变更 (Changed)
- 文件提交重载现在会持久刷新并严格重新打开同目录下的辅助文件,验证其修订边界,并原子地替换目标文件,任何失败之后都会回滚会话
Version 3.101.0
变更 (Changed)
SaveAsRedacted现在会保留部分相交文本、矩形路径和轴对齐图像中的安全部分,然后移除页面、Form XObject、pattern、外观和嵌套资源作用域不再引用的资源名称
Version 3.100.0
变更 (Changed)
OptimizeImages现在根据缩放比例、内容类别、测得的细节量和调用方指定的质量选择 box、双线性、双三次、Lanczos 或二值重采样,带感知 alpha 的滤波和严格的工作内存预算
Version 3.99.0
新增 (Added)
GraftPdfAcroForm通过显式页面映射和冲突策略导入层次化的 AcroForm 字段、控件、外观、计算顺序、默认资源、动作和值TPdfCrossDocumentGraftMap按源标识复用已导入的间接对象,同时保留循环引用、共享引用、精确的源对象代次和事务性失败语义
Version 3.98.0
新增 (Added)
TPdfOutlineEditor可以创建、移动、删除、设置样式、展开和重定向大纲条目,通过页面计划结果重映射显式目标,并追加一个经过独立验证的增量修订版
Version 3.97.0
新增 (Added)
TPdfTreeEditor读取、验证、更新、平衡、拆分、合并、序列化并增量保存任意 PDF NameTree 和 NumberTree 结构,同时保留可复用的间接引用和原始条目值
Version 3.96.0
新增 (Added)
TPdfParserResourceBudget为自定义 PDF 解析器提供统一的线程安全进程级策略,覆盖递归、token、对象、解码字节、膨胀比、内存分配和截止时间,并提供不可变的按操作快照和可配置的默认值
Version 3.95.0
变更 (Changed)
ValidatePdfX现在通过有界的稀疏读取,在有效 xref 的未加密文档上验证有效的 PDF/X 字典、元数据、OutputIntent、字体、禁止特性、透明度、色彩空间和页面框
Version 3.94.0
变更 (Changed)
ValidatePdfR现在通过有界的稀疏读取和窗口化读取,在有效 xref 的未加密文档上验证有效的 PDF/R 字典、页面、图像过滤器、元数据和页脚标记
Version 3.93.0
变更 (Changed)
ValidatePdfE现在通过有界的稀疏读取,在有效 xref 的文档上验证有效的 PDF/E 字典、元数据、OutputIntent、表单和禁止特性
Version 3.92.0
变更 (Changed)
ValidatePdfVT现在通过有界的稀疏读取,在有效 xref 的文档上对重复 XObject(recurring-XObject)执行更深入的作用域、可见性、封装和嵌套 Form 使用分析
Version 3.91.0
新增 (Added)
TPdfSparseDictionaryReader可以解析对象的活动代次,并在调用方提供的字节上限内解码直接流
变更 (Changed)
- 在常规的有效 xref 路径上,
ValidatePdfVT对 PDF/VT 元数据、DPart、OutputIntent、Info、页面和普通字典检查现在使用有界的稀疏读取
Version 3.90.0
新增 (Added)
TPdfSparseDictionaryReader保持打开一个稀疏 xref 和对象流索引,用于反复执行有界的间接对象字典读取
变更 (Changed)
InjectPdfVTMarkers现在通过有界的源读取验证并保留既有的 PDF/VT DPart 层次结构,格式错误的层次结构仍会经由重建回退路径处理
Version 3.89.0
新增 (Added)
ReadPdfSparsePageDictionaries通过稀疏对象索引按页面树顺序返回页面对象标识和有界的字典字节
变更 (Changed)
- 当保存的 PDF 尚不包含 DPart 层次结构时,
InjectPdfVTMarkers现在会合成 PDF/VT DPart 层次结构,并以有界的源读取追加标记对象
Version 3.88.0
新增 (Added)
ReadPdfSparseCatalogSubDict通过稀疏对象索引读取直接或间接的目录子字典,供 PDF/UA 标记注入用于MarkInfo和ViewerPreferences
变更 (Changed)
InjectPdfUaMarkers现在通过稀疏查找解析目录中的MarkInfo和ViewerPreferences,并在常规 xref 路径上以有界的源读取追加 PDF/UA 修订版
Version 3.87.0
新增 (Added)
AppendPdfSparseUpdate以流方式向已保存的 PDF 追加一个稀疏修订版:源字节原样保留,调用方提供的对象体写入记录的偏移位置,并通过/Prev链接单个增量 xref/trailer 块NormalizePageViewRect将页面空间中两个映射后的角点规范化为被页面裁剪的可见矩形,或在页面没有任何可见部分时予以报告- 当源文档没有 Info 字典时,PDF/E 标记注入会合成一个带有
/ISO_PDFEVersion的新 Info 对象
变更 (Changed)
- PDF/E、PDF/X 和 PDF/R 标记注入现在通过稀疏查找解析目录、Info 和 trailer,并在常规 xref 路径上通过
AppendPdfSparseUpdate以有界的源读取追加修订版 - 表单填充的
FFI_GetPageViewRect回调现在报告页面在所附加TPdfView中实际可见的部分,而不是始终返回整个页面框;对无界面(headless)文档则回退为页面尺寸 TPdf.AboutInfo、Lazarus 包元数据和安装程序元数据现在一致地报告 Version 3.87.0
修复 (Fixed)
- 自
FPDFPath_GetBezierControlPoints绑定公开以来,路径段控制点其实从未被填充:原生导出只对每条包含三个控制点的三次曲线的端点索引作出应答,因此该查询现在每条曲线只执行一次,并且三个条目都会携带这条曲线的控制点
Version 3.86.0
新增 (Added)
ReadPdfSparseRevisionInfo为流式后处理器公开有界的最新修订版、目录、加密、文档 ID 和标记结构事实ComposePdfSparseUpdateId在不完整物化源 PDF 的情况下保留或派生增量更新的文档标识符
变更 (Changed)
InjectPdfAMarkers现在通过稀疏查找解析目录和 trailer,以有界分块复制大型输入,并在常规 xref 路径上追加 PDF/A 修订版而不分配与源等大的字节数组- PDF/A 标记注入保留经典或 xref 流输出风格、目录和 Info 代次、trailer 标识符、对加密文档的拒绝行为以及 Level A 降级规则
Version 3.85.0
新增 (Added)
SanitiseActiveContentPdfStream接受调用方拥有的修剪工作区,用于自定义的有界存储或基于磁盘的存储
变更 (Changed)
- 活动内容净化现在通过稀疏查找、有界解析窗口和固定大小的范围复制来更新目录和 trailer,而不是在常规 xref 路径上把完整 PDF 读入单个字节数组
TPdf.SaveAsSanitised将SaveMemoryLimit和SaveTemporaryDirectory应用到其修剪工作区,并在诊断中报告其溢出情况
修复 (Fixed)
StripMetadata=True现在即使目录中没有/Metadata条目,也会移除 trailer 中的/Info引用
Version 3.84.0
变更 (Changed)
TPdf.PdfVersion现在通过FPDF_GetFileVersion复用 PDFium 解析器状态,而不是重新解析完整源 PDF- 版本查询最多只读取八字节的 PDF 头,以防止格式错误的目录声明拉低有效版本
Version 3.83.0
变更 (Changed)
PageLabelledPdfStream现在通过有界的流窗口和稀疏惰性对象索引解析并更新目录- 页面标签输出以固定大小的范围复制大型源 PDF,而不是在常规 xref 路径上分配完整文档字节数组
Version 3.82.0
变更 (Changed)
ApplyDefaultOpenAction现在通过稀疏惰性对象索引读取经典、xref 流、混合和对象流修订版,包括对象编号非常大的文档- 默认打开动作处理使用固定大小窗口和有界范围复制,而不是把完整 PDF 加载到单个字节数组
Version 3.81.0
新增 (Added)
PostProcessSavedPdf接受三个调用方拥有的可查找工作区,用于自定义内存上限和基于磁盘的处理
变更 (Changed)
TPdf.SaveAs将SaveMemoryLimit和SaveTemporaryDirectory应用到已保存 PDF 的每个后处理工作区,并把它们的溢出情况纳入诊断- 原生增量 xref 流修复使用固定大小的尾部和字典窗口配合有界范围复制,而不是整文件字节数组和反复的整文件重新分配
Version 3.80.0
新增 (Added)
ReadAttachmentMetadata在一次有界的原生枚举中捕获附件名称、描述、MIME 子类型、解码后大小和可读性ExtractAttachmentsToStreams将一批附件写入调用方拥有的流,支持单文件和聚合字节上限、可配置的写入块、取消操作以及逐项结果
变更 (Changed)
- 批量提取在 PDFium Delphi Component 内存中最多保留一个已解码附件,而不是把批次中的每个负载都物化到内存
Version 3.79.0
新增 (Added)
TPdfCacheGovernor、TPdf.CacheBudgetBytes、按类别的用量查询和遥测通过一个线程安全的全局 LRU 字节预算协调保留的缓存内存TPdfTileCache和进程级系统字体缓存可以加入调用方选择的调控器,并对位图和字体字节进行精确记账
变更 (Changed)
- 解析后的页面场景、缩略图、结构数据、文本快照和页面对象快照现在在默认 256 MiB 的
TPdf预算下竞争内存,同时保留其既有的条目数上限 - 活动页面场景在渲染完成之前保持锁定,而不透明的原生页面场景使用显式的估算计费,因为 PDFium 没有提供可配置的总缓存字节 API
Version 3.78.0
新增 (Added)
TPdfLayoutPagedPlan、TPdfLayoutDocument.BuildPagedPlan和TPdf.GeneratePagedLayout将布局命令以流方式写入调用方选择的可查找存储,并一次物化一页
变更 (Changed)
- 大型生成布局可以把命令溢出到临时存储、保留可配置的 LRU 页面缓存、恢复不连续的页眉和页脚片段,并在每个流式条目之后释放换行文本
Version 3.77.0
新增 (Added)
TPdfLayoutTable、行、单元格和表格选项新增跨页表格,支持已解析的网格轨道、题注、重复表头行、可拆分的主体行、链接和可配置边框
变更 (Changed)
- 生成的标记表格跨页保持连续的 Table / TR / TH / TD 结构,保持跨行分组的原子性,并自动将数据单元格与表头 ID 关联
Version 3.76.0
新增 (Added)
TPdfLayoutConstraints和SetLastItemConstraints为生成的布局新增保持同页、与下一条目同页、物理段前 / 段后分页以及可配置的孤行 / 寡行控制
变更 (Changed)
BuildPlan复用每个换行文本结果进行分页预测和命令生成,避免与下一条目同页(keep-with-next)设置重复测量文本
Version 3.75.0
新增 (Added)
TPdf.InspectPdfUaUnicodeCoverage报告有界的对象级证据,涵盖直接 Unicode 映射、ActualText替换、映射错误、缺失的 Unicode 值和未解析的源对象
变更 (Changed)
TPdf.ValidatePdfUa现在复用单一的对象级字符扫描,该扫描排除 Artifact 和生成的字符,并防止某个文本对象的ActualText遮蔽相邻内容
Version 3.74.0
变更 (Changed)
- 当 Artifact 页面对象被结构树 MCID 声明时,
ValidatePdfUaPageContentTagging和TPdf.ValidatePdfUa现在会报告pvuaiArtifactInStructureTree,包括基于路径的分页 Artifact - PDF/UA 页面内容扫描现在只有在同时检测到未标记的真实内容和无效的 Artifact 包含之后才会短路,从而保留跨页覆盖而不重复已完成的检查
Version 3.73.0
新增 (Added)
TPdf.InspectPdfUaLanguageCoverage报告有界的页面对象和结构字符串证据,涵盖自然语言片段,包括有效语言、声明来源、MCID、结构索引和文本摘录ResolvePdfUaEffectiveLanguage解析标记内容、最近结构祖先和目录语言声明,并提供明确的有效性证据
变更 (Changed)
- 当非 Artifact 文本或无障碍字符串没有有效的生效
/Lang声明时,TPdf.ValidatePdfUa现在会报告pvuaiNaturalLanguageUncovered
Version 3.72.0
新增 (Added)
TPdf.InspectPdfAMetadata为全部八个 ISO 19005-1 Info 到 XMP 的映射报告带类型的逐字段等价性证据,包括显式空值和日期解析失败TPdf.NormalizePdfAMetadata只修复不匹配的已映射 XMP 属性,同时保留无关的命名空间和非默认语言备选项
变更 (Changed)
- 当 PDFium 解码的 Info 值在经过 Unicode 或时区感知的日期比较后与类型正确的 XMP 值不一致时,
TPdf.ValidatePdfA现在会报告pvaiInfoXmpValueMismatch
Version 3.71.0
新增 (Added)
InspectPdfVT2sStream为每个 PDF/VT MIME 部件返回印刷条件证据,包括 OutputIntent 标识、嵌入或 MIME 配置文件来源、ICC 哈希和头部信息,以及 DPart 页面和记录计数FPdfIccProfile提供有界的 ICC 头部和标签表检查,支持 MD5、SHA-256、色彩空间、版本、设备类、profile ID 和多语言 profile 描述
变更 (Changed)
- PDF/VT-2s 验证现在通过
DestOutputProfileRefURL 文件规范解析较早的 ICC MIME 附件,并验证CheckSum、ICCVersion、ProfileCS、ProfileName、设备类和允许的原色(process)色彩空间 - 所有 PDF/VT 部件现在都要求一个权威的
GTS_PDFXOutputIntent、适合 PDF/X 基础条件的嵌入或外部配置文件封装以及相同的特征化印刷条件,而仅 PDF/X 的附件仍不参与 PDF/VT 比较 - 单文件 PDF/VT-2 验证现在将
DestOutputProfileRef识别为外部目标配置文件,而不再报告其缺失
Version 3.70.0
变更 (Changed)
- PDF/VT 验证现在直接在每个 XObject 上检查
GTS_Scope、GTS_XID、GTS_Env和GTS_Encapsulated,而不允许附近或嵌套的字典满足提示要求 Record作用域现在从间接的DPartRoot字典解析RecordLevel,而Stream作用域在 PDF/VT-1 文件中会被拒绝- 解码后的页面和 Form XObject 内容流现在通过有效继承资源和 DPart 层次结构验证
Do资源可见性、SingleUse出现次数和接收方记录归属 - 封装的 XObject 现在验证布尔形状、推荐作用域、Image
Intent、隔离的透明组、混合色彩空间以及直接或嵌套的可选内容依赖
Version 3.69.0
变更 (Changed)
- PAdES 验证现在拒绝重复的
Contents、ByteRange、SubFilter、Filter和Type条目,而不是接受解析器选中的值 - 签名发现现在使用流感知的线性字典扫描,可识别转义的 PDF 名称标记,且不会被放置在真实
ByteRange之前的已闭合嵌套字典重定向 - 签名
ByteRange验证现在要求排除区间与直接的十六进制Contents标记完全匹配,同时仍允许后续的增量修订版 - 签名字典现在要求恰好一个名称值的
Filter,并强制Sig或DocTimeStamp的类型与子过滤器组合保持一致
Version 3.68.0
新增 (Added)
TPdf.BuildPadesEvidenceReport为每个签名关联 PDFium 签名事实、CMS 策略、信任与时间戳状态、证书路径哈希、DSS/VRI 覆盖以及后续修订版的判定TPadesEvidenceReport将有界的多签名证据导出为 JSON 或 CSV,并报告源、签名、DSS、修订版和截断遥测
变更 (Changed)
- PAdES 信任验证现在为签名者证书和有序的 Windows 证书路径记录 SHA-256 标识,同时默认保留离线验证
- 证据生成在合规、信任、DSS 和修订版分析之间复用同一份保留的源字节捕获,而不是为每个阶段把原始 PDF 复制到新流
Version 3.67.0
新增 (Added)
TPadesSignatureFieldOptions创建可配置的签名字段名称、必需的种子值、原因和法律声明列表、可接受的签名者证书以及字段锁定- 本地和远程签名可以使用 ISO 32000-1 的
FieldMDP和DocMDP变换创建审批或认证签名
变更 (Changed)
- 认证签名在通过
/Perms /DocMDP注册新签名的同时保留既有的目录权限
Version 3.66.0
新增 (Added)
RenderPageBandedToStream将 PNG 或 TIFF 输出直接写入调用方流,支持可配置的分带高度、PNG 压缩和输出字节上限RenderPageBandedToEncoder将顺序页面分带馈送给调用方定义的编解码器,并返回分带、行、内存、完成和输出遥测
修复 (Fixed)
RenderPageBanded现在保留整页渲染几何并对每个请求的分带进行裁剪,而不是把整页重新缩放进每个分带
Version 3.65.0
新增 (Added)
TPdfParallelRenderReport现在报告源大小、捕获内存峰值、存储后端和共享底层存储类型
变更 (Changed)
RenderPagesParallel通过不可变内存、只读文件映射或FPDF_LoadCustomDocument随机访问共享捕获的源,而不是再分配一个完整文档字节数组- 溢出的并行渲染源仍受
SaveMemoryLimit约束,并且不再需要把完整 PDF 重新加载到可寻址的进程内存
Version 3.64.0
新增 (Added)
ImportImposed现在提供一个返回TPdfImpositionExecutionReport的重载,其中包含原生导入、唯一源页面、空白槽位、XObject 模板、表单对象、内容生成和输出页面计数
变更 (Changed)
- 零几何拼版在插入空白页和原生 N-up 组合之前,通过一次
FPDF_ImportPagesByIndex调用发送所有有序源页面 - 自定义几何拼版为每个唯一源页面复用一个原生 XObject 模板,在不更改源页面的情况下读取缓存的页面度量,并预分配精确的计划存储
Version 3.63.0
新增 (Added)
BeginPageObjectEditTransaction、CommitPageObjectEditTransaction和RollbackPageObjectEditTransaction将原生页面对象修改编组为原子性的页面级批次,并提供经过验证的快照回滚PageObjectEditTransactionStatus报告绑定的页面、脏状态、成功的修改次数和内容生成次数
变更 (Changed)
- 已提交的对象批次现在只调用一次
FPDFPage_GenerateContent,而不是每次插入、移除、变换、属性、标记、注释对象或外观修改都调用一次 - 保存、页面切换、页面删除、嵌套编辑事务以及失败的原生插入或注释更新都会被拒绝,以免延迟内容丢失
Version 3.62.0
新增 (Added)
ReadPageObjectsSnapshot在对象、路径、裁剪、标记、文本、字符串和截止时间预算内捕获调用方拥有的页面对象事实PageObjectsSnapshot提供修订版感知的 LRU 复用,支持可配置的容量和占用率以及命中、未命中遥测
变更 (Changed)
PageComplexity现在复用不可变的页面对象快照,而不是重复执行原生对象枚举、透明度、路径和图像查询
Version 3.61.0
新增 (Added)
TPdf现在公开一个面向嵌入预览和渲染预览的统一缩略图 LRU,支持可配置的条目数和字节上限,以及命中、未命中、逐出、占用率和修订版遥测RenderPageThumbnail接受旋转、渲染选项、背景颜色和TPdfColorScheme,同时保留调用方拥有位图的约定
变更 (Changed)
- 重复的缩略图提取和渲染通过修订版、页面、源、大小、旋转、标志、背景和颜色方案键复用原生 PDFium 结果,包括对可选嵌入缩略图缺失状态的缓存
TPdfThumbnailView将其可见页面位图缓存与文档缩略图修订版同步,因此编辑不会留下过期的预览
Version 3.60.0
新增 (Added)
ReadTextPageSnapshot在一次遍历中捕获 Unicode、UTF-16 映射、字符几何和样式以及规范化的文本对象元数据,并受显式的字符、对象、字体名称和截止时间预算约束TextPageSnapshot通过可配置的修订版感知 LRU 提供调用方拥有的深拷贝,并带有容量、计数、命中和未命中遥测
变更 (Changed)
GetStructuredText和物理布局的GetTextInReadingOrder现在复用同一文本快照,并应用 O(n log n) 的几何排序
修复 (Fixed)
- 小型文本和结构快照缓存现在在按请求页面索引存储新数据的同时逐出最旧的页面,防止跨页缓存别名
Version 3.59.0
新增 (Added)
LifecycleActionPolicy可在禁用、仅显式或兼容模式之间选择 PDF 文档和页面生命周期动作的自动执行ExecuteDocumentLifecycleAction公开文档 JavaScript、打开、关闭、保存和打印动作,而ExecutePageLifecycleAction在不更改PageNumber的情况下执行页面打开和关闭动作
变更 (Changed)
- 无界面页面加载现在接收与查看器驱动的加载相同的自动页面打开和关闭动作,临时页面在渲染锁下被复用或释放
Version 3.58.0
新增 (Added)
ReadStructureElements和VisitStructureElements提供迭代的标记结构遍历,具有显式的深度、元素、属性和时间预算以及详细的完成状态StructureElementsForPage公开从 1 开始编号的页面快照而不更改PageNumber,并由可配置的修订版感知 LRU 缓存支撑,带命中、未命中和计数遥测
变更 (Changed)
- 无障碍、重排、验证和查看器消费方现在复用调用方拥有的结构快照,直到相关的文档或页面编辑使其失效
Version 3.57.0
新增 (Added)
- 完整的原生表单宿主回调现在提供生命周期安全的惰性页面句柄、交互视图光标路由、值变更通知、选中文本矩形、URI 事件和 GoTo 目标事件
FormHostCallbacksComplete报告回调就绪状态,而FormSelectionRects和ClearFormSelectionRects公开有界的页面空间选区几何
修复 (Fixed)
- XFA 当前页面回调现在可以在 PDFium 从零开始的页面索引和组件从 1 开始的
PageNumber之间正确转换 - AcroForm 和 XFA URI 回调现在保留原始 URI 字节,并在任何外部启动之前要求宿主显式批准
Version 3.56.0
新增 (Added)
- 按索引访问的
PageMetrics快照公开页面的尺寸、旋转、标签、透明度和五个标准页面框,而不更改活动页面
变更 (Changed)
- 重复的页面元数据读取复用自动失效的原生快照缓存,减少缩略图、预检和文档分析工作负载中的页面打开次数
Version 3.55.0
新增 (Added)
- 当加载的 PDFium 构建提供
FPDFPath_GetBezierControlPoints时,路径检查公开精确的三次贝塞尔(Bézier)控制点,并带有面向旧 DLL 的可选能力探测 FormFieldTypeAtPoint、TPdfView.FormFieldTypeAt和按索引访问的FontFlags属性公开原生表单和字体信息,而无需原始句柄TPdf.Signatures在一个调用方拥有的快照中返回所有原生签名内容、ByteRange、子过滤器、原因、时间和权限
变更 (Changed)
- 表单字段存在性检查现在使用直接的原生点位命中测试,而不是打开和关闭注释句柄
修复 (Fixed)
- PDF/E-1 验证现在允许普通 AcroForm 字段、嵌入文件和 FileAttachment 注释,同时精确报告顶层 AcroForm 的
/XFA和/NeedAppearances true,包括间接对象和对象流中的值
Version 3.54.0
新增 (Added)
FPdfProduction新增经测量的多编解码器图像选择、颜色和字体处理后端、SVG 路径、带样式替换计划、事务性 XFA 包更新、条码矢量、Portfolio 模型以及安全的 RichMedia 提取FPdfStandardsExecution新增测量和 GeoPDF 转换、事务性 PDF/A 修复、PDF/UA-2 计划、外部多色配置文件、历史 DSS 和 VRI 证据、DPart 查询、深度 PDF/E 事实以及固定内存的 PDF/R 条带TPdf.ImportImposed通过原生 N-up 或页面 XObject 路径组合有界的 N-up 和小册子计划,带精确的装订间隙、出血和蠕变几何;TPdf.CompareWith报告语义、几何和带容差的像素差异- PAdES 签名现在支持可插拔的路径验证器和 HSM 提供方、签名附加 PDF MAC、
cms-algorithm-protection以及离线签名策略文档
变更 (Changed)
- 布局引擎接受有界的 HTML 和 Markdown,可跨栏排文,并解析固定、自动和按比例的网格轨道
- XFDF 往返现在保留多值和富文本字段、弹出窗口、动作、目标、外观叠加、自定义命名空间和显式存在状态
Version 3.53.0
新增 (Added)
ConfigurePdfLibrary在首次加载 PDFium 之前提供不可变的原生渲染器、字体、V8、Brotli、用户字体路径和沙箱配置- 原生结构属性、注释关系、注释文件附件、类型化字典值、焦点策略、链接和表单 z 顺序查询,以及默认 TTF 映射诊断均可通过有界的高级 API 使用
TPdfView.ReplaceFormTextAndKeepSelection在重复编辑过程中保留活动选区,右键释放事件现在可到达原生表单引擎
变更 (Changed)
- 确定性文档时间现在除了固定纪元之外还使用稳定的 UTC 日历转换,在每个宿主时区生成相同的元数据
- 附件字符串写入会验证原生结果,并将字典键编码为 UTF-8
Version 3.52.0
新增 (Added)
TPdf.GetImageObjectRenderedBitmap返回图像对象在应用其当前矩阵、颜色空间、蒙版和渲染状态之后的渲染结果TPdf.TextObjectGlyphWidth、TPdf.TextObjectFontSize和TPdf.SetTextObjectFontSize公开原生字形测量和精确的文本对象字号编辑TPdf.TransformPageObjectClipPath、TPdf.DetachFormObjectChild、TPdf.SharePageObjectMark和TPdf.IsAnnotationObjectSubtypeSupported新增精确的内容对象编辑和能力检查
Version 3.51.0
修复 (Fixed)
- 早期发布说明中宣告的八个
TPdf成员此前被声明在私有区段,无法从PDFium单元外部调用;现在它们已如文档所述变为公开:LinkAtPoint、GetTextRenderMode、GetTextObjectRenderedBitmap、IsAnnotationSubtypeSupported、ChooseRenderFlags、AttachmentHasKey、GetAttachmentStringValue和SetAttachmentStringValue
变更 (Changed)
- 英文参考文档现在覆盖了
TPdf和TPdfView的每一个公开成员:此前没有参考页的 88 个成员现已获得参考页,类页面、导航索引和 API 参考均列出全部成员 - 此前指向共享页面的参考页现在直接链接到成员自身的页面,因此搜索结果会打开被搜索 API 的描述
- API 参考记录了可从公开签名访问的枚举和记录,包括加载与流报告、文本、字体与 OCR 类型、布局构建器类型、PAdES 验证类型、批处理与验证类型,以及并行渲染类型
Version 3.50.0
新增 (Added)
- 每个 GUI 示例现在都以立即可用的内容打开,而非空表单:查看器和实验室示例加载一份生成的示例文档,报告示例在启动时产出一份完整报告,处理器示例预生成示例输入,使主操作一键即可运行
MultiPageViewer、SplitView和FontProperties在启动时生成内存示例文档(一份六页演示、两份并排对比文档,以及一页供点击检查的多字体页面)- 处理器示例如
MergePDF、BatchExport、SplitPDF、ExtractText、PDFtoJpg、PrintPDF和PrintPreferences会在可执行文件旁边预生成示例 PDF 并预填其输入控件,且具备幂等再生成能力,绝不覆盖已有文件 FormFill和ExtractImages自动加载其示例目录中随附的示例文件,ImageToPDF生成两张示例位图,WatermarkStamp预构建其印章示例,XfdfLab打开一份带有文本和高亮注释的生成文档
变更 (Changed)
CreatePDF现在在启动时于可执行文件旁生成Sample.pdf且不弹出对话框,文档在示例打开时即已存在TPdf.AboutInfo和安装器元数据现在统一报告 Version 3.50.0
Version 3.49.0
新增 (Added)
- 更新后的 PDFium 二进制中的
FORM_GetTextDirection和FORM_SetTextDirection现已绑定,动态绑定层覆盖全部 472 个 PDFium 导出 TPdf.FocusedFormFieldTextDirection和TPdf.SetFocusedFormFieldTextDirection通过新的TPdfFormTextDirection枚举(ftdUnknown、ftdAuto、ftdLTR、ftdRTL)公开焦点控件的内存文本方向,并提供相应的TPdfView对应项,在方向改变后重绘页面场景
变更 (Changed)
FPDF_LIBRARY_CONFIG现在镜像 PDFium 版本 6 布局,为使用PDF_ENABLE_BROTLI构建的二进制提供实验性的m_BrotliEnabled字段TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.49.0
Version 3.48.0
新增 (Added)
PDFViewer示例程序现在在启动时使用创建 API 在内存中生成一份六页的演示文档,查看器打开即有渲染内容,磁盘上不再需要示例文件- 新增基于
TPdfThumbnailView的缩略图面板,在全部三个示例端口中提供点击导航的页面预览,位于书签树旁边 - 查看器搜索现在通过
HighlightSearchText高亮当前页上的每一个匹配项,而不是仅显示单个结果矩形,并在状态栏中报告匹配数量 - 一键
Night和2-Up工具栏按钮可切换夜间双色调渲染模式和双页对开显示模式
变更 (Changed)
- 查看器中的文本选择现在使用内置的
TPdfView选择引擎,支持双击选词、拖动选择和剪贴板快捷键,取代了手写的选区代码 - 页面渲染带投影并支持平滑滚动,带来现代化的阅读体验
TPdf.AboutInfo和安装器元数据现在统一报告 Version 3.48.0
Version 3.47.0
新增 (Added)
FPdfBenchmark可运行有界的 PDF 语料集,支持可配置的预热与测量轮数、页面和像素限制、协作式取消,以及每个用例的通过、失败或跳过状态TPdfBenchmarkReport记录输入与保存后的字节大小、加载和首页延迟、渲染吞吐量、保存与重新打开耗时、采样的峰值工作集、语义和像素 SHA-256 哈希、重复运行稳定性、期望哈希门限以及独立重新打开等价性- 基准测试报告可导出公式安全的 CSV 和结构化 JSON,用于 CI、发布资格验证和纵向性能跟踪
GetSkiaRenderCapabilities、RenderPageSkia和RenderPageSkiaByIndex公开可选的原生 Skia 页面与表单渲染,复用已解析页面缓存,且不强制要求 DLL 导出- 版本化的能力门控打印输出 ABI 可在已加载的 PDFium 模块提供支持时,公开精确的专色印版枚举、印版渲染、叠印检测和叠印预览
修复 (Fixed)
- 未定义
PDF_USE_SKIA的 PDFium 构建现在可以正常加载,而不会因为缺少实验性 Skia 导出而失败
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.47.0
Version 3.46.0
新增 (Added)
ValidatePdfR现在通过可配置的验证选项检查纯光栅页面内容、条带几何、颜色模型、有效分辨率、压缩参数、必需元数据以及加密的 PDF 2.0 配置文件BuildPdfARepairPlan将验证证据转换为按依赖排序的修复步骤,附带安全分级、签名影响防护和 JSON 输出BuildPdfXProductionPreflight报告页面框、嵌入字体、输出意图、色版、透明度、叠印、分色、图像分辨率和生产就绪状态,且无需解码图像数据- PDF/UA-2 结构验证现在检查关联文件所有权、阅读顺序、描述、关系和可发现性
变更 (Changed)
TAssociateFile.Description、TPdf.ImageInfo和TPdf.PageComplexity公开关联文件和生产预检工作流所需的元数据TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.46.0
Version 3.45.0
新增 (Added)
TPdfXmpPacket可解析、编辑、克隆和序列化具备命名空间感知能力的 XMP,支持未知命名空间、类型化 RDF 容器、URI 和资源值、限定符、语言备选、数据包包装以及保留填充TPdf.ReadXmpPacket和SaveAsWithXmpPacket公开高层元数据读取和原子输出,对已签名文档的修改需要显式授权
安全 (Security)
- 有界的 XML 读取器拒绝 DTD 和外部实体,并限制数据包字节数、嵌套层数、节点数、属性数和数值字符引用
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.45.0
Version 3.44.0
新增 (Added)
TPdfValidationRuleRegistry注册配置文件条款,附带严重性、依赖关系、修复指引、证据以及内置或自定义谓词TPdfValidationBudget和TPdfValidationExecutionContext对规则数、失败数、对象数、递归、UTF-8 证据、预留内存、运行时间、快速失败和协作式取消施加界限ValidatePdfFilesParallel通过相互隔离的工作文档验证多个文件,同时保持输入顺序,并聚合问题分布、耗时、失败、取消和加载错误
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.44.0
Version 3.43.0
新增 (Added)
TPdfStructureElement现在携带命名空间、命名空间角色映射、引用、关联文件、注释、部件、标签和外观信息,用于 PDF/UA-2 语义验证ValidatePdfUa2StructureElements及其专项验证器检查 ISO/TS 32005 命名空间与包含关系、有界表格网格、注释、表单、Formula/MathML 关联、关联文件、文档根、FENote、列表、TOC 引用、标题和题注,且无需加载pdfium.dllClassifyPdfUaNamespace可识别 PDF 1.7、PDF 2.0、MathML、ARIA、DPUB、自定义以及缺失的结构命名空间PdfUa2StructureHasIssue提供对 C++Builder 安全的单问题查询,无需按值返回 Pascal 集合
变更 (Changed)
ValidatePdfUaStructureElements会在puc2下自动应用新的语义规则集,同时保留 PDF/UA-1 规则路径TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.43.0
Version 3.42.0
新增 (Added)
TPdfUaSaveOptions.PdfUa2创建 PDF/UA-2 输出,携带pdfuaid:part2、pdfuaid:rev2024 以及有效的 PDF 2.0 catalog 版本ValidatePdfUa可检测puc2,并报告缺失的修订元数据、非 PDF 2.0 文件、未命名的可选内容配置、已弃用的注释以及泛型 H 标题
变更 (Changed)
- PDF/UA 验证现在会为 PDF/UA-1 和 PDF/UA-2 分别选择对应配置文件的 Tab 键顺序、XFA 和标题规则
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.42.0
Version 3.41.0
新增 (Added)
SetPageObjectMarkParam在现有标记内容项上添加或替换一个整数、实数、字符串或 blob 参数,而不会替换标记本身RemovePageObjectMarkParam移除一个选定属性,同时保留标记名称和所有无关属性
变更 (Changed)
- 非整数的标记内容数值现在以
pmpFloat往返保留,而不再被截断为整数快照 AddPageObjectMark期间参数验证失败时会移除已部分创建的原生标记TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.41.0
Version 3.40.0
新增 (Added)
ConfigureSystemFontProvider在 PDFium 启动之前安装应用程序字体映射器,并为缺失或被替换的文档字体提供经过验证的 TrueType 或 OpenType 字节TPdfSystemFontPolicy控制字面替换、原生回退、单字体字节上限以及有界的请求缓存GetSystemFontProviderStatistics报告映射、缓存、回退、拒绝、数据表和活动句柄的统计信息
变更 (Changed)
- 提供程序回调公开 PDFium 请求的字面、字重、样式、字符集和间距,同时将回调失败限制在原生边界之内
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.40.0
Version 3.39.0
新增 (Added)
AddCidType2Text嵌入调用方提供的 TrueType 数据,并附带显式的逐字形 CID-to-GID 几何和 CID-to-Unicode 映射TPdfCidFontOptions可选择完整嵌入、优先子集化加回退或强制子集化,并配置有界的字体、字形和 Unicode 预算TPdfCidFontReport报告子集化决策、字节大小、唯一字形数、嵌入状态、期望文本、提取文本和提取完整性
变更 (Changed)
- TrueType 子集化保留请求的字形标识符,拒绝不安全的输出,并在映射或提取验证失败时回滚所有已插入的页面对象
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.39.0
Version 3.38.0
新增 (Added)
BuildReflowDocument基于选定页面范围内的 Tagged PDF 结构或物理布局推断,创建有界且可复用的语义节点树TPdfReflowDocument.ToHtml输出经转义的响应式标题、段落、列表、插图、题注、页面分节以及带表头和跨距语义的表格TPdfReflowOptions控制表格检测、页面分节、几何、CSS、换行、页面范围、取消和资源预算
变更 (Changed)
- 重排期间表格内容会替换重叠的段落块,并在成功、失败或取消后恢复活动页面状态
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.38.0
Version 3.37.0
新增 (Added)
ApplyOcrSearchLayer通过 PDFium 渲染选定页面,并将有界的自上而下 BGRA 像素发送给调用方提供的IPdfOcrProviderTPdfOcrWord携带 Unicode 文本、置信度和像素空间四边形,并通过原生页面几何映射为不可见的可搜索文本TPdfOcrReport记录逐页完成情况、已有文本跳过、失败、取消、已渲染像素以及被接受或拒绝的单词
变更 (Changed)
- OCR 插入保留原始扫描图像流,过滤畸形或低置信度结果,每页仅提交一次,并恢复活动页面
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.37.0
Version 3.36.0
新增 (Added)
ExtractTables基于原生单词几何和变换后的路径框线检测带框线和对齐空白的表格TPdfTable报告行数、列数、合并跨距、页面边界、表头单元格、检测模式、置信度,并支持直接输出 CSV 或 JSONExtractDocumentTables在共享预算下扫描每一页,并标记跨页面边界延续的匹配表格
变更 (Changed)
- 表格提取强制执行可配置的单词、框线、单元格和表格数量上限,并在文档级扫描后恢复活动页面
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.36.0
Version 3.35.0
新增 (Added)
GenerateTaggedLayout创建带原生标记内容、Document 结构树、ParentTree 和 IDTree 映射以及文档语言元数据的全新语义布局文档TPdfLayoutSemantics对标题、分节、列表、插图、题注、表格、表头关联、跨距、替换文本、实际文本、语言和元素 ID 建模TPdfLayoutDocument.AddLink生成 URI Link 注释,并通过 OBJR 和 StructParent 映射将每个注释与其 Link 结构元素关联
变更 (Changed)
- 布局文本默认采用段落语义,而页眉、页脚、分隔线、图像和可复用表单默认为工件,除非显式标记
- 语义计划验证会在文档生成之前拒绝重复 ID、缺失父级、循环引用、无效的列表或表格包含关系、缺少替换文本的插图以及未解析的表格表头 ID
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.35.0
Version 3.34.0
新增 (Added)
TPdf.AddShapedText通过原生系统整形和 PDFium CID Type 2 字体 API 写入 RTL、双向、上下文相关和连字字形序列ShapePdfText和TPdfUniscribeTextShaper公开定位后的字形 ID、步进、偏移、源簇、视觉文本流位置和双向级别,且不修改文档
变更 (Changed)
- 生成的 ToUnicode 映射覆盖每个整形后的字形,同时
ActualText保存原始逻辑 Unicode 字符串,供合规的提取和辅助技术消费者使用 - 带 UTF-16 字节顺序标记的标记内容字符串现在可以通过
PageObjectMarks正确解码 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.34.0
Version 3.33.0
新增 (Added)
TPdfLayoutCachedNode在首次使用时构建子类化的布局内容,并支持通过AddCachedNode进行重复的缩放放置TPdfLayoutPlan报告测量缓存命中与未命中、缓存节点放置以及复用的原生 XObject
变更 (Changed)
BuildPlan依据完整的页面约束、内容、字体、样式、源和测量器标识复用匹配的计划,而无需重复文本测量GenerateLayout将每个唯一的缓存节点转换为一个绑定到目标的 XObject,并为每次放置创建轻量 Form 对象TPdf.AboutInfo、包元数据和安装器元数据现在统一报告 Version 3.33.0
Version 3.32.0
新增 (Added)
TPdfLayoutDocument将折行文本、占位间隔、分隔线、图像、可复用页面 XObject、显式分页符、页眉和页脚构建为一个经过测量的页面计划GenerateLayout在原子地追加原生页面和页面对象之前完成整个布局的分页,并提供稳定的{page}和{pages}引用
变更 (Changed)
TPdf.AboutInfo、包元数据和安装器元数据现在统一报告 Version 3.32.0
Version 3.31.0
新增 (Added)
TPdfPagePlan构建器描述删除、移动、插入、拆分和合并页面操作,而不会实际应用它们ValidatePagePlan返回精确的旧页到新页映射,并清点受影响的书签、命名目标、页面标签、表单字段、标记页面、导入特性和签名
安全 (Security)
- 会产生悬空导航目标或在未经显式授权情况下更改已签名内容的计划,会在任何原生页面操作运行之前被拒绝
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.31.0
Version 3.30.0
新增 (Added)
SaveRecoverySnapshot写入一个带校验和且大小有界的恢复包,其中包含源指纹和经过验证的文档编辑日志RestoreRecoverySnapshot仅在恢复包的校验和、日志链、源指纹和恢复后指纹全部匹配时才重放该恢复包EnableRecoveryAutosave在每次发生变更的提交、撤销或重做之后原子地刷新显式恢复文件,而不会重写源 PDF
变更 (Changed)
InspectRecoverySnapshot报告恢复源、指纹、条目数、位置和有界存储信息,而不会应用恢复包ImportEditJournal和恢复还原现在要求显式的AllowSignedDocument授权,然后才能对已签名 PDF 应用编辑- 恢复包存储使用已配置的有界随机访问存储和同目录写入替换,以支撑大型日志和崩溃安全的自动保存更新
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.30.0
Version 3.29.0
新增 (Added)
BeginEditTransaction、CommitEditTransaction和RollbackEditTransaction将任意原生文档编辑分组为原子事务UndoEdit和RedoEdit跨页面、对象、注释、附件和元数据变更应用经 SHA-256 验证的反向和正向增量ExportEditJournal和ImportEditJournal持久化有界的可移植增量,附带源指纹和摘要链验证,以供后续重放
变更 (Changed)
- 事务快照使用可复现的原生输出,因此即使普通 PDFium 保存包含非确定性标识符或时间戳,未变更的提交仍保持为空
- 失败的提交和无效的日志重放会原子地恢复先前可加载的文档,同时条目数、存储字节数和快照大小保持在调用方配置的上限之内
- 已签名 PDF 在文档编辑事务开始之前需要显式的
AllowSignedDocument授权 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.29.0
Version 3.28.0
新增 (Added)
TPdf.InspectOptionalContent枚举 OCG 图层、默认和备用配置、View/Print/Export 使用状态、缩放和语言元数据、锁定图层、顺序数组、单选组、OCMD 策略、可见性表达式以及有效渲染状态TPdf.SaveAsOptionalContentConfigured写入一份经过严格验证的副本,其中包含调用方为选定用途和配置选择的图层状态
变更 (Changed)
- 图层状态输出现在会同时更新配置的
/ON和/OFF数组以及 OCG Usage 状态字典,使 PDFium 通过其原生渲染上下文应用请求的可见性 - 配置写入会拒绝未知组、锁定图层更改、单选组冲突、已加密的暂存文件以及未经显式授权的已签名文件,并默认移除自动状态规则,以保持所选结果的确定性
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.28.0
Version 3.27.0
新增 (Added)
TPdf.RenderPageByIndex以精确的像素大小渲染任意基于 1 的页面,而不会更改当前编辑页面或触发页面更改事件PageSceneCacheCapacity、PageSceneCacheCount和ClearPageSceneCache公开有界的场景缓存控制和诊断
变更 (Changed)
- 索引页面渲染、渲染的缩略图和嵌入缩略图提取现在默认通过包含八项的 LRU 缓存复用已解析的 PDFium 页面状态
- 场景条目在页面激活、编辑、页面树更改、表单状态回调、显式清除和文档销毁时失效,进行中的渲染会被安全保留直至释放
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.27.0
Version 3.26.0
新增 (Added)
TPadesSignatureAlgorithmInfo报告每个 CMS 签名者的摘要、签名、公钥和命名曲线 OID,以及独立评估的算法策略状态InspectPadesSignatureAlgorithm和EvaluatePadesSignatureAlgorithm可识别 P-256、P-384、P-521、brainpoolP256r1、brainpoolP384r1、brainpoolP512r1、Ed25519 和 Ed448 配置
安全 (Security)
- PAdES 验证现在会拒绝椭圆曲线与摘要不匹配、ECDSA 签名 OID 与 CMS 摘要不一致、未命名的 EC 参数、Ed25519 参数以及输出长度不为 512 位的 Ed448 SHAKE256
- 原生 CMS 验证仍是密码学有效性的判定来源,不可用的算法和未识别的曲线会被报告为
pcsUnsupported,而不会被当作无效签名 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.26.0
Version 3.25.0
新增 (Added)
TPdf.ExportObjectGraph将活动的经典、xref-stream 和 object-stream 对象导出为有界的类型化 JSON,包含显式的字典、数组、字符串、名称、标量值、间接引用、流字节计数以及可选的 SHA-256 流摘要TPdf.SaveAsObjectGraphPatched通过类型化的 null、Boolean、整数、实数、名称、文本字符串和间接引用补丁值,设置或移除经模式检查的顶级字典值
安全 (Security)
- 对象图导出强制执行对象、递归、字符串和输出字节预算,而修补在交付前验证每个操作,并拒绝悬空引用、重复操作、加密输入、受保护的流过滤器或长度更改,以及未经显式授权的已签名文档
- 对象图补丁会作为增量修订暂存,重新物化以进行 xref 验证,通过 PDFium 严格加载,并且只有在所有检查都成功之后才会被复制或原子重命名
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.25.0
Version 3.24.0
新增 (Added)
TPdf.ValidatePadesTrust依据精确的原始ByteRange验证每个可发现的分离式签名,评估 signing-certificate-v2 绑定和当前 Windows 系统信任,并独立报告签名、链、吊销和时间戳状态TPdf.ValidatePadesTrustAsync在调度之前对原始加载源建立快照,分阶段报告解析、密码学运算、链构建、AIA、OCSP、CRL 和 RFC 3161 时间戳工作的进度,并支持协作式取消TPadesTrustValidationOptions可选择离线或在线信任、可选的吊销和时间戳验证、有界的 URL 检索超时、取消令牌和进度回调
安全 (Security)
- 签名时间戳和 Document Time-stamp 令牌现在会独立于普通文档签名,验证其 SHA-256 消息印戳、附带的 CMS 签名、TSA 链以及可选的吊销状态
- 信任验证从不对 PDFium 重新保存的副本计算哈希,默认采用仅离线缓存的证书检索,并将不可用或不确定的状态如实报告,而不会把不可用的原生信任或吊销证据视为有效
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.24.0
Version 3.23.0
新增 (Added)
TPdf.RenewPadesArchiveTimestamp和RenewPadesArchiveTimestampToStream向现有 PAdES 签名链追加新的 RFC 3161 Document Time-stamp,而不更改任何历史字节TPadesArchiveTimestampOptions控制 TSA 访问、nonce、预留令牌容量和可选的完整 DSS 刷新,而TPadesArchiveTimestampReport记录源级别和结果级别、链长、字节长度以及返回的时间戳标识
修复 (Fixed)
- 新建和续期的 PAdES B-LTA 输出声明 ESIC ExtensionLevel 2,而 B-LT 验证不再要求 Level 2,除非存在 Document Time-stamp
安全 (Security)
- 续期对精确的原始加载字节加上任何请求的 DSS 更新计算哈希,拒绝加密或不完整的源,在写入输出之前验证可发现的 B-LTA 结果,并在替换之前暂存文件输出
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.23.0
Version 3.22.0
新增 (Added)
TPdf.AnalyzeSignatureRevisions重建原始的增量修订链,并返回按 DocMDP 和 FieldMDP 权限分类的逐签名对象变更TPadesRevisionAnalysisReport区分允许的表单、注释、签名和验证材料更新与不允许的页面或文档更改、未解析情形以及可疑的影子定义
安全 (Security)
- 修订分析可检测未引用的对象定义、签名对象重定义、活动内容、畸形修订链和未解析的压缩对象,同时强制执行有界的修订、对象和变更预算
- 分析始终使用原始加载的文件、内存缓冲区、自定义流或已完成的渐进源,而不是由 PDFium 重写的字节
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.22.0
Version 3.21.0
新增 (Added)
TPdf.PreparePadesRemoteSignature创建固定宽度的分离式签名占位符,并返回一个持久请求,其中包含 SHA-256 文档摘要、精确的ByteRange、预留坐标和已准备 PDF 的指纹TPdf.CompletePadesRemoteSignature在验证持久化请求和返回的 CMS 之后,完成 HSM、云端或被中断的签名会话TPdf.SavePadesRemoteSigningRequest和TPdf.LoadPadesRemoteSigningRequest为跨进程和跨机器边界提供稳定的带版本二进制会话格式
安全 (Security)
- 完成签名时会拒绝已被修改的已准备 PDF、被更改的
ByteRange坐标、复用的非空占位符、超大的 CMS 值、不支持的 SignedData 形态、缺失的 signing-certificate-v2 属性,以及与已准备文档不匹配的 CMS 消息摘要 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.21.0
Version 3.20.0
新增 (Added)
TPadesDssOptions.Vris为每个签名写入一个间接的/Type /VRI字典,以完整解码后(含填充)的/Contents值的大写 SHA-1 作为键TPadesDssVri通过经过验证的索引选择证书、OCSP 和 CRL 材料,同时 PAdES B-LT 和 B-LTA 签名现在会自动为新签名创建 VRI
变更 (Changed)
- DSS 证书、OCSP 响应和 CRL 会按内容哈希去重,并在写入任何目标字节之前进行稳定的首次出现排序、精确字节冲突检查和 VRI 引用重映射
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.20.0
Version 3.19.0
新增 (Added)
TPdf.GetStructuredText将当前页面转换为可复用的块、行和带样式跨距记录,同时保留源字符索引、Unicode 标量、几何、字体名称、大小、字重和文本角度TPdfStructuredTextOptions可选择内容流或物理布局顺序、可选的字体和语义增强,以及失败即停的最大字符预算- Tagged PDF 片段和启发式可读内容片段会用结构种类、标题级别、语言、来源和结构元素标识来增强块信息,同时未匹配的 Figure 替换文本也会保留表示
变更 (Changed)
- 物理布局提取现在使用 O(n log n) 字符排序、按几何增长的行和跨距缓冲区、行与列聚类、缓冲式 Unicode 构造以及相邻非空文本对象字体缓存,从而在超大页面上获得可预测的性能
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.19.0
Version 3.18.0
安全 (Security)
TPdf.SaveAsRedacted将每个/Redact矩形应用于隔离的文档快照,移除每个相交的顶级页面对象,并绘制一个不透明的替换矩形,同时不更改已加载的文档- 脱敏输出会移除脱敏注释,可选择移除其他相交注释,删除原生嵌入附件,并剥离 catalog 的
/AF、活动内容、表单、元数据以及不可达的先前修订对象 TPdfRedactionOptions控制替换颜色、重叠注释移除和失败即停的页面对象扫描预算,而TPdfRedactionReport记录每次移除和输出指标TPdfSanitiseOptions.StripAssociatedFiles现在默认移除 catalog 级别的关联文件引用
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.18.0
Version 3.17.0
新增 (Added)
TPdf.RenderPagesParallel并发渲染基于 1 的页面请求,每个 worker 拥有独立加载的 PDFium 模块、文档和页面状态,全部源自同一份捕获的文档快照TPdfParallelRenderOptions控制 DPI、worker 数量、旋转、原生渲染标志、背景色、单页像素限制以及聚合的保留输出限制TPdfParallelRenderReport保持请求顺序,并返回调用方所有的自上而下 BGRA 或 RGBA 缓冲区,附带逐页的成功、取消、失败、尺寸、耗时和诊断详情- 渐进式 worker 渲染会在原生分块之间轮询
IPdfCancellationToken,无效请求和预算失败仍被隔离在各自对应的结果中 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.17.0
Version 3.16.0
新增 (Added)
TPdfEncryptionRevision.erR7新增 ISO/TS 32003 AES-256-GCM 输出,携带/V 6、/R 7、/CFM /AESV4以及必需的 PDF 2.0 开发者扩展- 每个加密的字符串和流都会获得唯一的 96 位 IV、长度不变的密文和 128 位身份验证标签,而
EncryptMetadata = False会保留元数据流字节 DecryptAesGcmDocumentBytes在返回与 PDFium 兼容的明文字节之前,会验证用户或所有者密码、加密权限、可选的独立 PDF MAC 数据以及每个 GCM 标签- AESV4 输出可以与
TPdfEncryptOptions.EnableIntegrityProtection组合,使逐对象的 GCM 身份验证与整份文档的 ISO/TS 32004 PDF MAC 保护并存 - 加密现在使用有效的经典交叉引用条目,而不再把流数据内部形状类似对象的文本解释为间接对象
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.16.0
Version 3.15.0
新增 (Added)
TPdfEncryptOptions.EnableIntegrityProtection为 AES-256 Standard Security Handler 版本 5 和 6 的文档写入 ISO/TS 32004 独立 PDF MAC 身份验证码TPdf.ValidatePdfMac验证精确的原始源字节、严格覆盖 EOF 的/ByteRange、CMSAuthenticatedData、由密码派生的文件密钥、经身份验证的属性、包装的 MAC 密钥和 HMAC 值FPdfHmac新增 HMAC-SHA256 和 HKDF-SHA256,同时FPdfAes新增 RFC 3394 AES-256 Key Wrap 和经身份验证的解包基元TPdfMacValidationResult区分有效、缺失、无效和不受支持的身份验证码,并附带诊断文本TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.15.0
Version 3.14.0
新增 (Added)
TPdf.ValidatePades现在会在 Windows 上依据精确的原始/ByteRange分段验证分离式 CMS 签名,包括已签名属性和签名值TPadesValidationResult公开聚合完整性状态以及逐签名的 ByteRange、CMS、signing-certificate-v2、系统信任、吊销和时间戳状态,而不会把不受支持或未检查的证据混同于无效签名- 签名者证书绑定通过 SHA-256 检查,证书链使用仅缓存的 Windows 系统信任评估,原生错误码仍可用于诊断
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.14.0
Version 3.13.1
修复 (Fixed)
TPdf.ValidatePades现在检查原始文件、缓冲内存或自定义流字节,而不是 PDFium 重新保存的副本(后者可能使偏移失效或丢失签名字典)- PAdES
/ByteRange检查现在接受覆盖先前完整 PDF 修订并后随有效增量更新的签名,同时还会验证 Document Time-stamp 范围 TPadesValidationResult.SourceStatus区分原始源验证与不可用或不完整的渐进输入,合规性谓词会拒绝没有原始字节的结果TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.13.1
Version 3.13.0
新增 (Added)
FPdfSha3提供无依赖的 SHA3-256、SHA3-384、SHA3-512 和 SHAKE256 基元,用于 ISO/TS 32001 及相关 PDF 2.x 密码学工作- 增量上下文可吸收任意拆分的输入,而 SHAKE256 支持重复的 squeeze 调用以及跨越海绵速率边界的输出
- 一次性字节数组和小写十六进制辅助函数与流式 API 互补,并在 Delphi、C++Builder 和 Lazarus 之间提供显式的生命周期和大小验证
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.13.0
Version 3.12.0
新增 (Added)
TPdf.ImportFDF从文件或流导入 FDF 表单数据,并通过现有的部件字段路径应用解析后的值FdfImportFromStream和FdfImportFromFile在有界资源预算下解析直接或间接的分层字段、PDF 字面字符串和十六进制字符串、PDFDocEncoding、Unicode 文本、名称值和显式空值- FDF 导出现在将非 ASCII 字段名和值写为符合标准的 UTF-16BE 文本字符串,并安全转义源文件名
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.12.0
Version 3.11.0
新增 (Added)
TPdf.DetectPageSkew以低 DPI 渲染当前页面,通过将暗像素投影到候选旋转角度来检测倾斜角,返回使行和方差(文本行对齐度)最大的角度,精度约为 0.1 度TPdfSkewReport公开检测到的角度、置信度和采样尺寸TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.11.0
Version 3.10.0
新增 (Added)
TPdf.GetTextInReadingOrder通过FPDFText_GetCharBox加按位置排序的字符提取,以原始内容流顺序或物理布局顺序(自上而下、从左到右)提取当前页面文本,使多栏和视觉上重排的文本能自然阅读TPdfReadingOrder枚举可在roContentOrder和roPhysicalLayout之间选择TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.10.0
Version 3.09.0
新增 (Added)
TPdfImageOptimizeOptions.PreserveBilevel在OptimizeImages期间跳过 1 位双值图像(ImageMask / 线条稿扫描),使最近邻下采样不会破坏其清晰的边缘TPdfImageOptimizeOptions.MinDimension跳过小于阈值的图像(通常是无法从进一步缩减中受益的图标或装饰元素)TPdfImageOptimizeOptions.Default提供推荐的起点配置(目标 150 DPI、比率 1.5、保留双值图像、最小尺寸 8)TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.09.0
Version 3.08.0
新增 (Added)
TPdfTileCache提供有界的已渲染页面分块 LRU 缓存,以文档修订、页面、缩放、旋转、渲染标志和设备矩形为键,因此未更改的分块不会在重绘时重新渲染,而先前保存产生的过期分块会被自动逐出TTileKey公开复合缓存键,并提供静态Create工厂和Equals比较器TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.08.0
Version 3.07.0
新增 (Added)
TPdf.GetAnnotationFontColor和TPdf.SetAnnotationFontColor封装了此前已绑定但未使用的FPDFAnnot_GetFontColor和FPDFAnnot_SetFontColor,公开部件文本颜色的读写以支持表单字段编辑,而无需直接操作注释字典TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.07.0
Version 3.06.0
新增 (Added)
TPdf.RenderPageBanded通过回调以水平条带渲染当前页面,因此海报和工程图纸页面无需分配完整的目标位图即可导出 — 每个条带渲染到按请求条带高度新建的TBitmap中,并在回调返回后释放TPdfBandCallback公开逐条带契约(条带索引、顶部 y 偏移、位图),其 Boolean 返回值允许调用方提前取消条带渲染TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.06.0
Version 3.05.0
新增 (Added)
TPdf.RenderPageProgressiveWithColorScheme通过FPDF_RenderPageBitmapWithColorScheme_Start以低视力配色方案驱动原生渐进渲染循环,允许调用方为无障碍访问覆盖路径填充 / 描边和文本填充 / 描边颜色,同时保留可感知取消的 Continue 循环TPdfColorScheme公开四个TColor覆盖字段,其Default在所有字段均为clDefault时委托给 PDFium 内置颜色TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.05.0
Version 3.04.0
新增 (Added)
TPdf.ExportFDF在现有 XFDF 路径之外,将表单字段值序列化为 FDF(ISO 32000-1 §12.7.11)文档,复用相同的TXfdfField数据模型,因此调用方只需收集一次字段即可输出任一格式FPdfXfdf中的FdfExportToStream和FdfExportToFile为独立于已加载TPdf构建字段集合的调用方公开底层 FDF 序列化器TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.04.0
Version 3.03.0
新增 (Added)
TPdf.SaveAsSanitised写入干净的单修订副本,从 catalog 中剥离活动内容(/OpenAction、catalog/AA、/Names、/AcroForm、/Metadata),然后修剪不可达对象,使孤立的 JavaScript、动作和附件主体从文件正文中消失TPdfSanitiseOptions公开按向量独立的剥离控制以及可选的可达性修剪阶段;TPdfSanitiseReport记录剥离条目数、修剪对象数、字节计数以及任何错误TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.03.0
Version 3.02.0
新增 (Added)
TPdf.SaveAsPageLabelled写入完整的 PDF 副本,其 catalog/PageLabels数字树会被替换为提供的范围,按 ISO 32000-1 §12.4.2 应用十进制、大/小写罗马数字和大/小写字母编号样式,并支持可选的前缀文本字符串和起始编号TPdfPageLabelRange、TPdfPageLabelRanges、TPdfPageLabelStyle和TPdfPageLabelReport公开范围模型、样式枚举以及每次保存的字节和范围计数- 现有的 catalog
/PageLabels条目会被检测并拒绝,除非传入ReplaceExisting=True,此时会在注入新范围之前剥离旧条目 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.02.0
Version 3.01.0
新增 (Added)
TPdf.FlattenPageRotation将每页当前的/Rotate固化到内容流、页面框和注释矩形中,然后将/Rotate重置为 0 — 通过封装FPDFPageObj_TransformF+FPDFAnnot_GetRect/SetRect+FPDFPage_SetMediaBox/SetCropBox+FPDFPage_SetRotation,在不依赖旋转显示提示的情况下保留视觉布局TPdfFlattenRotationOptions公开逐页的注释变换、页面框交换和自动更新控制;TPdfFlattenRotationReport记录已处理、已跳过和失败的页面,以及变换的对象和注释总数TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.01.0
Version 3.00.0
新增 (Added)
TPdf.StampPagesFromPdf将源页面作为定位、缩放且可选旋转的 Form XObject 覆盖层或垫底层加盖到一个或多个目标页面,封装CreateXObjectFromPage+FPDFPageObj_SetMatrix+FPDFPageObj_SetBlendMode+FPDFPage_InsertObjectAtIndex,并提供显式的页面框、锚点、边距、缩放、旋转、混合和 z-order 策略TPdfOverlayOptions和TPdfOverlayReport公开放置、变换、混合和 z-order 控制,以及逐页的已加盖、失败和跳过计数TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 3.00.0
Version 2.99.0
新增 (Added)
TPdf.RefreshAppearance通过FPDFAnnot_SetAP选择性地重新生成单个部件的外观流,避免整页的NeedAppearances重建TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.99.0
Version 2.98.0
新增 (Added)
TPdfView.MouseDown现在通过FORM_OnRButtonDown将右键事件路由到原生表单填充引擎,从而支持右键菜单和部件交互- 路线图第 78 项(链接注释映射)、82 项(部件呈现)和 83 项(结构属性模型)经确认已通过现有基础结构完成
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.98.0
Version 2.97.0
新增 (Added)
TPdf.SetDeterministicTime和TPdf.RestoreActualTime允许测试和可复现构建通过受支持的原生回调注入固定的创建时间、修改时间和当前时间TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.97.0
Version 2.96.0
新增 (Added)
TPdf.GetWidgetAdditionalActionJavaScript通过FPDFAnnot_GetFormAdditionalActionJavaScript读取指定事件触发器的部件附加动作 JavaScript,而不执行任何脚本TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.96.0
Version 2.95.0
新增 (Added)
TPdf.GetObjectText通过FPDFTextObj_GetText提取文本页面对象的 Unicode 文本,用于精确的内容编辑和编码诊断TPdf.GetObjectsByType返回与类别(文本、路径、图像、表单、底纹)匹配的所有页面对象的索引,用于按类别选择输出TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.95.0
Version 2.94.0
新增 (Added)
TPdf.AttachmentHasKey、GetAttachmentStringValue和SetAttachmentStringValue可读取、写入和探测嵌入附件上的自定义文件规范扩展值TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.94.0
Version 2.93.0
新增 (Added)
TPdf.InsertObjectAtIndex通过FPDFPage_InsertObjectAtIndex将页面对象插入到请求的堆栈位置,而不是始终追加TPdf.UpdateAnnotationObject通过FPDFAnnot_UpdateObject提交已编辑的注释外观对象,使注释所属页面对象的更改可靠保留TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.93.0
Version 2.92.0
新增 (Added)
TPdf.InsertClipPath通过原生FPDF_CreateClipPath和FPDFPage_InsertClipPath路径创建矩形裁剪路径并将其插入当前页面,作为现有PageObjectClipPath检查器的补充TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.92.0
Version 2.91.0
新增 (Added)
TPdf.GetPageComplexity扫描当前页面并报告图像、路径和文本对象计数,以及路径段总数、图像像素总数和透明度存在情况,用于渲染规划TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.91.0
Version 2.90.0
新增 (Added)
TPdf.IsAnnotationSubtypeSupported在编辑之前询问已加载的 PDFium DLL 支持哪些注释子类型TPdf.ChooseRenderFlags根据最终缩放比例和目标大小选择原生渲染标志(半调、受限图像缓存),以实现自适应图像下采样TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.90.0
Version 2.89.0
新增 (Added)
TPdf.GetTextRenderMode公开文本页面对象的原生文本渲染模式(填充、描边、裁剪),用于创作诊断TPdf.GetTextObjectRenderedBitmap通过原生FPDFTextObj_GetRenderedBitmap路径将单个文本对象渲染到隔离的位图TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.89.0
Version 2.88.0
新增 (Added)
TPdf.GetThumbnail现在会在页面没有嵌入缩略图时回退到渲染替代缩略图,实现嵌入缩略图优先的偏好策略TPdf.LinkAtPoint使用FPDFLink_GetLinkAtPoint返回页面空间坐标处是否存在原生链接,而不再仅依靠矩形扫描TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.88.0
Version 2.87.0
新增 (Added)
TPdf.AuditActiveContent返回TPdfActiveContentAudit快照,包含 JavaScript 动作数、嵌入文件数、签名数、XFA 表单类型和文档权限,而不执行任何脚本或动作TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.87.0
Version 2.86.0
新增 (Added)
TPdf.GetFeatureInventory只扫描每页一次,即返回统一的记录,包含文本、路径、图像、Form XObject 和底纹对象计数,以及附件、签名、表单类型、权限和 PDF 版本信息TPdfFeatureInventory将此前需要多次属性调用才能获得的文档级信息聚合为单一快照TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.86.0
Version 2.85.0
新增 (Added)
TPdf.SaveAsReproducible重写文档,使同一内存状态的两次保存产生字节完全相同的输出- 非确定性的
/Info时间戳(/CreationDate、/ModDate)会被剥离,源/ID(由依赖系统时钟的字节派生)会被省略,同时对象顺序和世代号保持稳定 TPdfReproducibleReport报告保留和修剪的对象计数,以及被剥离的时间戳条目数TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.85.0
Version 2.84.0
新增 (Added)
TPdf.SaveAsInlineImagesExternalised重写文档,将每个BI/ID/EI内联图像提取为可复用的图像 XObject,并用/ImN Do运算符替换内联块- 内联图像字典缩写(
/W、/H、/BPC、/CS、/F、颜色空间值和过滤器值)会展开为完整的图像 XObject 名称,使提取的对象符合标准 - 页面
/Resources /XObject字典会更新为新的 XObject 引用,重写后的内容流会进行 Flate 压缩 TPdfInlineImageExternaliseReport报告已外部化、已跳过和失败的计数,以及创建的 XObject 数量TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.84.0
Version 2.83.0
新增 (Added)
TPdf.SaveAsFlateRecompressed重写文档并以最大压缩率重新编码符合条件的FlateDecode流,仅当实测的字节节省超过调用方阈值时才替换流TPdfFlateRecompressOptions可选择以字节计的最小节省量和最小节省比率,使已经最优的流保持不变TPdfFlateRecompressReport报告重新压缩、跳过和失败的流计数,以及原始和重新压缩后的流字节总量- 对象编号和世代号保持稳定;只有重新压缩的流数据及其直接
/Length值会变化,因此每个保留的交叉引用仍然有效 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.83.0
Version 2.82.0
新增 (Added)
TPdf.OptimizeImages遍历每个页面图像对象,对有效放置 DPI 超过调用方选定目标的图像进行下采样,然后通过原生内容生成器提交每个被修改的页面TPdfImageOptimizeOptions可选择目标 DPI 和最小比率,只有真正过采样的图像才会被重新编码TPdfImageOptimizeReport报告已优化、跳过和失败的图像计数,并附带结构化的失败消息- 下采样在原生 PDFium 位图缓冲区上执行最近邻遍历,保留源格式、跨距和 alpha 通道,并由
FPDFImageObj_SetBitmap重新编码保留下来的图像 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.82.0
Version 2.81.0
新增 (Added)
TPdf.SaveAsDeduplicated将文档重写为单一干净修订,把兼容的字体、图像和 Form XObject 合并到同一共享代表上- 递归内容指纹组合每个资源字典、其完整可达子图及其原始流数据,因此只有整体内容完全相同的重复项才会合并
- 指向被合并重复项的每个交叉引用都会重写为保留下来的代表,同时重建的经典交叉引用表保持对象编号稳定
TPdfDedupReport报告保留和修剪的对象计数,以及按类别合并的字体、图像和 Form XObject 计数TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.81.0
Version 2.80.0
新增 (Added)
TPdf.SaveAsReachable将文档重写为单一干净修订,仅保留从 catalog 和 trailer /Info 字典可达的间接对象TPdfPruneReport报告保留和修剪的间接对象计数、源和输出字节大小,以及针对加密或畸形输入的结构化失败原因- 增量更新、页面合并或修复保存遗留的不可达孤立对象会被清除,同时重建的经典交叉引用和 trailer 会保留
/Root、/Info和/ID,不进行重新编号 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.80.0
Version 2.79.0
新增 (Added)
TPdf.CreateDocumentSearch创建向前或向后的全文档搜索,逐个返回匹配结果,而无需构建全文档文本索引TPdfDocumentSearchResult为每个结果报告基于 1 的页码、字符范围、匹配文本和页面空间矩形- 搜索会话接受
IPdfCancellationToken,仅保留当前的 PDFium 页面和文本句柄,并在文档关闭时安全结束 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.79.0
Version 2.78.0
变更 (Changed)
TPdfRangeRequestScheduler现在会抢占重叠的低优先级传输,使页面关键的 PDFium 提示不必在后台下载之后等待- 外部已提供的稀疏字节会取消冗余的活动传输,而被取代或重复的传输回调会返回 False,且不发布过期覆盖信息
- 优先级提升保留独立的重试历史,传输抢占也不再消耗未受影响范围尾部的重试预算
TPdfRangeRequestStatistics.SupersededRequestCount报告被更高优先级提示或外部提供的覆盖取代的传输工作量TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.78.0
Version 2.77.0
新增 (Added)
TPdf.SaveAsNormalizedContent将语法规范化的页面内容写入流或原子替换的文件,并报告规范化、跳过和合并的页面计数NormalizePdfContentSequence为已解码的内容流序列提供有界的独立令牌规范化
变更 (Changed)
- 页面
/Contents数组现在可以合并为单个流,同时保留字符串、名称、内联图像数据、未知运算符和跨流图形状态 - 畸形令牌、不平衡的状态作用域、不支持的过滤器、加密输入和已签名文档重写均有显式策略和结构化状态报告
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.77.0
Version 2.76.0
新增 (Added)
TPdfStreamInspector清点任意物理 PDF 流对象,并报告对象偏移、原始长度、过滤器链、DecodeParms、外部文件标记、加密状态以及原生图像或附件路径CopyRawData复制完整的已编码数据或经过验证的字节窗口,而DecodeData按声明顺序应用 ASCIIHex、ASCII85、LZW、Flate、RunLength、TIFF 8 位和 PNG 预测器TPdfStreamInspectOptions对源、原始、解码、字典、流计数和膨胀比率资源施加界限,并对超限、畸形数据、不支持的编解码器、加密和写入失败提供结构化报告
变更 (Changed)
- 流长度解析现在为直接和间接
/Length值公开精确跨度,包括零长度流和包含字面endstream序列的数据 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.76.0
Version 2.75.0
新增 (Added)
TPdfLoadOptions为文件、内存、字节范围和自定义流加载新增兼容、严格和恢复策略TPdfLoadReport报告经典、混合和 xref-stream 文档的原生恢复路径、xref 有效性、损坏偏移、条目冲突、修订计数、审计预算和结构化问题TPdf.SaveAsRepaired创建完整的单修订副本,并在交付经过验证的流或原子替换目标文件之前对其独立执行严格加载
变更 (Changed)
- 现有的加载重载保留兼容行为,现在会通过
LastLoadReport发布原生 xref 有效性和恢复状态 - 严格加载会拒绝需要原生 xref 重建或未通过结构审计的文档,而已签名文档的修复输出需要调用方显式授权
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.75.0
Version 2.74.0
新增 (Added)
TPdf.MergeFiles合并基于文件的源列表,支持逐源页面范围和密码,同时最多保持一个源文档处于打开状态TPdfBatchMergeOptions新增停止或跳过的错误处理、按源或分块的导入、表单和大纲策略、插入控制、进度回调、取消、查看器首选项复制以及回滚控制TPdfBatchMergeReport报告已提交和已回滚的页面、源结果、原生导入调用、最大批次、峰值打开源数、策略检测结果、问题以及最终状态
变更 (Changed)
- 默认批处理路径对每个源执行一次原生页面导入,使 PDFium 能够在该源范围内复用克隆的对象,然后在打开下一个文件之前关闭该源
- 分块模式提供更细的取消点和更小的原生批次,而部分失败的源以及停止或取消的结果可以移除该操作插入的所有页面
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.74.0
Version 2.73.0
新增 (Added)
TPdfRandomAccessStore提供线程安全的顺序和定位 I/O,将较小内容保留在有界内存中,并在达到调用方选定的上限时一次性溢出到私有临时存储TPdf.SaveMemoryLimit和SaveTemporaryDirectory配置保存暂存,而LastSaveSpillCount和LastSaveLargestMemoryBuffer公开可度量的逐次保存诊断
变更 (Changed)
- 保存、标准转换、验证、加密、DSS 和 PAdES 的暂存缓冲区现在共享有界的工作存储,并使用独占的关闭时删除溢出文件和内存擦除
- 由
TPdfRandomAccessStore支撑的自定义 PDFium 块回调会串行化普通流定位,并使用与游标无关的定位读取 - 基于文件的 XFA 能力扫描现在读取固定大小的重叠块,而不再将完整 PDF 复制到内存
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.73.0
Version 2.72.0
新增 (Added)
TPdf.BeginIncrementalSave、CommitIncrementalSave和EndIncrementalSave提供修订会话,仅追加已更改或新创建的间接对象TPdfIncrementalCommitInfo为每次提交报告已更改对象数、追加字节数、总输出字节数和成功修订计数
变更 (Changed)
- 每次脏提交都将完整的先前输出保留为精确的字节前缀,无变化时不生成修订,并延续源文档的经典或 xref-stream 格式
- 原生 xref-stream 增量输出会先修复其必需的类型、自引用条目、长度、索引和对象终止符,然后才进行后续处理
- 加密文档会在会话开始之前被拒绝,而已签名文档需要调用方显式许可,签名策略不会因疏忽而被绕过
- 文件重载会先完成同级临时文件,再原子替换目标,并在任何写入或替换失败后回滚会话状态
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.72.0
Version 2.71.0
新增 (Added)
TPdf.SaveAsObjectStream写入 PDF 1.5+ 文件,包含有界的压缩对象组和仅含完整 type-2 条目的纯 xref 流PackPdfObjectStreams可在解析活动修订之后,将经典、混合、xref-stream 以及现有对象流输入现代化
变更 (Changed)
- 页面局部对象排序、自适应 xref 字段宽度、直接 catalog 访问以及可配置的成员数和解码字节上限,在文件大小与随机访问性能之间取得平衡
- 文件重载会先完成同级临时文件,再原子替换目标,而无效的增量、版本和分组选项会在输出开始之前被拒绝
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.71.0
Version 2.70.0
新增 (Added)
TPdf.SaveAsLinearized使用首页对象分组、两个交叉引用节以及 Annex F 页面偏移和共享对象提示表,将真正的 Fast Web View PDF 写入流或文件- 活动的对象流成员会自动物化,使 xref-stream 和对象流输入能够变为对范围请求友好的输出,而不改变可见的页面内容
变更 (Changed)
- 文件重载会先完成同级临时文件,再原子替换目标,而流重载保留常规的 PDFium 保存选项和显式版本检查
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.70.0
Version 2.69.0
新增 (Added)
TPdfRangeRequestScheduler将 PDFium 字节范围提示转换为分优先级、经合并且大小有界的传输工作,而不强制连续下载- 完整和部分完成、有界重试、稀疏可用性去重、请求统计和代际安全的取消,可支持 HTTP Range 和自定义传输管道
TPdfProgressiveDocument.RangeRequests自动接收文档、表单和页面提示,只提升会阻塞交互页面的精确字节
变更 (Changed)
CancelProgressiveLoad现在会在原生可用性和流拆除之前取消活动的范围工作,过期的传输完成会被安全忽略TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.69.0
Version 2.68.0
新增 (Added)
TPdfProgressiveDocument在远程或持续增长的随机访问流接收 PDFium 请求的字节范围期间,保持 PDFium 的可用性会话处于活动状态CheckDocumentAvailability、CheckFormAvailability和LoadAvailablePage返回合并的TPdfDownloadRange提示,使宿主只需获取打开和显示线性化页面所需的数据AvailableByteCount支持单调连续下载,而OnDataAvailable支持稀疏和乱序范围缓存
变更 (Changed)
- 线性化文件使用 PDFium 原生的渐进式文档、表单和页面门控;非线性化文件在完整文件就位后自动切换到原生自定义流加载器
TPdfStreamAdapter可以公开与当前存储字节不同的逻辑最终大小,同时保留显式的 4 GiBFPDF_FILEACCESS限制TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.68.0
Version 2.67.0
新增 (Added)
TPdfView.AllowFormEvents可关闭查看器转发到表单填充层的鼠标、键盘和焦点事件,适用于只读查看器或自行驱动表单交互的查看器- 关闭该开关后表单字段仍正常渲染:页面加载和关闭刻意保持不受门控,因为这些操作用于初始化表单层而不是响应输入
- 该开关与现有的
AllowUserPageChange和AllowUserTextSelection开关并列,默认值为 True,因此现有行为保持不变
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.67.0
Version 2.66.0
新增 (Added)
- 文档引发的命名动作(ISO 32000-1 §12.6.4.11)现在通过新的
OnNamedAction事件到达宿主;此前它们全部被丢弃 - 若不另行处理,四个标准导航名称 —
NextPage、PrevPage、FirstPage、LastPage— 会移动页面,在首页和末页处截断而不是循环 TPdf.PerformNamedAction允许应用程序直接触发相同行为,对没有库定义含义的名称返回 False
修复 (Fixed)
- 某个加密测试通过从
endstream向后扫描来测量流主体,偶尔会把密文字节误认为行终止符并报告间歇性失败;库本身始终是正确的
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.66.0
Version 2.65.0
新增 (Added)
BuildToUnicodeCMap生成 CID 字体所需的 ToUnicode CMap(ISO 32000-1 §9.10.3),使其文本可被复制、搜索并被辅助技术读取 — 缺少它时文本虽能正确渲染,但提取结果为空- 条目按规范设定的每块 100 条上限分块,重复字形只写入一次,并跳过
.notdef - 该 CMap 遵循 CID = GID 约定,因此无需伴随的
CIDToGIDMap流
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.65.0
Version 2.64.0
新增 (Added)
- 墨迹和图章注释通过自身的页面对象而非页面内容流进行绘制,这些对象现在可以被访问:
AnnotationObjectCount和AnnotationObjectInfo读取它们,AddPathToAnnotation将用CreatePath构建的路径交给注释,RemoveAnnotationObject可删除其中一个 - 构建图章外观不再需要外部工具:像往常一样创建路径,然后将其交给注释而不是页面
- PDFium 仅接受墨迹和图章子类型上的页面对象,因此任何其他子类型都会被拒绝并附带说明该限制的消息,而不是晦涩地失败
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.64.0
Version 2.63.0
新增 (Added)
TPdf.AddStandardFontText使用每个 PDF 阅读器都必须提供的 14 种标准字体之一绘制文本,完全不嵌入字体程序 — 与嵌入所找到系统字面的AddText相比,生成的文件明显更小- 新的
TPdfStandardFont枚举列出了全部 14 种字面,调用方不会再拼错基础字体名称;PDFium 会精确匹配这些名称,拼写错误将静默地得不到任何字体 - PDF/A 和 PDF/X 都要求嵌入所有字体,因此面向这些配置文件的输出应继续使用
AddText
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.63.0
Version 2.62.0
新增 (Added)
TPdf.TextObjectGlyphOutline以路径段的形式返回文本对象字体中某个字形的轮廓,可用于将文本转换为矢量图形,或检查可能被字体替换更改过的字形- 结果复用现有的
TPdfPathSegments类型,因此其读取方式与绘制的路径对象轮廓完全一致 - 坐标位于字体自身的设计空间中,并归一化为一个 em 等于 1.0;请求的字体大小不会对其缩放,需要设备单位的调用方应自行乘以磅值大小
- 空结果表示字体未公开该字形的轮廓,这并不是错误;对非文本对象请求字形会引发异常
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.62.0
Version 2.61.0
新增 (Added)
TPdf.InspectAvailability报告 PDFium 在不将 PDF 加载为文档的情况下能获知的信息:文件是否已线性化(“Web 优化”)、完整解析是否会成功、是否携带表单数据,以及查看器会首先显示哪一页- 新的
TPdfAvailability、TPdfLinearization和TPdfFormAvailability类型承载这些答案;流会被读取但不保留,其位置在返回时恢复 - 这填补了
FPDFAvail_*系列的最后一个空白,该系列此前虽已绑定并加载,但库中没有任何调用方 - Delphi、Lazarus 和 C++Builder 各自覆盖报告的事实、流位置保证以及对 nil 流的拒绝
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.61.0
Version 2.60.0
新增 (Added)
- 标记内容(ISO 32000-1 §14.6)现在可以从高层 API 访问:
PageObjectMarks读取页面对象上的每个 BDC 标签及其属性列表,AddPageObjectMark写入一个,RemovePageObjectMark删除一个,PageObjectMarkedContentID报告 MCID - 新的
TPdfContentMark、TPdfContentMarkParam和TPdfMarkParamKind类型承载标签名称及其类型化参数(整数、浮点、字符串、blob),值类型由 PDFium 解析确定,而不是根据哪个 getter 成功来猜测 - 添加标记会重建页面内容流,因此标签在保存后依然存在;这一点必须显式处理,因为
SaveAs本身不会重新生成内容 - Delphi、Lazarus 和 C++Builder 各携带六个用例,其中一个会展开已保存的内容流,以确认 BDC 运算符及其属性列表确实落盘
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.60.0
Version 2.59.0
新增 (Added)
TPdfAnnotation新增HasLinkUri和LinkUri,因此CreateAnnotation现在可以生成可用的 Web 链接:注释保存时带有指向给定地址的/URI动作- 在
anLink之外的任何子类型上设置链接 URI 都会引发异常,因为只有 Link 注释携带动作字典 - 该字段目前为只写;读回链接目标需要通过
FPDFLink_*系列,后者需要文档句柄 - Delphi、Lazarus 和 C++Builder 都会验证保存的字节携带
/URI动作和目标地址
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.59.0
Version 2.58.12
新增 (Added)
- 当页面同时携带
/TrimBox和/ArtBox时,PDF/X 验证会报告pvxiTrimBoxWithArtBox;两者都描述成品页面,RIP 无从得知哪一个才是权威(ISO 15930) - 当
/TrimBox或/BleedBox超出/MediaBox时(包括原点为负值的框),PDF/X 验证会报告pvxiPageBoxOutsideMediaBox;超出介质的框无法被成像 - 矩形在比较前会归一化,因此两种角点顺序均可接受,与介质边缘精确相接的框也能通过验证
- 预检报告将这两个问题归类到结构类别,并给出具体的补救措施
- Delphi、Lazarus 和 C++Builder 都覆盖两个被拒绝的情形和合规的情形
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.12
Version 2.58.11
新增 (Added)
- 当文档标记了 TOCI 条目却从未标记它们所属的 TOC 容器时,PDF/UA 验证会报告
pvuaiTociWithoutToc,这会使辅助技术在没有任何目录的情况下播报目录项(ISO 14289-1 §7.7) - 预检报告将该问题归类到结构类别,并建议用 TOC 元素包裹这些条目
- C++Builder 在 Delphi 和 Lazarus 用例之外,首次获得 PDF/UA 测试覆盖
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.11
Version 2.58.10
新增 (Added)
- 当符号 TrueType 字体携带
/Encoding条目时,PDF/A 验证会报告pvaiSymbolicTrueTypeEncoding;ISO 19005-1 §6.3.7 只允许字体内置的 cmap,/Encoding会与之矛盾 - 符号标志从
/FontDescriptor读取,无论它内联写在字体字典中还是被间接引用;非符号字体保留其必需的/WinAnsiEncoding或/MacRomanEncoding,不会被标记 - 预检报告将该问题归类到内容类别,并建议移除该条目
- Delphi 和 Lazarus 覆盖被标记的情形以及两个可接受的情形;C++Builder 覆盖被标记的情形和非符号情形
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.10
Version 2.58.9
新增 (Added)
- PDF/A 验证报告 ISO 19005-1 附录 C 的容器实现限制:超过 127 字节的名称报告
pvaiNameOverLimit,超过 8191 个元素报告pvaiArrayOverLimit,超过 4095 个条目报告pvaiDictOverLimit,嵌套超过 28 层报告pvaiNestingOverLimit - 这些限制为包含式,恰好等于限制值的容器仍能通过验证;测试固定了每个边界被拒绝和被接受两侧的行为
- 预检报告将这四个问题归类到结构类别,并在每条建议中说明具体限制值
- Delphi 和 Lazarus 覆盖全部四个限制以及边界情形;C++Builder 覆盖数组限制和边界
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.9
Version 2.58.8
新增 (Added)
- 当图像数量与页面数量不一致时,PDF/R 验证会报告
pvriPageImageMismatch;ISO 23504-1 §6.5.1 要求每页恰好为一幅条带图像,因此没有图像或有多幅图像的页面都不合规 - Delphi、Lazarus 和 C++Builder 测试覆盖没有图像的页面、有两幅图像的页面以及合规的单图像情形
变更 (Changed)
- PDF/R 标记注入测试现在从已携带条带图像的源页面开始,因为标记注入只添加元数据,无法提供页面内容
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.8
Version 2.58.7
新增 (Added)
- 当页面声明字体资源时,PDF/R 验证会报告
pvriFontForbidden;PDF/raster 页面只携带扫描图像,别无其他(ISO 23504-1 §6.5.2) - 对于白名单之外的条带编码,PDF/R 验证会报告
pvriForbiddenImageFilter,因此/LZWDecode、/RunLengthDecode、/ASCII85Decode、/ASCIIHexDecode、/JBIG2Decode和/Crypt会被拒绝,而/CCITTFaxDecode、/DCTDecode、/JPXDecode和/FlateDecode会通过(ISO 23504-1 §6.6) - 预检报告将这两个问题归类到内容类别,并给出具体的补救措施
- Delphi、Lazarus 和 C++Builder 测试覆盖字体资源、被拒绝的过滤器以及仅使用白名单编码的页面
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.7
Version 2.58.6
新增 (Added)
- 当文档显示使用了字体却没有携带嵌入的字体程序时,PDF/E 验证会报告
pveiFontNotEmbedded,因此该要求在免 DLL 路径和 PDFium 路径上都会被检查 - 工程图纸必须在数十年后仍能一模一样地渲染,因此 ISO 24517-1 不豁免任何标准 14 字体;该检查同等适用于
/Type1、/TrueType、/Type0和/MMType1 - 预检报告将新问题归类到内容类别,并建议嵌入所有字体程序
- Delphi、Lazarus 和 C++Builder 测试覆盖没有字体程序的描述符、嵌入的
/FontFile2以及完全不使用字体的文档
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.6
Version 2.58.5
新增 (Added)
InjectPdfEMarkers现在会写入 ISO 24517-1 §6.2 要求的输出意图:嵌入的 sRGB ICC 目标配置文件、引用该配置文件的/GTS_PDFE1输出意图以及 catalog/OutputIntents数组,全部作为同一增量更新的一部分- 配置文件流的
/N从 ICC 头部派生,而不是假定三个分量,因此 CMYK 配置文件也会被正确描述 - PDF/E 验证会报告
pveiMissingOutputIntent和pveiMissingIccProfile,未声明颜色条件的候选文件不再被接受 - Delphi、Lazarus 和 C++Builder 测试覆盖可接受的输出意图、缺少目标配置文件的输出意图以及完全没有输出意图的 catalog
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.5
Version 2.58.4
新增 (Added)
- PDF/X 验证现在通过字节扫描报告
pvxiFontNotEmbedded,因此未嵌入的字体在免 DLL 路径上也会被发现,而不再仅通过 PDFium 支撑的检查 - 与 PDF/A 不同,标准 14 字体在 PDF/X 中不获豁免,因此任何没有嵌入字体程序的字体使用都会被报告
- 该检查保持保守:只有当文件显示使用了字体却完全没有
/FontFile、/FontFile2或/FontFile3时才会触发,因为按描述符对程序计数会在共享描述符上产生误报 - Delphi、Lazarus 和 C++Builder 测试覆盖没有字体程序的描述符、嵌入的字体程序以及不使用字体的文档
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.4
Version 2.58.3
新增 (Added)
- 当 PDF/X-1a 候选文件携带
/DeviceRGB、/CalRGB或/Lab时,PDF/X 验证现在会报告pvxiColorSpaceForbidden,ISO 15930-1 §6.2 将这些颜色空间排除在其 CMYK 交换之外 - 该检查仅针对 PDF/X-1a 启用,因此 PDF/X-3 及更高版本仍允许 RGB 以及它们与输出意图搭配的设备无关空间
- 只测试含义明确的颜色空间名称令牌;
ICCBased流需要解析其/N,仍归属对象模型层处理 - Delphi、Lazarus 和 C++Builder 测试覆盖被标记的 RGB 空间、被标记的 Lab 空间、可接受的 CMYK 与灰度组合,以及 PDF/X-3 上的允许情形
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.3
Version 2.58.2
新增 (Added)
- 对于透明组或活动软掩码,PDF/X 验证现在会报告
pvxiTransparencyForbidden,ISO 15930-1 §6.2(PDF/X-1a)和 ISO 15930-3 §6.3(PDF/X-3)禁止这些元素 - 该检查依据检测到的合规级别启用,因此 PDF/X-4 和 PDF/X-6 仍允许透明度,而无法识别级别的文件绝不会因可能不适用的规则被标记
- 以
/SMask /None显式关闭的软掩码不会被视为透明度 PdfHasActiveSMask从FPdfPdfa移入FPdfPdfCommon接口,使每个验证器都能共享同一条软掩码规则- Delphi、Lazarus 和 C++Builder 测试覆盖 X-1a 上被标记的组、X-3 上被标记的软掩码、已禁用的软掩码以及 X-4 上的允许情形
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.2
Version 2.58.1
新增 (Added)
- PDF/X 验证现在检查 ISO 15930-7 §6.2.4 要求的输出意图形态:
pvxiOutputIntentScheme报告存在但不是/GTS_PDFX的子类型,pvxiOutputIntentMissingIdentifier报告缺失的/OutputConditionIdentifier - 子类型按完整名称令牌匹配,因此
/GTS_PDFXVersion这类更长的名称不再通过,而同一名称的#xx转义拼写仍然通过 - 完全不携带子类型的输出意图保持不变,因为其缺失已由标记级别的问题报告
- 预检报告将这两个问题归入输出意图类别,并给出修复建议
- Delphi、Lazarus 和 C++Builder 测试覆盖可接受的子类型、PDF/A 子类型、更长的名称令牌、缺失子类型以及缺失条件标识符
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.58.1
Version 2.58.0
变更 (Changed)
- PDFium 从其自身 C++ 栈帧调用的全部 35 个回调(表单填充、XFA、JavaScript 平台、渐进渲染暂停以及流读写)现在会捕获所有 Pascal 异常并返回文档规定的失败值,而不会跨越语言边界展开
- 因此,引发异常的事件处理程序、失败的内存分配或回调内部的意外错误,都不会再使进程崩溃或使 PDFium 处于未定义状态
修复 (Fixed)
- 注册表单定时器时,如果底层定时器无法创建,其条目会发生泄漏
新增 (Added)
- Delphi、Lazarus 和 C++Builder 测试现在覆盖向拒绝写入的目标流保存的场景,并断言文档在此之后仍处于可用且可保存的状态
Version 2.57.8
修复 (Fixed)
- 较早的 Delphi 版本(XE5 及更早)无法编译试用版库,在
FPdfPades.pas中报E2003 Undeclared identifier: 'GetTickCount64',因为这些编译器附带的 Windows 单元未导出该符号 - 同样的编译器还会在
PDFium.pas的GetUserDefaultLocaleName以及GetXfaFormPackets中TBytes到array of Byte的赋值上失败,现在 XFA 区域设置回调和数据包快照在这些编译器上也能构建
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.8
Version 2.57.7
变更 (Changed)
- 每次保存端重写现在会在写入前截断目标流,而不是仅仅回退位置,因此调用方提供的缓冲区即使先前保存过更长的文档,也不会在新
%%EOF之后残留过期的尾部数据 - Delphi、Lazarus 和 C++Builder 测试现已覆盖向预填充流的保存
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.7
Version 2.57.6
修复 (Fixed)
- 加密前的对象扫描此前接受任意长度的数字串,因此文件中任何位置的超长数值都可能回绕成负数或虚假的对象编号,并在重建的交叉引用表中添加幻影条目
- 超过 ISO 32000-1 附录 C 上限的对象编号以及超过 65535 的世代号现在会作为对象头被拒绝,而不是被截断
新增 (Added)
- Delphi、Lazarus 和 C++Builder 测试现在会断言重建表中确切的使用中条目数
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.6
Version 2.57.5
修复 (Fixed)
- 使用
EncryptMetadata = False加密时,Encrypt 字典中写入了/EncryptMetadata false,但文档元数据流仍被加密,遵循该声明的阅读器会读到无法解析的 XMP - 关闭元数据加密时,
/Type /Metadata流现在会原样复制,而其他所有流仍被加密
新增 (Added)
AnsiNameTokenMatchesKey现已成为FPdfPdfCommon接口的一部分,用于感知分隔符的名称比较- Delphi、Lazarus 和 C++Builder 测试现已覆盖两种元数据加密模式
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.5
Version 2.57.4
修复 (Fixed)
- 加密期间重建的交叉引用表漏掉了 ISO 32000-1 §7.5.4 强制要求的对象 0 空闲链表头,导致其第一个子节晚了一个对象才开始
- 此前重建的每个条目都声称世代号为 0;现在以更高世代号写入的对象会保留其世代号,使该表与其指向的对象头保持一致
新增 (Added)
- Delphi、Lazarus 和 C++Builder 测试现已覆盖重建表中的空闲链表头条目和世代号保留
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.4
Version 2.57.3
修复 (Fixed)
- 加密输出此前丢失了每个流对象的
stream关键字,导致保存的文件不再是有效的 PDF 语法,严格的阅读器会将页面内容报告为既不是流也不是流数组 /Length重写此前将/Length作为普通子串匹配,因此携带/Length1的流字典(任何嵌入字体)会损坏键名,而真实长度却保持过期值- 以
/Length N 0 R间接声明长度的流,其对象编号此前会被新长度覆盖;该条目现在会替换为直接的加密后长度 - 完全不带
/Length的流字典现在会补上一个长度,而不是让阅读器得不到长度信息
新增 (Added)
AnsiFindDictKeyToken现已成为FPdfPdfCommon接口的一部分,用于顶层的、感知分隔符的字典键查找- Delphi、Lazarus 和 C++Builder 测试现已覆盖
/Length1保留、间接长度替换以及流主体大小一致性
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.3
Version 2.57.2
修复 (Fixed)
- 使用
Revision = erR6的SaveAsEncrypted和SaveAsEncryptedToStream生成的文档大约每四个就有一个会拒绝自己的正确密码,原因是 ISO 32000-2 §7.6.4.3 算法 2.B 的轮数计数器起始值少了一轮,多出的那一轮改变了/U、/O、/UE和/OE的值 - R6 加密文档现在可以在任何合规阅读器中用用户密码或所有者密码重新打开,并且仍会拒绝错误密码
新增 (Added)
- Lazarus 和 C++Builder 测试套件获得了此前仅 Delphi 才有的加密覆盖:R6 密钥长度、Encrypt 字典字段、重复加密并重新打开的往返测试以及错误密码拒绝
变更 (Changed)
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.2
Version 2.57.1
变更 (Changed)
- 在表单字段中输入、移动插入符以及切换复选框时,现在只重绘 PDFium 报告为受损的区域,而不是整个查看器
- 受损矩形会针对向上为正的页面 Y 轴进行归一化,向外扩展一个像素以保持部件边框抗锯齿后的干净外观,并裁剪到可见的客户区
- 完全滚出视口的受损矩形不再调度重绘,而非活动视图或未映射页面仍回退到全量重绘
- Delphi、Lazarus 和 C++Builder 测试现已覆盖有界表单失效、翻转的页面矩形、屏幕外矩形以及非活动视图安全性
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.1
Version 2.57.0
新增 (Added)
TPdfThumbnailView.Orientation支持垂直和水平缩略图布局,同时保留现有的垂直默认值FirstVisiblePageIndex、LastVisiblePageIndex和EnsureCurrentPageVisible使用基于 1 的页码公开并控制缩略图视口
变更 (Changed)
- 修改
CurrentPageIndex现在会在任一方向上将所选缩略图滚动到可见区域 - Delphi、Lazarus 和 C++Builder 测试现已覆盖方向默认值、切换、可见范围以及所选页面的可见性
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.57.0
Version 2.56.2
变更 (Changed)
HighlightSearchText、AddSearchTextHighlight和ClearHighlight现在仅使新增或移除的搜索范围对应的设备矩形失效,而不再重绘整个查看器- 使用相同匹配替换高亮或追加重复匹配时,不再调度不必要的重绘
- Delphi、Lazarus 和 C++Builder 测试现已覆盖有界失效、幂等更新、清除以及非活动视图安全性
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.56.2
Version 2.56.1
变更 (Changed)
TPdfThumbnailView现在会为在多次重绘和相邻滚动位置中保持可见的页面重用已渲染的位图- 缓存仅保留当前可见页面范围,并在页面离开该范围、所分配的文档变更或缩略图尺寸变更时精确释放条目
- Delphi、Lazarus 和 C++Builder 测试现已覆盖缓存重用、视口裁剪、尺寸失效、文档替换以及组件销毁
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.56.1
Version 2.56.0
新增 (Added)
TPdfView.CutSelectedFormTextToClipboard和TPdfView.PasteFormTextFromClipboard为获得焦点的可编辑表单 widget 提供 Unicode 剪贴板编辑
变更 (Changed)
- 获得焦点的表单编辑器现在会在将文本输入转发给 PDFium 之前先处理标准的复制、剪切、粘贴和全选键盘快捷键
- 剪切和粘贴会拒绝只读字段以及没有表单填充或修改权限的会话,而剪切在移除所选文本之前会先成功复制
- Delphi、Lazarus 和 C++Builder 测试现已覆盖无焦点、快捷键往返以及只读拒绝行为
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.56.0
Version 2.55.0
新增 (Added)
TPdfView.AddSearchTextHighlight将另一个搜索词的唯一匹配追加到当前页面覆盖层,使多个查询可以同时保持高亮
变更 (Changed)
HighlightSearchText仍是替换入口点,现在共享加法式扫描器,重复的字符范围会被忽略,而ClearHighlight会移除完整的累积集合- Delphi、Lazarus 和 C++Builder 测试现已覆盖不同查询的累积和重复范围的抑制
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.55.0
Version 2.54.0
新增 (Added)
TPdf现已公开完整的页面对象快照、批量样式更新、仿射对象变换、路径段、裁剪路径以及 Form XObject 子对象- 字符检查现已包括填充和描边颜色、字体名称和标志、松散字形边界、有效矩阵、文本对象句柄以及字符到文本索引的转换
- 标注现在可往返边框几何结构以及 normal、rollover 和 down 外观流
- 新增的原始和解码缩略图访问器、页面内容与标注变换,以及
RenderPageWithMatrix提供了直接的进阶渲染和编辑路径
变更 (Changed)
- 页面对象样式变更可作为一个批次提交,从而使 PDFium 仅重新生成一次页面内容
- 当目标位图布局兼容时,矩阵渲染使用现有的零拷贝位图路径
Version 2.53.1
修复 (Fixed)
- 内置中文复制菜单标题现在使用与编码无关的 Unicode 码点,并在 Lazarus 构建中正确显示
- 较旧的 Delphi 工具链可在其
Winapi.Windows单元省略GetTickCount64声明时编译FPdfAsync
Version 2.53.0
新增 (Added)
- 新的
Tests.ApiCoverage测试装置覆盖了之前没有端到端测试覆盖的公开 TPdf API:GetPageBox/SetPageBox(MediaBox/CropBox 读写、缺失框错误以及保存往返)、FlattenPage/FlattenAllPages(返回值与页数保留)、GenerateFormAppearances(对非表单文档为空操作)、SaveAsEncrypted/SaveAsEncryptedToStream(带密码往返的 AES-256 — 验证加密文件在没有密码时拒绝打开,而在有密码时可以打开)、DeletePage边界校验(第 0 页和越界会引发EPdfError),以及 v2.38.0 中引入的HasContents/HasAuthor标注哨兵(验证Default(TPdfAnnotation)会将它们保留为False)
Version 2.52.0
新增 (Added)
TPdfView.CopySelectedFormTextToClipboard将获得焦点的 AcroForm widget 内的文本选择以CF_UNICODETEXT形式复制到 Windows 剪贴板
变更 (Changed)
- 页面文本和获得焦点的表单复制操作现在共享同一个防御性 Unicode 剪贴板写入器,并在选择为空时保持剪贴板不变
- Delphi、Lazarus 和 C++Builder 测试现已覆盖非活动或未获得焦点的表单复制调用,以及通过 Windows 剪贴板进行的获得焦点表单选择往返
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.52.0
Version 2.51.0
新增 (Added)
TPdfView.SelectLineAt选择包含基于 1 的页码和基于 0 的字符索引的可视文本行,无需鼠标输入
变更 (Changed)
- 程序化行选择、三击选择,以及
Shift+Home或Shift+End现在共享一个字符框行边界模型 - Delphi、Lazarus 和 C++Builder 测试现已覆盖稳定的行选择以及无效的页码或字符索引
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.51.0
Version 2.50.0
新增 (Added)
TPdf.LoadDocument现在接受基于 0 的Index和Count窗口来访问TBytes缓冲区,使嵌入式 PDF 无需分配临时字节数组切片即可加载
变更 (Changed)
- 字节范围加载在更改文档状态之前会拒绝负数或越界的窗口,并保留现有的缓冲和借用缓冲区生命周期选项
- Delphi、Lazarus 和 C++Builder 测试现已覆盖嵌入式 PDF 窗口以及无效的字节范围参数
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.50.0
Version 2.49.1
新增 (Added)
TPdfView.FitMode现已支持pfmFitHeight,可将当前页面适配到可见视口高度,并在需要时允许水平滚动
修复 (Fixed)
- 适配模式现在在滚动条可见性改变客户区后会收敛,使 fit-page、fit-width 和 fit-height 结果在 VCL 与 LCL 之间保持一致
- Delphi、Lazarus 和 C++Builder 查看器测试现已覆盖
pfmFitHeight选择与枚举往返 TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.49.1
Version 2.49.0
新增 (Added)
- PDFium 公开绑定层面现已覆盖所审阅头文件中的全部 470 个导出函数,包括通过
FPDFAttachment_SetDescription和FPDFAttachment_GetDescription访问附件描述 TPdf现可暴露附件描述、交叉引用有效性、trailer 结束偏移、security-handler 修订版本、64 位内存加载、签名字节范围、web 链接文本范围,以及扩展的图像数据、滤镜、元数据和 ICC 配置快照- 表单助手现已支持原生字段焦点、聚焦选项的查询与更新、鼠标滚轮转发、可写墨迹笔划,以及渐进式渲染后的表单覆盖层
变更 (Changed)
FormFieldCount、表单字段索引和 Tab 键顺序现在仅描述 widget 标注,而不再包含无关的页面标注- 无界面
TPdf页面现在会进入并离开表单填充页面生命周期,使原生焦点和聚焦字段 API 无需TPdfView即可工作 - 附件描述导出受能力限制,因此使用旧版 PDFium 构建的应用仍可加载库并检测不可用的功能
修复 (Fixed)
- 启用表单填充时,渐进式页面渲染现在会绘制表单控件
- Delphi、Lazarus 和 C++Builder 测试现已覆盖新的文档诊断、附件描述、墨迹路径、表单行为、签名字节范围、web 链接范围和图像元数据
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.49.0
Version 2.48.0
新增 (Added)
TPdfMatrix现可暴露工厂方法、克隆与赋值、有限状态与可逆性诊断、基于容差的比较、平移访问、行列式报告和仿射分解- 前缀组合、感知枢轴的旋转、缩放、倾斜和翻转,加上 stretch、contain 和 cover 矩形映射,支持局部空间和适配布局工作流,无需手动系数运算
- 非修改性逆向访问、逆向点映射、向量与四边形变换、动态点和矩形批次、原地变体和单遍变换边界扩展了可复用的几何层面
变更 (Changed)
- 平移、缩放和轴翻转现在仅更新受影响的系数,而不再通过通用仿射乘法路由
- 矩形变换对其输入进行一次性归一化,在可能时使用专门的精确轴对齐路径,并在没有临时点记录的情况下计算通用旋转边界
- 点和矩形批次变换分配一个结果数组或复用调用方存储,而变换后的点边界在一次遍历中累积,无需中间数组
修复 (Fixed)
- 矩形映射在发布不可用矩阵之前会拒绝零大小、非有限和
Single溢出的结果 - Delphi、Lazarus 和 C++Builder 测试现在验证组合顺序、枢轴不变量、逆向往返、适配矩形、分解和批量几何行为
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.48.0
Version 2.47.0
新增 (Added)
FPdfAsync现可通过保留原始 API 的扩展接口提供结构化取消原因和消息、可移除回调注册、基于超时的源、取消等待和原子 try-cancel 操作TPdfFuture<T>.RunEx增加可配置的回复分派和工作线程优先级,同时结果封装暴露操作 ID、值有效性、异常类名、完成计时和可复用的完成助手TPdfAsyncExecutor增加可复用的固定工作线程池,带有四条 FIFO 优先级通道、可选的有界队列背压、可取消任务句柄、超时感知等待、任务快照、聚合统计和优雅关闭
变更 (Changed)
- 重复的异步作业可复用工作线程和 O(1) 队列操作,而无需为每个任务创建线程,同时同步完成仍可用于 UI 宿主
- 执行器和 future 失败保留异常类和消息诊断,取消保留其原始原因,回调异常与工作线程生命周期和关闭保持隔离
- Delphi、Lazarus 和 C++Builder 测试现已覆盖扩展的取消、future 元数据、任务控制、背压、优先级排序、统计、失败和关闭层面
修复 (Fixed)
- 并发取消所有者现在会收到确定性的首个写入者结果,而不再依赖单独的观察和取消序列
- 主线程空闲等待处理同步任务回复,防止已完成的工作线程在协调关闭期间让执行器永久处于非空闲状态
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.47.0
Version 2.46.0
新增 (Added)
FPdfAsn1现可暴露标识符类、64 位高标签号编码与解码、已解析的 TLV 记录、零拷贝子读取器窗口、类型化原语解码器,以及内容或已编码值的切片- DER 写入器现支持完整的无符号 64 位 INTEGER 范围、已校验的任意 INTEGER 内容、ENUMERATED、自动 UTCTime 或 GeneralizedTime 选择、application 和 private 标签、多值 SEQUENCE,以及规范排序的 SET OF 输出
ValidateDer返回感知偏移的校验错误,同时强制执行可配置的嵌套、节点计数、内容长度、错误计数、root 和可选的 SET 排序限制
变更 (Changed)
- DER 拼接和多值组合使用一次输出分配,写入器缓冲区暴露 reserve、count、capacity 和所有权转移操作,SET OF 排序现在使用
O(n log n)归并排序 - BOOLEAN、INTEGER、BIT STRING、OBJECT IDENTIFIER、NULL、UTF8String、PrintableString、IA5String、UTCTime 和 GeneralizedTime 值在编码、类型化解码或校验期间接受规范格式检查
- Lazarus 运行时包现在导出
FPdfAsn1,Delphi、Lazarus 和 C++Builder 测试套件演练相同的公开 DER 层面
修复 (Fixed)
- 大于 30 的 context-specific 标签号不再被截断到标识符的低五位
- 格式错误的高标签标识符、非最小定长长度、无效 UTF-8、非零 BIT STRING 填充、无效时间字段、尾部 root 和资源限制违规会被确定性拒绝
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.46.0
Version 2.45.0
新增 (Added)
FPdfPreflightReport现为每个问题分配 Info、Warning 或 Error 严重性,并暴露按标准和报告级别的严重性、状态、类别、issue-code、lookup、search、flattening 和 filtering API- 预检报告现通过匹配的
To*和Save*ToFile方法导出 SARIF 2.1.0、JUnit XML、NDJSON 和原生 XML,适用于 CI、自动化和流式管道 - 稳定的 SHA-256 报告指纹独立于源路径和生成时间戳标识等效的校验结果
变更 (Changed)
- JSON、CSV、text、Markdown 和 HTML 报告现包含严重性和扩展的状态摘要;HTML 增加可访问的表格标题和状态摘要
- Issue 和标准集合构造使用几何容量增长,查询结果预分配大小,JSON 转义写入一个有界输出缓冲区,所有报告文件使用一个直接 UTF-8 写入器
- Issue 类别摘要使用确定性排序,时间戳包含毫秒,JSON 携带
formatVersion: 2,CSV 单元格中和电子表格公式
修复 (Fixed)
- JSON 导出现在保留有效的补充 Unicode 对,并替换孤立的 UTF-16 代理代码单元,而不是发出格式错误的标量数据
- HTML 导出现在转义撇号,过滤后的报告视图拥有独立的 issue 数组,而不是共享可变的结果存储
TPdf.AboutInfo、Lazarus 包元数据和安装器元数据现在统一报告 Version 2.45.0
Version 2.44.0
新增 (Added)
- 书签与目标现在暴露打开状态、后代数量、动作目标、目标视图模式,以及最多四个视图参数
Metadata、GrantedPermissions、UserGrantedPermissions、HasPermission与UserHasPermission提供类型化的文档检视快照和权限查询ExtractThumbnail(PageNumber)在不改变活动页的情况下渲染指定页面,RFC 3161 时间戳结果暴露策略、生成时间和 nonce 细节
变更 (Changed)
- 书签、JavaScript、元数据、目标与缩略图路径改用经过校验的两遍缓冲区、几何式集合增长与防环遍历
- 保存后处理通过当前 xref 修订解析活动目录、页面树与打开动作,缓存已解码的对象流,并按词法边界扫描 PDF 字典
- 共享 PDF 解析现在强制精确的对象头、代数、字典键、流长度、预测器几何形状、整数范围,以及注释、字面字符串和十六进制字符串的边界
- RFC 3161 响应校验现在同时绑定 nonce 与 SHA-256
messageImprint,要求结构合法的签名者,并应用严格的 DER 长度、OID、INTEGER 与 GeneralizedTime 规则
修复 (Fixed)
- 增量文档在添加默认打开动作时不再选择非活动的重复目录或畸形的引用后缀
- 带有长形式 DER 长度的时间戳令牌保留完整的编码令牌,同时拒绝畸形的 CMS 可选字段顺序和空的签名者集合
- 干净的 Delphi 构建现在通过按对齐安全的字节复制写入 PAdES nonce 种子字段,并以精确的原生指针类型传递 XFA 响应字节
TPdf.AboutInfo、Lazarus 包元数据与安装器元数据现在一致地报告 Version 2.44.0
Version 2.43.0
新增 (Added)
- XFDF 字段和标注记录现在暴露存在性标志,可区分省略的 XML 值与显式空值
变更 (Changed)
- XFDF 导入接受带命名空间前缀的元素和属性、混合的文本与 CDATA 内容、实体引用以及空白敏感的值,同时拒绝非法的 Unicode 标量引用
- XFDF 导入和导出改用索引化字段匹配和有界几何缓冲区,改善了深度嵌套表单、大型标注集合、墨迹列表、顶点与标记四边形场景下的吞吐量和峰值分配行为
- PDF/A 与 PDF/UA 校验对大型页面、流、结构名和 RoleMap 集合使用有界增长;PDF/UA RoleMap 解析现在遵循直接数组以及精确代数的间接名称或数组对象
修复 (Fixed)
- XFDF 往返现在保留深度嵌套的字段路径、显式空字段值、显式空标注内容,以及缺失与空内容之间的区分
- 非法的内存缓冲区加载和越界页面赋值在不遗留部分文档或页面状态的情况下被拒绝,原生页面重载失败时保留先前活动页面
- 大型标记内容标识符和签名元数据缓冲区在分配或原生访问之前接受边界检查和校验
Version 2.42.0
新增 (Added)
TPdfMatrix现在提供Invert、TryInvert、TransformPoint与TransformRect,用于坐标映射、命中测试、归一化边界和显式的奇异矩阵处理TPdf.WrapText新增BreakLongWords重载,可拆分 CJK 和其他无空格文本,同时保持合法的 UTF-16 代理对完整TPdfAnnotation.AttachmentPointSets暴露多行标记标注中的每个四边形,而现有的AttachmentPoints字段仍作为第一组的别名
变更 (Changed)
- 文本提取、可读内容构造、单词查找和朗读文本偏移映射现在使用有界分配和二分查找路径,减少了大型页面上重复分配和线性扫描
- ASN.1 序列化和加密 PDF 生成现在使用几何式输出缓冲区;加密对象排序使用
O(n log n)排序,xref 行直接写入最终缓冲区 WrapText保留 CR、LF 与 CRLF 行边界,并为整个操作复用单个原生测量对象- XFDF 导入和导出保留每个标记四边形;导入还会应用 RGB/内部颜色,并独立于进程区域设置解析十进制坐标
修复 (Fixed)
- 旧版调用方现在可以再次通过赋值非空字符串来更新标注内容和作者,无需设置较新的
HasContents和HasAuthor哨兵 - 显式空标注字符串现在使用合法的零终止原生缓冲区,因此清除
/Contents、/T等可选文本键不再向 PDFium 传递 nil 指针
Version 2.41.0
变更 (Changed)
- Delphi 上的预检报告
SaveJsonToFile、SaveMarkdownToFile和SaveTextToFile现在写入 UTF-8(与现有的SaveHtmlToFile一致),而不是系统 ANSI 代码页;此前通过这些方法保存时,文件路径、建议和范围说明中的非 ASCII 字符在 Delphi 上会出现乱码 SaveCsvToFile现在写入带有 BOM 前缀的 UTF-8,以便 Excel for Windows 自动检测编码;如果没有 BOM,Excel 会将 UTF-8 CSV 视为代码页 1252 并损坏任何非 ASCII 字符
修复 (Fixed)
- 当窗体关闭且未显式清除缓存的
TBitmap对象时,ExtractImages示例在FExtractedImages中会发生泄漏;现在窗体通过重写Destroy并调用ClearExtractedImages来释放所有缓存的位图
Version 2.40.0
变更 (Changed)
TPdf.RenderPage(HDC, ...)现在在FPDF_RenderPage调用周围屏蔽 FPU/SSE 异常,这与TPdfView.RenderPage(HDC)(在 v2.25.0 中已修复)以及每个返回位图的渲染入口点一致;此前的TPdf级别 direct-to-DC 重载在 D12 之前的编译器上使 FPU 异常保持未屏蔽状态
修复 (Fixed)
ColorToARGB现在为clNone和clDefault返回完全透明的像素(alpha 0),而不是将这些哨兵值视为字面 RGB 颜色;此前当调用者传入clNone并预期“无颜色”时会产生一个深色且几乎不透明的填充
Version 2.39.1
修复 (Fixed)
- 显式保存为 PDF 1.3 时现在会移除仅重复初始图形状态的
/SMask /None、/AIS false和/TK true条目,同时继续拒绝非默认透明度状态
Version 2.39.0
变更 (Changed)
CreatePDF和ImageToPDF现在使用确认的保存目标,且仅在SaveAs成功完成时才报告成功BatchExport、PDFtoJpg和SplitPDF现在分配唯一的输出目录,以便重复运行和同名输入可以保留先前的结果SplitView现在会在取消或无匹配后循环搜索一次而不留下隐藏的页面状态,并且会中止未完成的打印任务,而不是提交部分输出
修复 (Fixed)
MergePDF现在拒绝格式错误的页面范围标记和会覆盖源文件的输出路径,统计实际导入的页面,并拒绝保存空结果- Delphi 和 C++Builder 的
Attachment示例现在通过具有回滚安全性的文件替换来提交同路径保存,从而避免重命名失败导致原始 PDF 被删除
Version 2.38.0
变更 (Changed)
SetAnnotationData现在在TPdfAnnotation的/Contents和/Author写入上由HasContents/HasAuthor哨兵守护,这与现有的HasName/HasSubject/HasIcon模式一致;此前这两个字段被无条件写入,因此分配Default(TPdfAnnotation)记录来仅更新颜色或标志时会静默用空字符串覆盖批注的现有内容和作者;现在GetPageAnnotation会设置这些哨兵,以便“读-改-写”循环可以保留原始值
修复 (Fixed)
GenerateFormAppearances现在通过FPDFAnnot_GetFormFieldValue(根据 ISO 32000-1 §12.7.5,该函数会寻址到父字段字典)读取复选框/单选按钮的值,而不是通过FPDFAnnot_GetStringValue(Annot, 'V', ...)(读取小部件字典);小部件通常不包含/V,导致/AS无法同步到选中状态,且扁平化的复选框/单选按钮会被渲染为未选中状态
Version 2.37.0
变更 (Changed)
ParseTsaUrl现在在解析后将端口限制在1..65535;否则超大端口值会通过DWORD截断发生溢出,并可能落入有效端口范围内- XFDF
ParseField现在接受一个深度参数(默认 0,上限 64),并在达到限制时返回空字段,因此恶意嵌套的 100 000 层深<field>链不再会导致栈溢出
修复 (Fixed)
- 在将
@ReqDer[0]传给WinHttpSendRequest之前,TSA HTTP 请求现在会防护空请求体;零长度动态数组的解引用将访问未指向有效内存的指针;虽然BuildTimeStampReq始终返回非空 SEQUENCE,但调用处现在会维护此规范
备注 (Notes)
- 关于 HTTPS 吊销检查的
FPdfTsaWin头部注释已修正:WinHttp 默认验证服务器证书链,但不会执行 CRL/OCSP 吊销检查,除非通过WinHttpSetOption显式启用;此前的措辞声称吊销检查“是免费提供的”,这具有误导性
Version 2.36.0
变更 (Changed)
- 除了
Content-Type和Accept头部之外,TSA HTTP 请求现在还会发送显式的Content-Length头部;WinHttp 会根据总长度合成它,但某些 RFC 3161 代理需要显式头部,否则会拒绝请求并返回411 Length Required错误 - XFDF 导出现在会丢弃 C0 控制字符(已被转义的 TAB/LF/CR 除外),而不是发出无效的反斜杠十六进制序列;此前的
\-01F转义并不是有效的 XML(反斜杠在 XML 中没有特殊含义),因此任何符合规范的读取器都会将其作为格式错误文档而拒绝 - 当调用者提供
TAssociateFile.MIMEType时,InjectAssociatedFiles现在会在 EmbeddedFile 流字典中写入/Subtype;该字段虽已声明并记录在文档中,但此前注入器硬编码了/Type /EmbeddedFile并将其忽略(ISO 32000-2 §7.11.4 允许在流中使用/Subtype)
修复 (Fixed)
- XFDF 导入此前会跳过 UTF-8 BOM 后的第一个内容字节,以及在没有 BOM 时跳过第一个字节:由于
BytesToAnsi接受基于 0 的数组索引,BytesToAnsi(Bytes, 4, ...)(有 BOM)和BytesToAnsi(Bytes, 1, ...)(无 BOM)使用了偏差 1 的起始偏移量;现在调用已修改为使用3和0 ExtractSignatureValue曾有两处悬空if缩进问题,导致R.Position:= CN在可选的certificates [0]和signedAttrs [0]分支中无条件运行;现在这些分支已封装在begin/end中,因此仅在实际读取可选 TLV 时才会推进位置(与 v2.22.0 中AddSignatureTimestampToCms所修复的属于同类问题)
Version 2.35.0
变更 (Changed)
TFPDFAvail_IsDocAvail、TFPDFAvail_IsPageAvail和TFPDFAvail_IsFormAvail现在接受hints: PFX_DOWNLOADHINTS,而不是var hints: FX_DOWNLOADHINTS,因此可从 Delphi 访问已记录的nullptr仅查询模式(检查当前可用性而不请求更多数据);PDFium 头文件明确允许hints为空,此前的var绑定使其无法实现TFPDF_SetSystemFontInfo现在接受pFontInfo: PFPDF_SYSFONTINFO,而不是var pFontInfo: FPDF_SYSFONTINFO,因此调用者可以传入nil来告知 PDFium 停止使用先前注册的系统字体接口(已记录的禁用路径)TPdfThumbnailView.Paint现在使用与UpdateScrollBarRange相同的公式(ClientHeight div RowHeight)计算VisibleRows,从而使渲染的行数与滚动条的页面大小一致;此前仅用于绘制的公式((ClientHeight - FMarginY) div RowHeight + 1)在临界高度处可能相差一行,导致在页外行上浪费一次渲染,或者遗漏最后一行可见行
Version 2.34.0
新增 (Added)
TPdf.SaveAsEncrypted/SaveAsEncryptedToStream—— 用于保存文档并使用 PDF 2.0 AES-256-CBC (V=5/R=5/R=6) 对其进行加密的高级 API;接受带有用户/所有者密码、权限和修订版本的TPdfEncryptOptions;委托给EncryptDocumentBytes- StrF 字面字符串加密:
EncryptDocumentBytes现在将非流对象(Info 字典等)中的(...)字面字符串加密为 AES-256-CBC 十六进制字符串,这与流加密格式(16字节 IV + PKCS7 密文)相匹配;十六进制字符串<...>保持不变
Version 2.33.0
新增 (Added)
FPdfEncrypt.pas中的全文档 AES-256-CBC 加密注入器;EncryptDocumentBytes接受明文 PDF 和密码,加密每个间接流对象(在文件密钥下采用 16字节 IV + AES-256-CBC PKCS7),修正/Length,追加/Encrypt字典对象,并利用/Encrypt和/ID重建完整的经典交叉引用表和文件尾;完善了 PDF 2.0 加密栈(AES 块 + GCM + SHA-512/384 + R6 密钥派生 + 字典 + 文档扫描)EncryptStreamPayload辅助函数 —— PDF 2.0 AES-256 流格式(IV 置于 AES-CBC-PKCS7 密文前),可供自行管理对象布局的调用者重复使用
Version 2.32.0
新增 (Added)
- 新单元
FPdfSha512.pas提供纯 Pascal 实现的 SHA-512 / SHA-384 哈希 (FIPS 180-4);PDF 2.0 R6 密码哈希迭代需要此实现,每轮根据 128 位值模 3 的结果选择 SHA-256/384/512;已通过 FIPS-180-4 B.1 已知答案验证 - 新单元
FPdfEncrypt.pas提供使用 TBytes 的 PDF 2.0 加密密钥派生和 Encrypt 字典构建器;实现 ISO 32000-2 §7.6.4.3 算法 2.B,通过 AES-128-CBC 和迭代选择 SHA-256/384/512 完成 R6 哈希计算,派生 32 字节文件加密密钥以及/O、/U、/OE、/UE和/Perms条目,并构建包含/CFM /AESV3的 V=5/R=5/R=6 Encrypt 字典
Version 2.31.0
新增 (Added)
- 新单元
FPdfAes.pas提供 AES 分组密码基元 (FIPS 197),包括纯 Pascal 实现的 AES-128 和 AES-256 分组密码、CBC 模式辅助函数及 CSPRNG 后端;已通过 FIPS-197 Appendix C.2 / C.3 已知答案测试验证正确性;这是 PDF 2.0 加密栈的密码学基础 - 新的
FPdfAesGcm.pas单元中的 AES-GCM 身份验证加密 (NIST SP 800-38D);在 AES 分组基元之上实现了 GHASH(GF(2^128) 乘法)、GCTR 和 GCM AEAD 结构;NIST GCM 测试用例 1 和 3 (AES-128) 与权威密文和标签完全匹配;测试用例 13 (AES-256) 成功完成往返测试;GCM 是 PDF 2.0 的 ISO/TS 32003 模式 - PDF/A 级别 A 的 ParentTree 和 ClassMap 完整性校验(ISO 19005-1 §6.8.3);对于缺少 /ParentTree 数字树的 StructTreeRoot 标记
pvaiParentTreeMissing;对于没有 /ClassMap 的 /C 类引用标记pvaiClassMapUnresolved
Version 2.30.0
新增 (Added)
- 关联文件注入(
InjectAssociateFiles/TPdf.SaveAsWithAssociateFiles,ISO 32000-2 §7.11.4);新的FPdfAssocFiles单元向编目或任何页面字典附加文件规范引用的/AF数组,涵盖了所有八种 ISO 32000-2 表 45 中的/AFRelationship值;重用了经过InjectPadesDssMarkers验证的增量更新模式 - 支持 PDF/X-6 (ISO 15930-9:2020);
TPdfXConformance新增了pxc6;注入器和验证器将其贯穿pdfxid:GTS_PDFXVersion标识;PDF/X-6 是基于 PDF 2.0 的 PDF/X-4 替代者,用于完整交换 - PDF/A 禁用
/Thread动作(ISO 19005-1 §6.6.1 白名单缺口);被禁用的动作列表现在除了 Launch、ResetForm、ImportData、SetOCGState、SetState、GoTo3DView、Rendition 和 Hide 之外,还涵盖了 Thread
修复 (Fixed)
- PDF/A-4e 校验路径现在遵循与级别 A 相同的标记结构、MarkInfo 和分词检查;v2.29.0 保存端的降级处理涵盖了
PdfAIsLevelE,但有三个ValidatePdfACompliance关卡仅检查了PdfAIsLevelA,导致缺少标记结构的 PDF/A-4e 文档静默通过 - OCG
/BaseState测试偏差:v2.28.0 PostProcess 传递正确地将接受范围扩大到/ON或/OFF(ISO 32000-1 表 8.70 允许两者),但 Delphi 和 C++ 测试仍预期/OFF被拒绝;现在测试使用一个真正无效的值(/Undefined),并通过一个新的正向测试锁定了对/OFF的接受 - 地理空间
/Subtype /GEO过度匹配:ContainsDictionarySubtype('GEO')会匹配任何携带该标记的字典,包括像无关的/ViewerPreferences << /Subtype /GEO >>;新的ContainsMeasureDictionarySubtype额外要求/Type /Measure或 Measure 专有的兄弟键,因此非 Measure 字典不再触发 ADBE ExtensionLevel 3 的要求
Version 2.29.0
新增 (Added)
- 在验证器、XMP 注入器和 Pdfium 对象模型层中全面支持 PDF/A-4 (ISO 19005-4:2020);
TPdfAConformance新增了pac4base、pac4f和pac4e;基础级别是 PDF 2.0 (ISO 32000-2),并将旧的 A/B/U 级别替换为 base + F (表单) + E (辅助功能);ValidatePdfA读取pdfaid:part=4的 XMP 数据包(base 忽略了符合性元素),SaveAsPdfA发出它,且SignPadesWithPdfA接受pac4base作为长期归档容器 FPDFBookmark_GetColor绑定 —— 最后一个未绑定的 PDFium 公开导出(469/469);TBookmark增加了从书签/C数组(ISO 32000-1 §12.3.3)填充的HasColor和Color字段;此绑定使用容错加载,因此在该导出出现之前的旧 DLL 仍能继续工作- PDF/E-1 (ISO 24517-1 §5) 头部版本检查
pveiBadPdfVersion—— PDF/E-1 基于 PDF 1.6,现在非 1.6 的头部会被标记 - PDF/R-1 (ISO 23504-1)
pvriEncryptVersionMismatch—— 仅允许在%PDF-2.0头部进行加密;携带/Encrypt的 1.x 实体现在会被标记(此前是无操作声明) - PDF/R-1
pvriBadMediaBox—— 每个页面的MediaBox应为[0 0 w h];PdfRHasNonZeroMediaBoxOrigin是一个独立于区域设置的 ASCII 扫描器,用于跳过间接引用的 MediaBox - PDF/A 级别 A
pvaiRoleMapUnresolved(ISO 19005-1 §6.8.3.4) —— 存在但不完整的 RoleMap(导致自定义/S结构类型未被映射)现在会被标记,填补了现有仅检查是否存在的pvaiRoleMapMissing留下的漏洞
修复 (Fixed)
PdfVersionToName(20)返回了"1.0"而不是"2.0",导致每次保存 PDF 2.0 时目录/Version条目和验证器消息损坏;对于版本代码>= 20,格式化程序现在会显式分割主版本号和次版本号FPdfAsn1.pas负数-INTEGER 编码器在 Delphi 12 下编译失败(在Integer(-(V<0))上报告E2015),导致整个测试项目受阻;已修复,现针对符号扩展掩码使用Int64(-Ord(V<0))- PDF/A 禁用注释列表现在在所有部分中都包含
/RichMedia(此前遗漏;ISO 32000-1 §12.5.6.35 在 PDF/A 中禁止它)
Version 2.28.0
新增 (Added)
TPdfVersion现在包含用于 PDF 2.0 (ISO 32000-2) 的pv20;DecodePdfVersion(20)返回pv20而不是pvUnknown,并且EncodePdfVersion(pv20)发出 20,因此 PDF 2.0 文档的版本在重新读取时不会丢失且可以显式写入
变更 (Changed)
- 根据 PDF Reference 3.8.3,
DecodeDate现在可以解析带有可选尾部字段的 PDF 日期字符串,而不是要求完整的 23字符D:YYYYMMDDHHmmSSOHH'mm'格式;符合规范的截断日期(如D:20260712、D:20260712153000和D:20260712153000Z)现在已被接受;此前它们被硬性的Length=23关卡所拒绝;时区小时偏移量现在根据实际的 UTC-12..UTC+14 范围进行验证,而不是> 23 FPdfMeasure.MeasureText现在将字体名称编码为 FPCAnsiString/ DelphiUTF8Encode,这与库的其他 FPDF_BYTESTRING 调用位置相匹配,而不是使用裸的AnsiString强制转换(这会使非 ASCII 字体族名称在当前代码页下出现乱码)
修复 (Fixed)
TDerWriter.Integer负值路径崩溃或产生畸形的 DER:循环while V <> -1 do V := V shr 8使得在Value = -1时Inner留空(从而在后续的Inner[Length(Inner)-1]上导致范围错误),并且对其他负数产生多余的字节;编码器现在提取带有符号扩展移位的补码字节,并在余数纯粹是符号扩展时正确停止;CMS/PAdES INTEGER 字段为正数,因此这仅影响传入负值的调用者,但该路径现在已正确TPdf.GetCharacterOrigin和TPdfView.GetCharacterOrigin忽略了FPDFText_GetCharOrigin的返回值,并在失败时返回未初始化的点;现在该结果被初始化为零,并且失败的读取会返回原点(符合GetCharacterRectangle的约定)
Version 2.27.0
变更 (Changed)
- Delphi、C++Builder 和 Lazarus 的
PDFViewer与MultiPageViewer示例现在会对文档搜索进行循环,使用Enter和F3查找下一个结果,在匹配选项变化时重置搜索上下文,并将Esc保留用于取消活动搜索或打印任务 - 查看器打印现在遵循当前查看器旋转,并相应选择纵向或横向输出,因此工具栏旋转会反映到打印页面
- 三个
ViewerInteractionLab示例现在都支持Ctrl+A、Ctrl+C、Enter、F3和Esc快捷键,同时不会拦截原生编辑控件的选择和复制命令
修复 (Fixed)
- C++Builder 和 Lazarus 查看器取消打印现在会中止打印机任务,而不是提交取消前已渲染的页面,Lazarus 还会显式退出每个嵌套的副本、页面和排序循环
- Delphi
MultiPageViewer的取消按钮现在已连接到其处理程序,C++Builder/LazarusMultiPageViewer搜索字段保留原生箭头、Home 和 End 键编辑
Version 2.26.0
变更 (Changed)
TPdf.GetObjectBitmap、TPdf.GetBitmap、TPdf.GetThumbnail及其TPdfView对应方法现在会在FPDFImageObj_GetBitmap/FPDFPage_GetThumbnailAsBitmap调用周围获取渲染锁,与RenderPage/RenderTile一致。这些是 PDFium 渲染侧调用,以前未加锁,可能与同一文档上的并发UnloadPage/ReloadPage竞争TPdf.RenderPageThumbnail现在遵循页面/Rotate条目:对于/Rotate 90或270页面,会根据旋转后的尺寸重新计算适配,使缩略图宽高比与查看器显示一致,而不是使用FPDF_GetPageSizeByIndex返回的固有未旋转尺寸
修复 (Fixed)
TPdfView.GetCharacterRectangle忽略了FPDFText_GetCharBox的返回值,在 PDFium 报告失败时将未初始化的TPdfRectangle传给PageToDevice。现在矩形会初始化为零,失败的GetCharBox返回Rect(0,0,0,0)GetLinkAnnotations的 URI 路径和文件路径缓冲区长度差一:第二次FPDFAction_GetURIPath/GetFilePath调用将包含末尾 NUL 的size作为分配为size-1的缓冲区长度。在 PDFium 未自行限制的构建中可能越界写入,现在改为传递size-1
Version 2.25.0
变更 (Changed)
TPdf.AddText、SetText、AddPath和InsertFormObjectFromXObject现在会在重新生成页面内容前使缓存的文本页和链接注释失效,与SetTextPositions和RemoveObject一致。此前编辑页面后调用GetText/GetWebLinks/FindFirst会返回编辑前捕获的过期文本和链接数据,保留的FPDF_TEXTPAGE句柄还会在内容重新生成后被使用并产生未定义行为TPdfView.RenderPage(HDC, ...)现在获取渲染锁,并在FPDF_RenderPage调用周围屏蔽 FPU/SSE 异常,与其他所有渲染入口一致。以前直接到 DC 的重载可能与同一文档上的并发UnloadPage/ReloadPage竞争,并在 D12 之前的编译器上留下未屏蔽的 FPU 异常- Delphi
PrintPDF示例现在在取消时调用Printer.Abort,而不是让finally块执行Printer.EndDoc,后者会提交取消前渲染的页面。Lazarus 示例此前已正确处理
修复 (Fixed)
TPdf.GetCharacter、TPdf.GetCharcode及其TPdfView对应方法将FPDFText_GetUnicode返回的增补平面代码点(emoji、CJK Extension B)通过WideChar()截断为低 16 位,产生孤立代理项并破坏后续文本处理。现在大于 U+FFFF 的字符返回 U+FFFD(替换字符);使用GetText可获取增补字符的完整 UTF-16 编码GetWebLinks调用SetLength(Rectangles, FPDFLink_CountRects(...))时未防护-1返回值,在格式错误页面上引发EOutOfMemory。负数计数现在会限制为零TPdf.Destroy现在会在释放引用计数缓冲区前从内存擦除Password字符串(通过UniqueString+FillChar),因此组件销毁后密码不会留在堆上并可被读取
Version 2.24.0
新增 (Added)
TPdf.DeletePage、GetAttachment、GetAttachmentName、GetAttachmentType、SetAttachment和DeleteAttachment现在验证页面或附件索引,超出范围时引发EPdfError,与现有注释访问器行为一致。此前越界索引会直接传给 PDFium,导致静默无操作或未定义行为
修复 (Fixed)
TPdf.AddText、AddBitmap和AddJpegImage失败时的页面对象句柄泄漏:对象创建后、FPDFPage_InsertObject将其交给页面前,如果FPDFText_SetText、FPDFImageObj_SetBitmap、FPDFImageObj_SetMatrix或FPDFImageObj_LoadJpegFileInline引发异常,原生FPDF_PAGEOBJECT句柄会泄漏。现在每条路径都会在重新引发异常前销毁对象TPdf.UnloadPage通过将由CreatePath设置、尚未由AddPath消耗的进行中FPath句柄设置为nil而未调用FPDFPageObj_Destroy。现在会销毁该句柄,因此创建后被放弃或因页面切换中断的路径不再泄漏TPdf.InsertFormObjectFromXObject遗漏了所有同级插入操作(AddText/AddPath/AddBitmap/AddJpegImage/SetText/RemoveObject)都会执行的UpdatePage(FPDFPage_GenerateContent)调用,使通过此方式插入的 Form XObject 在下次重新加载或保存时消失。现在插入后会调用UpdatePage
Version 2.23.0
修复 (Fixed)
- 可选内容
/BaseState验证现在除/ON外接受/OFF(ISO 32000-1 Table 8.70 允许两者)。此前检查会以“格式错误的可选内容”错误拒绝符合规范的/OCProperties /D /BaseState /OFF配置 - 可选内容
/Intent验证现在接受/Design和[/View /Design]等名称数组,而不仅是字面量/View。ISO 32000-1 Table 8.70 将/Intent定义为来自/View和/Design的名称或名称数组,此前的单值检查会过度拒绝标准创作输出 - PDF 1.7
/Extensions /ADBEExtensionLevel 3 门槛的地理空间 Measure 字典检测不再要求/Type /Measure,ISO 32000-1 Table 254 将其标为可选。省略/Type的 GeoPDF 生成器(PDFBox、QGIS、FME)此前会绕过门槛并静默生成不符合规范的 PDF 1.7 输出,现在检测仅匹配/Subtype /GEO
Version 2.22.0
变更 (Changed)
TPdfView适配缩放计算(GetPageZoom、GetPageWidthZoom、GetPageHeightZoom)现在使用ClientWidth/ClientHeight而不是窗口Width/Height,因此pfmFitPage/pfmFitWidth/pfmFitHeight会将页面调整到可见视口,而不是包含滚动条和边框的外框,消除了适配页面略大于客户区时出现的多余滚动条AddSignatureTimestampToCms现在会引发明确的Exception,指出不可读的 CMS SignerInfo 字段(version / sid / digestAlgorithm / signedAttrs / signatureAlgorithm),而不是静默Exit并让部分解析继续流转为完整签名 CMS;同时修正了可选signedAttrs [0]分支中缺少begin/end块导致R.Position未前进的问题
修复 (Fixed)
ResolveWinSigner中的 CNG 私钥句柄泄漏:当CryptAcquireCertificatePrivateKey成功但后续颁发者/序列号提取或TWinCmsSigner.Create引发异常时,因为所有权只在构造函数成功后转移给签名器,NCryptKeyHandle从未释放。现在获取后的设置过程受到保护,任何失败都会先通过NCryptFreeObject释放句柄EcDsaP1363ToDer现在拒绝全零的r或s半段,而不是发出INTEGER 0;r = 0或s = 0的 ECDSA 签名无效(RFC 4754 §6 / FIPS 186-4 §6 要求1 ≤ r, s ≤ n-1),否则宽松验证器可能接受为真实签名
Version 2.21.12
修复 (Fixed)
- 显式保存至 PDF 1.5 到 PDF 1.7 的操作现在会拒绝格式错误的目录
/OCProperties结构,包括缺少所需的/OCGs或/D条目、无效的默认配置值以及非数组状态条目
Version 2.21.11
修复 (Fixed)
- 显式版本保存操作现在会拒绝直接或间接的页面
/Annots条目(其注释字典中缺少所需的/Subtype或/Rect条目)
Version 2.21.10
修复 (Fixed)
- 显式保存至 PDF 1.7 的操作现在要求地理空间
/Type /Measure /Subtype /GEO字典和 Projection 注释使用/BaseVersion /1.7和/ExtensionLevel 3或更高版本声明/Extensions /ADBE
Version 2.21.9
修复 (Fixed)
- 显式保存至 PDF 1.7 的操作现在要求 RichMedia 注释和
RichMediaExecute操作使用/BaseVersion /1.7和/ExtensionLevel 3或更高版本声明/Extensions /ADBE
Version 2.21.8
修复 (Fixed)
- 显式保存至 PDF 1.7 的操作现在要求 PRC 3D 流使用
/BaseVersion /1.7和/ExtensionLevel 1或更高版本声明/Extensions /ADBE,而不是将 PRC 视为 PDF 1.7 的核心功能
Version 2.21.7
修复 (Fixed)
- 显式保存至 PDF 1.4 及更早版本的操作现在会拒绝图像 XObject 的
/SMaskInData条目(包括显式值0),因为嵌入式 JPEG 2000 软遮罩通道需要 PDF 1.5 或更高版本
Version 2.21.6
修复 (Fixed)
- 显式保存至 PDF 1.4 及更早版本的操作现在会拒绝需要 PDF 1.5 或更高版本的 16 位图像 XObject,而针对 PDF 1.5 至 PDF 1.7 的目标则会保留其
/BitsPerComponent 16图像数据
Version 2.21.5
修复 (Fixed)
- 显式保存至 PDF 1.4 及更早版本的操作现在会拒绝文档目录中需要 PDF 1.5 或更高版本的
/PageLayout /TwoPageLeft和/TwoPageRight值,而针对 PDF 1.5 至 PDF 1.7 的目标则会保留所请求的双页布局
Version 2.21.4
修复 (Fixed)
- 显式保存至 PDF 1.3 的操作现在会拒绝文档目录中需要 PDF 1.4 或更高版本的
/Lang条目,而针对 PDF 1.4 至 PDF 1.7 的目标则会保留语言标识符
Version 2.21.3
修复 (Fixed)
- 显式保存至 PDF 1.3 的操作现在会拒绝文档的
/EmbeddedFiles名称树(需要 PDF 1.4 或更高版本),但不拒绝通过较旧文件规范引用的嵌入式文件流
Version 2.21.2
修复 (Fixed)
- 显式保存为 PDF 1.3 时,现在会拒绝仍在使用的元数据流,因为这些流要求 PDF 1.4 或更高版本;目标版本为 PDF 1.4 至 PDF 1.7 时则保留这些流
Version 2.21.1
修复 (Fixed)
- 混合引用验证现在会在同一处理版本的经典 xref 占位符之前先应用补充
/XRefStm条目,因此当兼容性表将它们标记为空闲时,已压缩的注释和其他受版本限制的对象不再被遗漏
Version 2.21.0
变更 (Changed)
- 所有 Delphi、C++Builder 和 Lazarus 查看器示例现在均可打开作为第一个命令行参数传入的 PDF,C++Builder 和 Lazarus 的
MultiPageViewer示例还提供了全选和复制的明确快捷键
修复 (Fixed)
- 查看器示例现在会拒绝书签和链接中的无效目标页,保留加载错误,并统一验证手动输入的缩放值;打印时输出所请求且已填好表单的页面,不再重复打印当前可见页;取消 Delphi 打印任务时会中止任务,不再提交部分输出
Version 2.20.0
变更 (Changed)
- 所有 Delphi、C++Builder 和 Lazarus 查看器示例现在均提供一致的打开、搜索、保存、打印、缩放和页面导航快捷键,而
ViewerInteractionLab的每个变体还支持页面跳转、经过输入验证的 10–600% 手动缩放、持久交互日志和点击坐标往返检查
Version 2.19.1
修复 (Fixed)
- 显式 PDF 版本验证现在沿当前有效的 classic、hybrid 或 xref-stream 修订链检查,包含压缩对象条目;已被替代、释放或不再被引用的对象不再导致功能版本验证误报
Version 2.19.0
变更 (Changed)
- C++Builder 和 Lazarus 的附件、图像提取、文本提取、页面转换及拆分示例现在使用专用输出目录或安全完成写入的文件,提供稳定的补零文件名、及时的进度更新,以及按项统计错误数的完成摘要
修复 (Fixed)
- C++Builder 的
CJKTextLab现通过导出的 PDFium 编辑函数测量文本,MergePDF避免了歧义 VCL 消息重载,恢复了 RAD Studio 37 的干净构建
Version 2.18.3
修复 (Fixed)
- PAdES B-LTA 文档时间戳现已作为可发现签名字段注册 — 一个通过首页
/Annots和 AcroForm/Fields可访问的不可见 Widget(ETSI EN 319 142-1 §5.4.3)— 而非令签名字段枚举验证器无法找到的孤立对象;现有注释和字段得以保留
Version 2.18.2
修复 (Fixed)
- PAdES 签名和经典交叉引用写入现在当字节偏移超过 10 位固定字段宽度(约 9.3 GB)时会抛出明确错误,而不是静默地将
/ByteRange占位符留空(产生无效签名)或溢出 20 字节 xref 行(ISO 32000-1 §7.5.4);使用 8 字节二进制字段的交叉引用流输出不受影响
Version 2.18.1
修复 (Fixed)
- PAdES 签名现在通过完整对象头(ISO 32000-1 §7.5.3)及引用的实际代次号来解析间接首页
/Annots、/AcroForm和/Fields引用;此前的裸字符串子串搜索会将较短对象号匹配至较长数字内(将5 0 R解析为15 0 obj),固定代次号则会遗漏gen>0的对象,从而损坏签名字段数组或拒绝合法文档 - 当目录、首页、
/Annots、/AcroForm或/Fields位于对象流内时,签名现在会在对象流展开后的副本上重试,而非直接拒绝该文档
Version 2.18.0
新增 (Added)
ReadPdfVersionInfo从 PDF 流中报告头版本、有效核心版本、目录覆盖和 Adobe 开发者扩展级别
变更 (Changed)
- 显式保存为 PDF 1.3-1.7 时,现在会在所属对象的上下文中验证 catalog、页面资源、XFA、删改和开发者扩展结构;为保护文档完整性,会拒绝指定版本的加密输出,以及 PDF 1.3 的增量规范化
- 文件路径保存现在写入同级临时文件,仅在所有压缩、规范化和版本检查成功后才替换目标文件
修复 (Fixed)
- PDF 1.3 输出现在带有必需的完整
/ProcSet资源,并在 PDF 1.4 透明度键仅重复 PDF 1.3 初始图形状态值时删除这些键 - 混合引用、xref 流和对象流文件不再被经典 xref 压缩器重写,防止压缩对象条目被丢弃
- 在字符串、注释或无关资源映射内与透明度或目录功能键相似的名称不再导致错误的目标版本失败
Version 2.17.0
新增 (Added)
- PAdES 签名现已作为不可见 Widget 注释注册到首页
/Annots数组和 AcroForm/Fields数组中,现有注释和表单字段得以保留
变更 (Changed)
- PDF/A、PDF/X、PDF/E、PDF/R、PDF/UA、PDF/VT 和 PAdES 的增量更新现在保留源文档的交叉引用表示:xref 流文档按 ISO 32000-1 §7.5.8.1 要求接收 xref 流更新,经典文档继续接收 xref 表
- 交叉引用偏移、
startxref、/Prev、PAdES ByteRange 值和 SHA-256 范围处理现在使用 64 位位置及分块哈希,在 64 位构建中支持大于 2 GB 的文件 - 生成的可写 XMP 数据包在关闭数据包指令前保留 2048 字节填充
Version 2.16.10
修复 (Fixed)
- 对象流展开不再复活增量更新已将对象从对象流迁移至普通定义的陈旧副本(ISO 32000-1 §7.5.7);此前的一致性检查和标记注入会在此类文件上解析过时的目录或元数据字典
Version 2.16.9
修复 (Fixed)
- 在 Free Pascal 上,非有效 UTF-8 的文本字符串按 Latin-1 逐字节加宽并以 UTF-16BE 十六进制字符串写入;此前原始高字节泄漏到字面字符串中,这不是合法的 PDF 1.7 文本字符串编码
- 流解码现在识别不带 RFC 1950 zlib 封装的原始 deflate 数据(损坏写入器的常见缺陷)并以原始模式解压,使一致性扫描不再对此类流静默失明
Version 2.16.8
修复 (Fixed)
- 由保存后处理路径写入的增量更新现在按 ISO 32000-1 §14.4 要求刷新第二个(变化的)trailer
/ID元素;此前两个元素均被逐字复制,导致缓存和同步工具在每次更新后看到相同的标识符
Version 2.16.7
修复 (Fixed)
- 一致性扫描使用的流体空白处理现在要求
stream关键字后跟行尾(ISO 32000-1 §7.3.8.1);此前像(downstream)这样字面字符串内的该词会将所有后续结构直到下一个endstream清空,使字节级检查无法发现真正的违规 - PDF/X 和 PDF/E 禁止功能扫描还会额外清空字面字符串和注释(§7.2.2),使
/Title (see /JavaScript docs)或注释标记不再产生误报的JavaScript、AcroForm或LZWDecode发现
Version 2.16.6
修复 (Fixed)
- PDF/VT DPM 条目现在按文档在写入时验证:违反 ISO 16612-2 §6.6 NMTOKEN 规则或附录 E 注册者前缀规则的键名,以及重复名称,被拒绝而不是写入 DPart 字典 — 此前含空格的名称会被分割为虚假的键/值对并损坏字典
Version 2.16.5
修复 (Fixed)
- 删除值为十六进制字符串(如
/Check <...>)的字典条目现在会删除整个条目;此前注入器会留下孤立的十六进制值,产生语法上损坏的字典 - 删除间接引用在标记间使用换行符的条目(ISO 32000-1 §7.3.10 允许任何空白符)不再遗留代次号和
R关键字
Version 2.16.4
修复 (Fixed)
- 最大对象号扫描不再要求对象头位于行首(ISO 32000-1 §7.5.3 允许其前有任意空白或分隔符),因此注入器不再能分配与内联
N G obj头冲突的对象号并静默损坏文件;对象号受附录 C 上限约束 /Length为间接引用的流现在会解析被引用的整数对象,并在其与关闭的endstream对齐时使用该值;此前此类流受模式搜索约束,会截断合法包含endstream字节序列的正文 — 典型情况是嵌入式 PDF 附件
Version 2.16.3
修复 (Fixed)
- 流压缩传递会原样通过交叉引用流文档(没有经典
trailer关键字的 PDF 1.5+ 文件);此前重建路径会错误解析startxref为表位置并合成猜测的 trailer,可能产生无法打开的文件 - 压缩器跳过 XMP 元数据流,使 PDF/A 文档保留其强制要求的未过滤元数据流(ISO 19005-1 §6.7.2),并保持外部文件流(带
/FFilter的/F)不变 - 重建的交叉引用表扫描文档的流剥离副本,使二进制流内容不再伪造对象头或膨胀表;重建 trailer 的
/Size现在反映实际表,对象号受附录 C 上限约束 - 定位原始交叉引用表接受仅 CR 的行尾(ISO 32000-1 §7.5.1),且不再将
startxref内的xref字母作为匹配;流关键字扫描获得了与其他位置相同的endstream尾部守卫,并在跳过流体后推进
Version 2.16.2
修复 (Fixed)
- 字节级 PDF 读取器中的整数解析现在接受 ISO 32000-1 §7.3.3 允许的显式
+号,并拒绝会溢出的数字串,使恶意或损坏文档不再能将解析的长度和偏移回绕为误导性值
Version 2.16.1
修复 (Fixed)
- PDF/UA 注入器将目录
/Lang值写为正确的 PDF 文本字符串;此前该值经过 XML 转义处理,导致包含&或括号的语言标签产生损坏条目,非 ASCII 输入以原始 UTF-8 写入 - PDF/E 的
/ISO_PDFEVersionInfo 条目使用共享文本字符串编码器,使非 ASCII 值在 PDF 1.7 中合法 - XMP 数据包的 XML 转义会丢弃 XML 1.0 中非法的控制字符,防止从损坏源文档复制的元数据使整个元数据流格式不正确
- PDF 到 XMP 日期转换验证日期字段为数字并补全缺失的分钟字段,防止生成的 XMP 中出现格式错误的 ISO 8601 日期;在非 Windows 平台上,回退时间戳现在包含时间而非仅有日期
Version 2.16.0
新增 (Added)
- 流解码现在在 FlateDecode 之后重建
/DecodeParms预测器(PNG 预测器 10-15 和 TIFF 预测器 2,ISO 32000-1 §7.4.4.4),遵循/Colors、/BitsPerComponent和/Columns;使用预测器压缩的对象流(常见的 PDF 1.5+ 写入器选择)此前呈现差分字节,导致其携带的对象对一致性扫描和标记注入静默不可见
修复 (Fixed)
- FlateDecode 检测现在将
/Filter值解析为名称或数组而非子串匹配,使级联过滤链和不相关值中出现的该词不再触发虚假的膨胀;不支持的链回退到原始字节
Version 2.15.1
修复 (Fixed)
- 字典扫描器现在在平衡
<</>>时跳过字面字符串、十六进制字符串和注释(ISO 32000-1 §7.2.2),使包含如(A >> B)值或紧接关闭分隔符的十六进制字符串的字典在 trailer、目录和一致性扫描解析期间不再被截断 - 字面字符串提取现在解码完整的 §7.3.4.2 表 3 转义集 —
\n \r \t \b \f、八进制\ddd、行续符和未转义 EOL 规范化 — 而非逐字复制转义字母,恢复对使用八进制转义的写入器的正确/Producer、/GTS_PDFXVersion和/ISO_PDFEVersion比较 - 标记注入器写入的字面字符串现在转义 CR、LF 和其他控制字符,使值在读取器端行尾规范化后逐字节存活
Version 2.15.0
修复 (Fixed)
- PDF/A、PDF/X、PDF/E、PDF/R、PDF/UA 和 PDF/VT 标记注入器以及 PAdES 签名和 DSS 路径写入的增量更新现在保留源文档的永久文件标识符:第一个 trailer
/ID元素按 ISO 32000-1 §14.4 要求逐字转发,仅第二个(变化的)元素被刷新;此前两个元素均被重新生成,导致外部引用和长期验证工作流在每次保存后看到不同的文档标识 - PAdES 签名、DSS 注入和 B-LTA 文档时间戳现在将源 trailer 的
/Info引用转发(ISO 32000-1 §7.5.6),使文档属性在签名后不再从阅读器面板消失;文档时间戳 trailer 还获得了/ID数组 - 交叉引用流文档的 trailer
/Info回退现在能正确定位 XRef 流字典并保留引用的代次号;此前在符合 PDF 1.5+ 文件上从不匹配,静默丢弃/Info
Version 2.14.4
修复 (Fixed)
TPdf.SignPades和SignPadesBytes写入的签名字典/M日期现在带有 ISO 32000-1 §7.9.4 要求的强制D:前缀和ZUTC 偏移标记;此前严格验证器将签名时间拒绝为格式错误的日期字符串
Version 2.14.3
修复 (Fixed)
- 共享 PDF 读取器中的字典键查找现在匹配完整名称标记(ISO 32000-1 §7.3.5);此前在
/Length之前列出/Length1(FontFile 流的典型情况)的流会被截断到错误的字节计数,静默地使读取字体、CMap 或元数据流的 PDF/A、PDF/UA 和其他一致性扫描失明 /Encrypt、/Root、/Size和/Infotrailer 查找不再匹配共享相同前缀的较长键(如/EncryptMetadata)- 对象流展开不再信任损坏或恶意的
/N值:非整数值现在产生 0 而非未初始化数字,从/First派生的上限防止在扫描格式错误文档时过大分配
Version 2.14.2
修复 (Fixed)
- PDF/X、PDF/VT、PDF/UA、PDF/E 和 PDF/R 标记注入器现在将加密源文档原样传递而非追加明文更新节;此前行为产生最新 trailer 丢失
/Encrypt条目(ISO 32000-1 §7.5.6)的文件,导致符合标准的阅读器将加密正文误读为明文 TPdf.SignPades、SignPadesBytes和InjectPadesDssMarkers现在在源文档已加密时抛出EPadesCrypto,而非静默产生损坏或不可验证的文件;签名或嵌入 DSS 材料前请先删除加密
Version 2.14.1
修复 (Fixed)
TPdf.SignPades和SignPadesBytes现在回填签名字典的全部四个/ByteRange字段;此前最后三个字段停留在零占位符,导致生成的签名声明空字节范围,在符合标准的验证器中验证失败- PAdES B-LTA 文档时间戳字典收到相同的
/ByteRange回填修正 ValidatePadesCompliance现在接受字节范围间隙持有十六进制/Contents值的标准签名布局,并检查第二个范围段恰好在文件末尾结束;此前只有无间隙范围通过覆盖率检查
Version 2.14.0
新增 (Added)
TPdf.ExportXFDF将所有页面的每个表单字段值和注释序列化为 XFDF 文档(ISO 19444-1),为层次化表单值输出<fields>,为所有支持的注释子类型输出<annots>(text、highlight、underline、strikeout、squiggly、line、circle、square、caret、polygon、polyline、stamp、ink、freetext、fileattachment、sound、link、redact)TPdf.ImportXFDF将 XFDF 文档读回加载的 PDF,在匹配页面上重建注释并将字段值应用到其 widget 注释TPdfAnnotation记录新增了Name(NM)、Subject、ModificationDate(M)、CreationDate、Icon、Opacity(CA)、线端点、多边形/折线顶点和墨迹列表手势字段,使 XFDF 往返保留完整的注释元数据- Delphi、C++Builder 和 Lazarus 演示集中新增
XfdfLab示例,演示导出/导入往返
Version 2.13.6
修复 (Fixed)
ValidatePdfA现在将没有/Type /Metadata或/Subtype /XML的目录/Metadata流视为通过pvaiMissingXmpMetadata缺失的 XMP 元数据- PDF/A 预检报告现在将
pvaiMissingXmpMetadata归类为元数据,并建议具有/Type /Metadata、/Subtype /XML、未过滤 XMP 和pdfaid标记的目录/Metadata流
Version 2.13.5
修复 (Fixed)
ValidatePdfA现在通过pvaiAnnotationApDictViolation报告没有外观字典的 Widget 注释以及需要但缺少/AP的 PDF/A-2 / PDF/A-3 注释- PDF/A 预检报告现在将
pvaiAnnotationApDictViolation归类为标记注入无法修复的内容
Version 2.13.4
修复 (Fixed)
ValidatePdfA现在通过pvaiImageDictionaryViolation报告/I或/Interpolate值为true的 PDF/A-2 和 PDF/A-3 内联图像,与现有 Image XObject 字典覆盖范围一致- PDF/A 预检报告现在将
pvaiImageDictionaryViolation归类为标记注入无法修复的内容
Version 2.13.3
修复 (Fixed)
ValidatePdfA现在通过pvaiInlineImageLzwForbidden报告在内容流中使用/LZWDecode或缩写/LZW过滤器的 PDF/A-1 内联图像,与现有 PDF/A-2 和 PDF/A-3 内联图像覆盖范围一致- 内联图像过滤器扫描器现在跳过像
/GS1这样的前导资源名称,避免在扫描更广泛的 PDF/A-1 内容流时停滞
Version 2.13.2
新增 (Added)
TPdf.SetFocusedFormFieldText通过FORM_ReplaceSelection将文本写入当前聚焦表单字段的编辑缓冲区,与FocusedFormFieldText对称。对于 AcroForm 文本/组合字段,值在失去焦点时提交到/V并持久化;对于 XFA 文本字段,写入仅在内存缓冲区中(PDFium 不提供将 XFA 值协调回数据集包的公共 API,因此跨保存不持久)- 只要 V8 引擎可用,JavaScript 宿主平台现在无论文档是否为 XFA 都会附加 — 因此嵌入的 AcroForm JavaScript(文档级脚本、字段计算、
app.alert)也可以执行。此前m_pJsPlatform仅为 XFA 文档连接,AcroForm JS 被静默禁用
变更 (Changed)
- JavaScript 平台附加现在独立于
InitializeFormFill中的 XFA 决策 —m_pJsPlatform表在V8FeaturesAvailable为 true 时构建,在 XFA 版本/回调连接之后而非嵌套在其中应用
Version 2.13.1
新增 (Added)
- 新主机事件呈现 v2.13.0 表单填写回调此前吞咽的信息:
OnXfaUriAction、OnXfaPageCountChanged、OnXfaFocusChange、OnXfaEmail、OnXfaHttpRequest、OnXfaOpenFile、OnJavaScriptBeep、OnJavaScriptPrint、OnJavaScriptMail、OnJavaScriptSubmitForm。每个事件在未分配时均默认为现有的空操作行为,现有主机不受影响 TPdf.XfaFormPackets只读属性返回所有 XFA 数据包的一次性快照(TXfaPacketList),实现了此前声明但未使用的TXfaPacket/TXfaPacketList类型- XFA 专用 PDFium 错误代码
FPDF_ERR_XFALOAD/FPDF_ERR_XFALAYOUT现已绑定并通过LastPdfError呈现,取代了 XFA 加载/布局失败的通用 "Unknown error"
变更 (Changed)
FFI_DoURIActionWithKeyboardModifier现在在 shell 执行来自 XFA 字段的 URI 之前查询OnXfaUriAction,赋予主机否决权(安全:恶意 XFA 字段此前可无条件启动任意 URL)。未分配的处理程序保留先前的ShellExecuteW默认行为DecodeFormFieldType现在通过IsXfaFormField路由 XFA 字段类型而非显式的 8 分支 case,通过序号偏移保持枚举与FPDF_FORMFIELD_XFA_*对齐
修复 (Fixed)
ValidatePdfA现在通过新的pvaiPdfA1Pdf15Structure问题报告使用 PDF 1.5 交叉引用流或对象流的 PDF/A-1 声明,同时继续允许 PDF/A-2 和 PDF/A-3 的对象流
Version 2.13.0
新增 (Added)
- 完整 XFA(XML Forms Architecture)运行时支持:
TPdf.InitializeFormFill现在连接所有 14 个版本 2FPDF_FORMFILLINFO回调(FFI_DisplayCaret、FFI_GotoURL、FFI_PageEvent、FFI_PopupMenu、FFI_OpenFile、FFI_EmailTo、FFI_UploadTo、FFI_GetPlatform、FFI_GetLanguage、FFI_DownloadFromURL、FFI_PostRequestURL、FFI_PutRequestURL、FFI_OnFocusChange、FFI_DoURIActionWithKeyboardModifier),并附加IPDF_JsPlatform,使支持 XFA 的pdfium.dll可渲染和脚本化动态 XFA 表单 - 新建
Lib\FPdfXfa.pas单元,声明 XFA 常量(FXFA_PAGEVIEWEVENT_*、FXFA_MENU_*、FXFA_SAVEAS_*、FPDF_FORMFIELD_XFA_*)以及此前仅在注释中引用的TXfaPacket/TXfaSaveFormat类型 TPdf上的 XFA 静态数据包读取器:GetXfaPacketCount/GetXfaPacketName/GetXfaPacketContent/GetXfaPacketByName加上GetXfaTemplate/GetXfaDatasets/GetXfaConfig,无需 XFA 运行时即可将 XFAtemplate、datasets和config数据包提取为原始 XML — 对合规审计和数据迁移有用- 能力探测:全局
XfaFeaturesAvailable,以及每文档的TPdf.XfaRuntimeAvailable(FPDF_LoadXFA是否实际成功)和TPdf.XfaStaticReadable(数据包读取器导出是否可解析) TPdfFormFieldType扩展了fiXfa、fiXfaCheckBox、fiXfaComboBox、fiXfaImageField、fiXfaListBox、fiXfaPushButton、fiXfaSignature、fiXfaTextField,DecodeFormFieldType映射新的FPDF_FORMFIELD_XFA_*值TPdf上的 JavaScript 主机事件:OnJavaScriptAlert、OnJavaScriptResponse、OnXfaGotoUrl和OnXfaRuntimeMissing让主机自定义 JS 对话框和 XFA 导航,或在 XFA 文档无法运行引擎时作出反应- 新建
XfaLabDelphi 示例,演示 XFA 检测、数据包提取、能力探测和运行时缺失回退路径
变更 (Changed)
TPdf.LoadDocument现在预扫描输入的 XFA 标记(AcroForm 字典中的/XFA,或目录/NeedsRendering),找到时通过在单例库首次加载前设置EnableV8Engine := True自动选择pdfium.v8.dll;一旦加载了普通pdfium.dll,进程就无法切换,因此OnXfaRuntimeMissing发出该情况的信号TPdf.GetPageCount现在反映 XFA 引擎通过FFI_PageEvent在动态重新分页后报告的页数,而非仅静态 PDF 页面树- 当 XFA 文档已打开但运行时不可用时,
InitializeFormFill现在固定version=1和xfa_disabled=1,而非请求带未分配回调的版本 2,后者此前有可能导致错误的回调指针解引用
Version 2.12.2
修复 (Fixed)
ValidatePdfACompliance现在报告使用没有pdfaExtension:schemas的自定义 XMP 命名空间的情况,同时仍接受没有扩展声明的标准pdfaid元数据- PDF/A-3 嵌入文件验证现在要求文件规范字典上同时具有顶级
/F和/UF条目,并在检查这些名称时忽略嵌套/EF流键
Version 2.12.1
修复 (Fixed)
ValidatePdfACompliance现在在匹配 JavaScript、LZWDecode、Type1 和相关禁止名称之前解码转义的 PDF 名称标记,使混淆但语义相同的名称被正确报告- PDF/A 内联图像检查现在拒绝使用
/LZWDecode、缩写/LZW或/Crypt的/Filter和/F值,包括数组和转义名称形式 - PDF/A 验证现在报告带有禁止流过滤器的元数据流、
/N分量计数缺失或不一致的 OutputIntent ICC 配置文件,以及缺少或无效/AFRelationship的 PDF/A-3 嵌入文件规范
Version 2.12.0
新增 (Added)
- TSA HTTP 请求现在通过
WinHttpSetTimeouts为每个阶段(解析/连接/发送/接收)设置明确的 30 秒超时,使缓慢或不可达的时间戳颁发机构不能无限期挂起签名线程,而非依赖 WinHttp 的隐式默认值 - 当调用者省略
TPadesSignOptions.Nonce时,PAdES B-T / B-LTA 时间戳请求的每请求 nonce 派生:单调计数器 + 墙时钟 +GetTickCount64+ 进程 ID 的 SHA-256 折叠取代了以前固定的$100000000回退,使同一毫秒内发出的两个请求不再重用相同的抗重放 nonce PdfInflate现在将解压缩输出上限设为 256 MiB,防止 zlib 压缩流在恶意或损坏输入("zlib 炸弹")上耗尽内存;该上限对任何真实 PDF 流都足够宽裕
变更 (Changed)
TPdfView叠加混合(搜索高亮、文本选择、阅读词、展开选择)不再使用逐像素GetPixel/SetPixelV;矩形现在通过 32 位离屏TBitmap和ScanLine一次性混合,消除每次绘制数千次 GDI 内核切换,使大型选区响应顺畅FPdfAsn1.TDerReader.ReadInteger现在拒绝长于 8 字节的 INTEGER 字段(以及符号位需要shl >= 64的 8 字节负数),在 CMS/PAdES ASN.1 输入上返回 0 而非通过未定义移位行为计算错误值ParseTimeStampResp不再将请求 nonce 回显为TPadesTimestamp.Nonce;在验证返回 nonce 的 TSTInfo 遍历器就位之前,该字段保持为 0 以表示"未验证",而非给调用者虚假的时间戳响应新鲜度信心
修复 (Fixed)
PointsToPixels对每个 DPI 均原样返回其输入:除数是PointsPerInch(常量 72)而非字面量 72,将公式折叠为Result := Points。通过此助手进行点到设备像素大小计算的任何外部调用者现在得到正确的Points × PixelsPerInch / 72PdfMaxObjNum在使用对象流(PDF 1.5+ ObjStm)的文档上计数偏少:压缩在/ObjStm内的对象没有N 0 obj标记,因此原始字节扫描遗漏了它们,为新对象分配MaxObj+1的注入器会与隐藏的 ObjStm 成员冲突并静默损坏文件。扫描现在先展开对象流,使每个对象号可见InjectPdfAMarkers不再在加密文档上伪造 PDF/A 合规声明:PDF/A(ISO 19005-1 §7.1)禁止加密,注入器此前会复制带有标记的源,即使下一次验证就会拒绝它。当HasEncrypt设置时,源现在原样传递。正常的TPdf.SaveAsPdfA路径在注入之前已剥除加密(saRemoveSecurity),因此这仅影响直接调用者PdfReadStreamBytes现在在分配结果缓冲区之前拒绝大于整个文件的/Length,关闭损坏或恶意间接长度上的早期分配路径
Version 2.11.0
新增 (Added)
- PDFium
FPDF_FILEHANDLER记录现在将其六个回调(Release、GetSize、ReadBlock、WriteBlock、Flush、Truncate)声明为真实字段而非注释,与 C 头布局匹配。返回或消费PFPDF_FILEHANDLER的 XFA FFI 文件传输回调(FFI_OpenFile/FFI_EmailTo/FFI_UploadTo/FFI_DownloadFromURL)在 Pascal 表单填写层中仍未实现,但类型现在在结构上对任何未来 XFA 提交/上传路径都是正确的 - PDFium 库加载和卸载(
LoadLibrary/UnloadLibrary)现在由进程全局临界区序列化,使两个TPdfFuture<T>工作线程(或与主线程竞争的工作线程)不能同时观察到PDFiumLibrary=0并双重绑定,或在另一线程正在绑定时释放 DLL initialization/finalization节现在在单元卸载时调用UnloadLibrary,确保FPDF_DestroyLibrary运行(工作线程加入、V8 隔离释放、字体/缓存清理),而非依赖操作系统回收 DLL
变更 (Changed)
TPdf.SetActive现在吞咽加载期间的任何异常(此前仅EPdfError),使表单/页面设置期间的流错误或访问违规以Active=False结束,而非处于部分加载的不确定状态组件- PDFium 元数据键参数的一致字符编码:
TPdf.GetMetaText现在使用与GetViewerPreference及加载路径相同的 FPCAnsiString/ DelphiUTF8Encode分支,而非裸AnsiString(Tag)转换 - 重复数据删除
BytesToAnsi、AnsiToBytes、WriteBytes和WriteStr助手:FPdfCompress现在从FPdfPdfCommon导入它们(其WriteBytesToStream/WriteAnsiToStream别名已退休),FPdfPdfa中冗余的三参数BytesToAnsi重载被删除。FPdfAsn1按设计保留其本地副本,以使密码层不依赖合规层单元
修复 (Fixed)
TPdf.LoadDocument(文件、内存、TBytes、TMemoryStream、自定义流)和TPdf.CreateDocument中的资源泄漏:如果InitializeFormFill或ReloadPage在FPDF_LoadDocument/FPDF_CreateNewDocument成功后抛出,原生FPDF_DOCUMENT句柄会因FActive仍为 False 而泄漏。每个路径现在将后加载设置包装在try/except中,失败时关闭文档,使组件干净地不活跃- 更友好的 PDFium DLL 加载诊断:
CheckLoadLibrary检测ERROR_BAD_EXE_FORMAT(193)并报告 32/64 位架构不匹配,指向匹配的DLLs/Win32或DLLs/Win64构建,而非仅中继通用操作系统错误。CheckGetProcAddress现在在必需导出缺失时说明已部署的pdfium.dll比绑定旧,而非裸操作系统的"找不到过程"文本
Version 2.10.1
修复 (Fixed)
- PAdES SignerInfo sid 标准化: 签名者标识符现在使用 RFC 5652 §5.3 的
issuerAndSerialNumber形式(issuer Name + serialNumber,两者均从签名者证书 DER 中原样提取),取代了此前非标准的subjectKeyIdentifier+ full-cert SHA-256 占位符形式,该形式被 Adobe Acrobat 及其他合规验证器拒绝。新增的 TbsCertificate DER 遍历器(ExtractIssuerAndSerial)以原始 TLV 字节读取 issuer SEQUENCE 与 serial INTEGER — 序列号常超出Int64范围,因此原始 TLV 是强制要求的。subjectKeyIdentifier形式仅在证书 DER 解析失败时作为回退保留
变更 (Changed)
TCmsSignerId.SerialNumber: Int64被替换为SerialDer: TBytes(原始 serialNumber TLV)。CMS 构建器将该切片 TLV 原样嵌入IssuerAndSerialNumber,避免了 20 字节 CA 序列号上的Int64溢出(RFC 5280 §4.1.2.2 上限)
Version 2.10.0
新增 (Added)
- PAdES B-LT 长期验证: 当
TPadesSignOptions.Level >= plB_LT时,SignPadesBytes追加一个增量更新,携带包含签名者证书及完整中间链的/DSS字典(自签名根依据 RFC 5652 §10.2.3 排除),并加上/Extensions /ESICLevel 1 标记(EN 319 142-1 §5.4.2) - PAdES B-LTA 归档时间戳: 当
Level >= plB_LTA且设置了TsaUrl时,追加一个/ByteRange覆盖整个文件的文档时间戳签名字典(/SubFilter /ETSI.RFC3161);ESIC 标记提升至 Level 2。至此四个 PAdES 基线级别(B-B、B-T、B-LT、B-LTA)已全部完成 - 证书链收集:
ResolveWinSigner现在调用CertGetCertificateChain并用中间 CA 证书填充TPadesResolvedSigner.ChainCertDer,使 B-LT 的/DSS /Certs携带验证签名所需的每一个证书而无需外部查找。CertFreeCertificateContext现已绑定,解决了 v2.8.0 中指出的每次签名一个上下文的泄漏 - PDF/A 集成工作流:
TPdf.SignPadesWithPdfA先将文档转换为 PDF/A(库目前可输出的最高级别),再应用所请求的 PAdES 签名 — 即 EN 319 142-1 附录 A.7 推荐的长期归档容器模式
Version 2.9.0
新增 (Added)
- PAdES B-T 可信时间戳:
TPadesSignOptions新增Level、TsaUrl与Nonce字段。当Level >= plB_T且设置了TsaUrl时,SignPadesBytes从构建的 CMS 中提取签名值,对其请求 RFC 3161 时间戳,并将返回的 TimeStampToken 作为 SignerInfo unsigned 属性signature-time-stamp嵌入 — 即 B-T 可信时间步骤(EN 319 142-1 §6.3 要求 o) FPdfTsa: 跨平台 RFC 3161 客户端 —BuildTimeStampReq(version 1、基于签名值的 SHA-256 messageImprint、nonce、certReq=true)、ParseTimeStampResp(接受 PKIStatus 0/1,拒绝 2+,原样提取 TimeStampToken ContentInfo)、RequestTimestamp(一次性 build+POST+parse)。PadesTsaAvailable在无 HTTP 后端的平台上对功能进行门控FPdfTsaWin: Windows WinHttp 后端,从 winhttp.dll 动态绑定(无新增编译期依赖;HTTPS 由 Windows 证书存储协商)。沿用了FPdfCryptoWin的动态绑定模式FPdfCms:ExtractSignatureValue遍历构建好的 CMS 以恢复原始签名八位组(TSA 哈希输入),AddSignatureTimestampToCms用携带时间戳属性的新unsignedAttrs [1](0xA1)重建 ContentInfo。stage-1 验证器将结果识别为 B-T 签名
Version 2.8.0
新增 (Added)
- PAdES B-B 签名栈: 四个全新的纯 Pascal/跨平台构建模块(
FPdfSha256、FPdfAsn1、FPdfCms、FPdfCrypto)加上 Windows CNG 后端(FPdfCryptoWin),让TPdf.SignPades/SignPadesToStream可端到端地生成 PAdES B-B 签名。签名者证书通过 SHA-1 指纹从 Current User “MY” 存储解析;RSA-PSS(推荐)、RSA PKCS#1 v1.5 与 ECDSA 均通过NCryptSignHash予以支持 FPdfSha256: 自包含的 FIPS 180-4 SHA-256(Init/Update/Final + 一次性助手)。FPC 3.2.2 不附带 SHA-2 单元,因此库自行拥有一个,使每条 CMS 代码路径都使用单一TSHA256Digest类型而无需 RTL 分支FPdfAsn1: DER 编码器(TDerWriter)与读取器(TDerReader),覆盖 SEQUENCE/SET/OID/INTEGER/OCTET STRING/UTCTime/GeneralizedTime/上下文专属标签,并具备 CMS 所要求的定长编码与 IMPLICIT 标签处理FPdfCms: CAdES SignedData 构建器(BuildSignedData),输出 PAdES 基线强制要求的 content-type、message-digest 与 signing-certificate-v2 signed 属性,并可选 signing-time 与 commitment-type-indication。signedAttrs 摘要在 SET 标签(0x31)形式上计算,并依据 RFC 5652 §5.4 以 IMPLICIT [0](0xA0) 标签重新输出FPdfCrypto+FPdfCryptoWin: 提供PadesCryptoAvailable/ResolvePadesSigner的加密后端抽象,Windows 实现动态绑定 crypt32.dll / ncrypt.dll(无新增编译期 DLL 依赖)。ECDSA 签名从 Windows IEEE P1363 r¦s 形式重新编码为 CMS 所要求的 DERECDSA-Sig-Value形式SignPadesBytes: 字节级签名注入 — 预留固定宽度的/Contentshex 槽,计算覆盖用的/ByteRange,对文档求摘要,构建并嵌入 CMS,并追加增量更新。验证器(v2.7.0)将输出识别为 PAdES B-B 签名
Version 2.7.0
新增 (Added)
- PAdES 结构验证器(ETSI EN 319 142-1 V1.2.1): 新增的
FPdfPades单元与TPdf.ValidatePades方法检查从/ByteRange可达的签名值字典,遍历/Contents内的 CMSSignedData至足以确认 CAdES detached 形态的程度,并检测四个基线级别(B-B、B-T、B-LT、B-LTA)以及文档时间戳字典(/SubFilter /ETSI.RFC3161) - PAdES 条款级问题集: 26 个
ppei*枚举覆盖/SubFilter可接受性(将adbe.pkcs7.sha1与adbe.x509.rsa_sha1标记为禁止)、/ByteRange文件覆盖范围、/Cert禁用、CMSSignedData形态(单一签名者、detached eContent、版本范围)、必需的 signed 属性(content-type、message-digest、signing-certificate/v2)、禁止的摘要(MD5、SHA-1)、/Reason与commitment-type-indication的互斥(要求 d)、B-T 可信时间要求、B-LT/DSS+/Certs+ ESIC Level 1 标记,以及 B-LTA 文档时间戳 + ESIC Level 2 标记 - DSS 注入器:
TPdf.SaveAsPadesDss/SaveAsPadesDssToStream在文档副本上追加携带/DSS字典(含/Certs、/OCSPs、/CRLs流数组)与/Extensions /ESIC标记(Level 1 或 2)的增量更新,同时保留原始字节 — 即 B-LT/B-LTA 验证材料嵌入步骤(条款 5.4.2) - 跨平台、零依赖阶段: 验证器与注入器均为纯 Pascal,可在所有受支持的 IDE(Delphi、Lazarus、FPC、C++Builder)上运行;此版本无需加密后端,也未引入任何新的 DLL 依赖
Version 2.6.0
变更 (Changed)
- 跨标准去重: 又有七个重复的辅助函数(PdfEnclosingObjNum、PdfDictRefNum、PdfExpandObjectStreams、PdfTextStr、ExtractLiteralString、ExtractXmpAttr)从各标准单元中移除并合并到
FPdfPdfCommon,减少了约 300 行复制粘贴式的维护负担 - PreflightReport 质量: 此前落入通用 “missing marker” 类别的 PDF/X 与 PDF/E 内容类问题,现在拥有准确的 Content/Metadata/Security 类别及条款特定的建议(两个标准合计约 15 个枚举)
- PDF/E 与 PDF/R 测试覆盖: 此前覆盖率为零的六个枚举新增了正向测试(
pveiLzwForbidden、pveiJavaScriptForbidden、pveiFormFieldsForbidden、pveiEmbeddedFilesForbidden、pvriBadHeader、pvriProhibitedInfoEntry) - Lazarus 构建修复:
Tests.PdfVT(一个在 v2.5.x 中加入的 Delphi 专用 DUnitX 单元)现从 Lazarus 工程中排除,以恢复编译
Version 2.5.3
新增 (Added)
- OutputIntent 完整性(PDF/X-4 §6.2.4):
pvviOutputIntentScheme标记/S不为/GTS_PDFX的 OutputIntent;pvviOutputIntentMissingIdentifier标记缺失的/OutputConditionIdentifier - PDF/VT-2 Reference XObject 豁免(§6.2.2):
pvviReferenceXObjectForbidden不再对PDF/VT-2文件触发,该文件可在 X-5g/5pg 基底上合法使用 Reference XObject - MIME boundary 字符校验(RFC 2046 §5.1.1):
vtmviBoundaryInvalidChar标记字符超出 bchars 集合或长度超过 70 的 boundary
修复 (Fixed)
InjectPdfVTMarkers现在从保存选项写入 Info/CreationDate与/ModDate,使生成的文件能在无误报pvviInfoModDateMismatch的情况下通过ValidatePdfVTCompliance(注入器此前改写了 XMP 日期,却令 Info 字典日期保持陈旧)
Version 2.5.2
新增 (Added)
- Info
/ModDate一致性(§6.3 NOTE 2,PDF/X-4 基底):pvviInfoModDateMismatch标记在 PDF 日期到 XMP 日期归一化后不等于xmp:ModifyDate的 Info 字典/ModDate - PDF/VT-2s 内联块合规(附录 A.2): MIME 验证器现在对每个内联
application/pdf部分运行ValidatePdfVTCompliance,并通过vtmviInlinePdfNotPdfVT标记非 PDF/VT 正文
Version 2.5.1
新增 (Added)
- DParts 分块校验(ISO 16612-2 §6.5 表 4):
pvviDPartsBadChunking标记非末尾子数组条目数不正好为 8192、或最后一个子数组落在 1..8192 之外的/DParts数组 - RecordLevel 跨流一致性(附录 A.2): PDF/VT-2s MIME 验证器现在提取每个内联 PDF 的
/RecordLevel,并通过vtmviRecordLevelMismatch标记不一致,以补充现有的 NodeNameList 检查 - 重复图形对象提示(§6.7):
pvviGtsScopeInvalidValue标记超出 {SingleUse, Record, File, Stream, Global, Unknown} 的/GTS_Scope;pvviGtsScopeRecordWithoutRecordLevel标记没有/RecordLevel的/Record;pvviGtsXidNotUuid标记非 RFC 4122 uuid: URI 的/GTS_XID;pvviGtsEnvMissing标记当/GTS_Scope为 Stream 或 Global 时缺失的/GTS_Env(§6.7.4) - MIME 前向引用检测(附录 A.2):
vtmviForwardReference标记通过/EF /F引用了一个未由流中更早的附件部分引入的文件名的内联 PDF
修复 (Fixed)
FPdfPdfvtMime中的ExtractNodeNameListFromPdf与ExtractRecordLevelFromPdf解决了一个反复出现的 off-by-one 错误,即AnsiFindKey返回的基于 1 的偏移被当作展开后 PDF 中的绝对字节偏移
Version 2.5.0
新增 (Added)
- PDF/VT 文档部分元数据(DPM,ISO 16612-2 §6.6):
TPdfVTSaveOptions新增DpmEntries与DpmTarget,使写入器可将/DPM字典附加到合成的 DPart 节点,键名依据附录 E 第二类前缀规则校验,验证器侧则依据 §6.6 NMTOKEN / 唯一性 /GTS_Managed形态规则 - PDF/VT-2s 流式交换(附录 A): 新增的
FPdfPdfvtMime单元为承载内联 PDF/VT 块及附件 ICC 配置的multipart/mixedMIME 信封提供BuildPdfVT2sStream与ValidatePdfVT2sStream,并带有X-PDFVT-Stream-version: 1头部排序规则与跨流NodeNameList一致性检查 TPdf.ValidatePdfVT现在通过FPDFDoc_GetJavaScriptActionCount执行权威的 JavaScript-action 计数,以补充字节级/JavaScript名称扫描
修复 (Fixed)
- PDF/X-4 基底上的 PDF/VT
Trapped正确性: 移除ptvUnknown枚举值(PDF/X-4 禁止/Unknown),ptvUnspecified在写入时归一化为/False(缺失的/Trapped同样被禁止),新增pvviTrappedInvalid问题标记缺失或Unknown值 ValidatePdfVTCompliance现在在扫描前展开对象流(PdfExpandObjectStreams),使存储在压缩 ObjStm(PDF 1.5+,为 PDF/X-4 生产者典型)内的 catalog、OutputIntent 或 Metadata 字典可被字节级查找访问到
变更 (Changed)
- PDF/VT-1 现在继承完整的 PDF/X-4 内容禁令:
pvviAcroFormForbidden(/AcroForm或/XFA)、pvviAdditionalActionsForbidden(catalog/AA)、pvviMissingTrimBox、pvviReferenceXObjectForbidden(Reference XObject,仅 X-5g/5pg) - 跨标准去重:
BuildDictObj、IccComponentCount、内置 sRGB ICC 配置(GetSrgbIccProfile)、PdfTextStr、PdfEnclosingObjNum、PdfDictRefNum与PdfExpandObjectStreams从FPdfPdfa/FPdfPdfx/FPdfPdfvt中三重复制的本地副本提升至FPdfPdfCommon中的单一规范位置;3144 字节的 ICC 字面量现在在代码库中恰好存在一处
Version 2.4.0
已修复 (Fixed)
InjectPdfUaMarkers在交叉引用流 (cross-reference-stream) 基底上不再丢弃 trailer 中的/Info引用:本地的SourceTrailerInfoRef(缺乏 xref-stream 备用方案)已被共享的PdfSourceTrailerInfoRef取代(该共享版本是从自 v2.0.0 起就已包含备用方案的 PDF/A 副本中提升而来)- 共享的
PdfReadStreamBytes现在可处理间接的/Length N G R引用(移植自 PDF/A 本地副本),因此对于使用间接 Length 的工具(Acrobat, Ghostscript)所生成的 XMP 元数据流,PDF/VT、PDF/R 和 PDF/E 验证器不再发生误读或跳过
已修改 (Changed)
- 跨标准去重:
FPdfPdfa和FPdfPdfx中的本地PdfReadTrailer副本、FPdfPdfa和FPdfPdfua中的本地SourceTrailerInfoRef副本,以及FPdfPdfa中的本地PdfReadStreamBytes均已被删除 — 共享的FPdfPdfCommon版本现在适用于所有地方,这减少了约 ~330 行的重复代码,并消除了保持副本同步的维护负担 - PDF/X 测试欠债收尾:七个此前覆盖率为零的内容类枚举获得了正向测试(
pvxiLzwForbidden、pvxiJavaScriptForbidden、pvxiFormFieldsForbidden、pvxiAdditionalActions、pvxiEmbeddedFilesForbidden、pvxiMissingTrimBox、pvxiTrappedNotSet)
Version 2.3.0
已修改 (Changed)
- PDF/A 测试欠债收尾继续:另外三个覆盖率为零的枚举获得了正向测试;
pvaiForbiddenRenderingIntent(§6.2.9) 标记内容流中非标准的 rendering-intent 名称;pvaiJpeg2000Violation(§6.2.2) 标记 Part 2 中/NumComponents在 {1,3,4} 之外的 JPXDecode 图像;pvaiInlineImageLzwForbidden(§6.1.10) 标记 Part 2 中使用 LZW 滤波器的内联图像
Version 2.2.0
变更 (Changed)
- 交叉引用流回归测试:现有的
Validate_XrefStreamTrailer_DetectsConformance现在还会验证编目/Metadata引用是否已解析,以及 XMPpdfaid:part是否在 xref-stream 基础上被读取(而不限于/Root+/ID);新增的InjectPdfA_XrefStreamBase_RoundTrips测试用于保护 v2.0.0 中加入的注入器 xref-stream 路径;两个跨标准测试(PdfE_XrefStreamBase_NotRejectedAsUnparsable、PdfR_XrefStreamBase_NotRejectedAsUnparsable)验证了 PDF/E 和 PDF/R 验证器不再将 xref-stream PDF 误判为不可解析而拒绝 - PDF/A 测试债清理:
Validate_MinimalPdf_FlagsRequiredMarkers断言纯极简 PDF 会触发pvaiMissingPdfAIdentifier、pvaiMissingOutputIntent、pvaiMissingIccProfile、pvaiMissingXmpMetadata和pvaiMissingXmpDates— 弥补了与已具有等效测试的 PDF/E 和 PDF/X 验证器之间的对称性差距;另外两个此前为零覆盖率的枚举也获得了正向测试:pvaiUnembeddedFont和pvaiSubsetMissingCidSet
Version 2.1.0
修复 (Fixed)
- PDF/E 之前被遗漏在 v2.0.0 交叉引用流的修复范围之外:
InjectPdfEMarkers和ValidatePdfECompliance此前仍调用了未启用AcceptXrefStream的PdfReadTrailer,导致 PDF/E 注入器在 PDF 1.5+ 输出(pdfium 默认的SaveAsCopy)下静默失败;现在两个调用处均传入True - 共享的
PdfReadTrailer交叉引用流回退机制现在携带了 PDF/A 和 PDF/X 本地副本中已有的/Type /XRef保护,因此指向无关字典的损坏startxref偏移量会以失败告退,而不会被误解析为 trailer ValidatePdfUaCompliance(v2.0.0) 中的间接引用/Lang解析器之前无法触及:PdfFindObjDict仅查找<<字典,而/Lang字符串对象是没有字典的(...)或<...>;现在已替换为直接定位字符串标记的对象体扫描
变更 (Changed)
- 从
FPdfPdfa和FPdfPdfua中移除了七个影子辅助重复函数(PdfStructureBytes、PdfHasName、PdfCountName、BuildStreamObj,它们与共享的FPdfPdfCommon版本字节级完全相同)— 现在共享的版本通过uses应用于所有地方
Version 2.0.0
修复 (Fixed)
- 跨标准静默失败:共享的
PdfReadTrailer辅助函数(被 PDF/UA、PDF/X、PDF/VT 和 PDF/R 标记注入器与验证器使用)现在可接受AcceptXrefStream参数,并在没有trailer关键字时(PDF 1.5+)回退到交叉引用流对象字典;在此之前,pdfium 的SaveAsCopy输出(使用交叉引用流)会导致每个标记注入器静默失败 — 源字节被直接复制,调用依然返回成功;PDF/R-1.0 验证器(其基于 PDF 2.0,且基础始终是交叉引用流)之前实际上是空操作;现在 PDF/A 验证器的成熟实现已移植到共享辅助函数中,让每个标准都能受益 InjectPdfUaMarkers和InjectPdfAMarkers中的 trailer 字典扫描现在使用感知深度的PdfDictEnd代替裸>>搜索,因此包含嵌套字典(例如/Encrypt << ... >>)的 trailer 不再于尾随的/Info条目前提前终止
变更 (Changed)
- 当精确的 Pdfium 对象 model
pvuaiPdfiumFontNotEmbedded已经触发时,TPdf.ValidatePdfUa现在会抑制粗粒度字节级的pvuaiFontNotEmbedded,从而使预检报告不再为同一个缺陷携带两行几乎重复的“嵌入您的字体”提示 pvuaiLangInvalidFormat(§7.2) 现在可将间接引用的/Lang(N 0 R) 解析为其字符串对象并验证其内容,使间接引用的语言标签不再成为盲区
Version 1.99.0
修复 (Fixed)
pvuaiLangInvalidFormat(§7.2) 不再对十六进制编码的/Lang字符串直接放行:现在会解码 UTF-16BE 字符对(带有FE FFBOM)和纯 ASCII 十六进制字符串,并像字面量(...)字符串一样进行相同的 BCP 47 语法检查,从而捕获格式错误的十六进制/Lang,同时符合规范的十六进制字符串(例如 UTF-16BE 的en-US)也不再有被标记的风险
变更 (Changed)
pvuaiFontMissingToUnicode(§7.21.7) 现在除了/WinAnsiEncoding和/MacRomanEncoding之外,还将/MacExpertEncoding纳入豁免,以符合该条款列出的四种豁免条件
Version 1.98.0
新增 (Added)
pvuaiNeedAppearancesTrue(§7.18.4) 标记/NeedAppearances标志为 true 的 AcroForm,因为这导致控件外观无法可靠锁定,辅助技术也无法将其与结构树关联起来,此检查移植自 PDF/A 验证器,并由/AcroForm的存在性进行限制以缩小扫描范围
变更 (Changed)
- veraPDF 语料库回归:将 §7.20 Reference-XObject 的通过+失败对以及 §7.21.4.2 子集 CharSet/CIDSet 的通过+失败对接入到
Live_Corpus_ValidatePdfUaMatchesConformance中,同时将 §7.21.7 ToUnicode 禁用值 and §7.18.6.2 媒体剪辑(media-clip)的通过样本作为误报守卫接入(其失败样本使用的字典布局无法被字节级扫描捕获,因此仅接入了通过端) - 语料库通过路径断言列表新增了 15 个零误报守卫,因此现在每个处于激活状态的
pvuai*字节级和结构检查都会针对合规样本进行演练(此前 60 个激活问题中仅有约 30 个受到保护),pvuaiLangInvalidFormat守卫被故意省略,因为字节级检查器会保守地标记它无法解码的十六进制编码/Lang字符串
Version 1.97.0
修复 (Fixed)
ValidatePdfUaStructureElements加固:EnclosingTable父链遍历现在携带一个跳数计数器(以元素数量为上限),因此合成结构元素数组上畸形的ParentIndex循环不再会挂起调用者,ValidatePdfUaPageContentTagging标记内容 ID 数组分配现在的上限为一百万个条目,以防止在畸形或恶意的MarkedContentID上进行数 GB 的内存分配
变更 (Changed)
pvuaiOrderedListMissingListNumbering枚举文档注释现在准确描述了该检查的作用:它标记ListNumbering值超出 ISO 32000-1 Table 347 集合的L元素(不标记缺失的属性),先前的注释暗示它还会检测缺少该属性的有序列表,但实现中并未这样做- 两个
7.21.3.3-t02WMode 不匹配的语料库失败样本现在已接入到Live_Corpus_ValidatePdfUaMatchesConformance中 — 自 v1.95.0 起,CMap 流已通过 FlateDecode 解压,因此字典与内容的对比现在可以在可读端运行,同时移除了过时的“未接入”注释
Version 1.96.0
新增 (Added)
- 跨标准一致性:
TPdf.ValidatePdfUa新增了两个从 PDF/A 验证器移植的检查,pvuaiAnnotationFlagsViolation(§7.18.1) 标记携带 Hidden / Invisible / NoView 标志的非豁免注释,因为这会破坏辅助技术的阅读流;pvuaiActionTargetMissing(§7.18.5) 标记缺少所需目标键(/F+/D, /URI, /F)的 GoToR / URI / SubmitForm 操作,因为这会导致辅助技术无法使用该链接
修复 (Fixed)
- 跨页面结构树合并:
TPdf.ValidatePdfUa中的AllElems累加循环现在将每个元素的ParentIndex从页面本地数组重定基准到合并数组,如果不做此处理,第 2 页的子元素将保留指向第 1 页分片的页面本地索引,从而静默损坏每个依赖 ParentIndex 的检查(表格/列表结构、§7.4.4 H 子项计数、EnclosingTable) - RoleMap 解析:当值是间接引用(
N 0 R)或数组([...])时,PdfReadRoleMapPairs不再终止整个键/值扫描 — 根据 ISO 32000-1 14.8.5.1,这两者都是有效的 RoleMap 形式,现在仅跳过该条目(Continue) 而不是中断(Break),从而消除了对在间接引用/数组条目之后映射的类型产生pvuaiRoleMapUnresolved误报的情况
变更 (Changed)
FPdfPreflightReport:此前归入通用的“缺失标记”类别和建议的 18 个激活的TPdfUaValidationIssue值,现在携带了准确的类别(Structure / Content / Metadata / Security)和针对条款的建议,同时修复了PDFSpecComplianceMatrix.md中puaNone / pua1→pucNone / puc1的拼写错误
Version 1.95.0
变更 (Changed)
TPdf.ValidatePdfUa召回率与完备性重构:§7.21.3.3pvuaiCMapWModeMismatch检查和 §7.21.7pvuaiToUnicodeForbiddenValue检查现在在扫描前会先解压FlateDecode压缩的 CMap / ToUnicode 流(以前仅评估未压缩的流,属于已知的漏报),共享的PdfInflate/PdfReadAndDecodeStream辅助函数已从FPdfPdfa/FPdfPdfx提升到FPdfPdfCommon,使每个合规性单元共享同一份代码
新增 (Added)
pvuaiSubsetCharSetEmpty(§7.21.4.2) 标记携带空字符串值/CharSet键的 Type 1 子集FontDescriptor— 现有的pvuaiSubsetMissingCharSet仅能捕获缺失的键,空的/CIDSet不会被标记,因为没有 CID 的字体可以合法地携带空位图
Version 1.94.0
新增 (Added)
- 第二轮
TPdf.ValidatePdfUa审计填补了通过逐条审查以及重新扫描已包装但未在 PDF/UA 路径中使用的 Pdfium 原生 API 所发现的六个 ISO 14289-1 空白:pvuaiHeadingFormatInvalid(§7.4.3) 标记以 H 开头但携带分隔符、空格或罗马数字而非纯阿拉伯数字的自定义标题标签;pvuaiMissingDocumentOutline(§7.17,推荐) 标记不携带书签大纲的多页文档(单页文档豁免);pvuaiStructElementLangInvalid(§7.2) 标记不属于有效 BCP 47 标签的结构元素/Lang值;pvuaiWidgetMissingPrintField(§7.14 / §7.18.4) 标记缺少 PrintField 属性所有者的 Widget 结构元素;pvuaiLinkNotInStructureTree(§7.18.5) 标记其/Subtype /Link注释未作为 Link 结构元素公开的文档;pvuaiPdfiumAnnotationMissingContents和pvuaiPdfiumLinkMissingContents(§7.18.1 / §7.18.5) 引入了精确的 Pdfium 对象模型注释扫描,豁免了隐藏、裁剪框(crop-box)外、Popup 和 Widget 注释 — 从而消除了字节级启发式算法因无法读取/F标志或/Rect而产生的误报
Version 1.93.0
新增 (Added)
TPdf.ValidatePdfUa现在在字节级检查器之上叠加了 Pdfium 对象模型处理,镜像了 PDF/A 第 7 轮的架构:它通过FPDFTextObj_GetFont→FPDFFont_GetIsEmbedded(pvuaiPdfiumFontNotEmbedded, §7.21.4) 遍历每个页面的文本对象,并通过FPDFText_HasUnicodeMapError(pvuaiPdfiumUnicodeMapError, §7.21.7) 以及FPDFText_GetUnicode(pvuaiPdfiumNotDefGlyph, §7.21.8) 扫描每个字符 — 这比仅在不存在字体程序或根本没有/ToUnicode时才触发 the 字节级启发式算法更为精确,该遍历在三个层面上进行了短路:当三个 Pdfium 层问题均已设置时退出页面循环,在遇到第一个非内嵌字体时退出单个对象循环,以及当UnicodeMapError已经命中时字符扫描跳过.notdef阶段,PDF/UA 是最后一个没有 Pdfium 对象模型层的 PDF 标准验证器
Version 1.92.0
新增 (Added)
- 创建了
Tests.PdfR— PDF/R-1 验证器(FPdfPdfr)的首个测试文件,涵盖文件头验证、禁用 ObjStm、光栅标记检测以及干净文件的零误报守卫,至此,所有六个 PDF 标准测试套件都拥有了专用的测试文件:PdfA(80), PdfUa(101), PdfX(7), PdfE(5), PdfVT(15), PdfR(4) = 总共 212 个测试
Version 1.91.0
新增 (Added)
ValidatePdfE和ValidatePdfVT获得了此前仅在 PDF/A、PDF/UA 和 PDF/X 验证器中可用的内容级检查:pveiLzwForbidden,pveiJavaScriptForbidden,pveiFormFieldsForbidden(仅限 PDF/E),pveiEmbeddedFilesForbidden(仅限 PDF/E),pveiOpiForbidden,pvviLzwForbidden,pvviJavaScriptForbidden,pvviEmbeddedFilesForbidden,pvviOpiForbidden,同时TPdf.ValidatePdfEandTPdf.ValidatePdfVT也获得了 Pdfium 对象模型层(pveiPdfiumFontNotEmbedded/pvviPdfiumFontNotEmbedded),通过FPDFFont_GetIsEmbedded遍历页面文本对象,并在遇到第一个非内嵌字体时进行短路
Version 1.90.0
新增 (Added)
TPdf.ValidatePdfX现在在字节级检查器之上叠加了 Pdfium 对象模型处理:它通过FPDFTextObj_GetFont→FPDFFont_GetIsEmbedded遍历每个页面的文本对象,并将非内嵌字体报告为pvxiPdfiumFontNotEmbedded— 这比仅在不存在字体程序时才触发的字节级启发式算法更为精确,该遍历在发现第一个非内嵌字体时进行短路
变更 (Changed)
TPdf.ValidatePdfUa结构树遍历:一旦已经发现pvuaiUntaggedContent,后续页面将跳过每页的ValidatePdfUaPageContentTagging调用(该调用构建标记内容 ID 声明图并交叉检查每个文本/图像对象) — 跨页检查(Note 唯一 ID、标题顺序)仍会收集结构元素,但昂贵的每页内容标记处理会提前停止
Version 1.89.0
变更 (Changed)
TPdf.ValidatePdfAPdfium 对象模型层性能优化:页面/对象遍历现在在三个层面上进行了短路 — 当所有适用的 Pdfium 层问题均已找到时退出页面循环,当两个单对象问题(字体嵌入 + 透明度)均已设置时退出对象循环,以及当UnicodeMapError已经命中时文本页面字符扫描跳过.notdef阶段,Assigned()API 可用性检查和合规性标志在循环前被一次性缓存到本地布尔值中,而不是在每个页面/对象/字符上重新评估,在非合规的大型文档上,该遍历现在可以在第一页后停止,而不是扫描所有页面;在合规文档上,每页的开销也更低(无重复的Assigned调用)
Version 1.88.0
新增 (Added)
ValidatePdfX新增了八个内容级的TPdfXValidationIssue值,涵盖了 PDF/X 在文件格式标记之外施加的印刷交换限制:pvxiLzwForbidden(/LZWDecode),pvxiJavaScriptForbidden(/JavaScript),pvxiFormFieldsForbidden(/AcroForm//XFA),pvxiAdditionalActions(/AA),pvxiEmbeddedFilesForbidden(/EmbeddedFiles//FileAttachment),pvxiOpiForbidden(/OPI//Alternates),pvxiMissingTrimBox(任何页面均无/TrimBox)以及pvxiTrappedNotSet(/Trapped缺失或为/Unknown),PDF/X 验证器此前仅检查 XMP/OutputIntent 标记,这是其首次内容级评估,共享的PdfStructureBytes/PdfHasName/PdfCountName辅助函数已添加到FPdfPdfCommon中,使所有合规性单元均可使用它们
Version 1.87.0
新增 (Added)
- PDF/UA 验证现已涵盖 ISO 14289-1 §7.21.3 复合字体规则:
pvuaiCidSystemInfoMismatch标记内嵌 CMap 与后代 CIDFont 在Registry/Ordering上不一致、或 CIDFontSupplement超出 CMap 所声明值的 Type0 字体;pvuaiCMapNotEmbedded标记以名称(作为Encoding或UseCMap)引用但不属于 ISO 32000-1 Table 118 预定义 CMap 的 CMap;pvuaiCMapWModeMismatch标记内嵌 CMap 字典中WMode与其流内容中的 WMode 不一致的情况
修复 (Fixed)
- §7.21.3.2 的
pvuaiCidFontMissingCidToGidMap检查曾遗漏Subtype键值对被换行符分隔的 CIDFontType2 字典,现在同时也会标记CIDToGIDMap取值为Identity以外名称的情况
Version 1.86.0
新增 (Added)
- PDF/UA 验证现已涵盖 ISO 14289-1 §7.21.6 TrueType 编码规则:
pvuaiTrueTypeEncodingInvalid标记非符号 TrueType 字体中Encoding缺失或既非MacRomanEncoding也非WinAnsiEncoding(直接声明或经BaseEncoding)的情况;pvuaiSymbolicTrueTypeEncoding标记携带非标准Encoding名称的符号 TrueType 字体
Version 1.85.1
变更 (Changed)
- ISO 14289-1 §7.18.3 制表符顺序检查
pvuaiMissingTabsOrder现改为逐页执行:每个包含注释的页面必须在其自身的页面字典中声明/Tabs /S,因此符合规范的兄弟页面不再能掩盖未声明的页面
Version 1.85.0
新增 (Added)
- PDF/UA 验证现可根据 ISO 14289-1 §7.15 区分动态 XFA 表单与静态 XFA 表单:
pvuaiXfaDynamic标记 XFA 配置将dynamicRender设置为required的表单
变更 (Changed)
- 原有的泛 XFA 候选标志
pvuaiXfaPresent已停用,不再触发(静态 XFA 符合 §7.15 规定);枚举值保留以维持 API 兼容性
Version 1.84.0
新增 (Added)
- PDF/UA 验证现可检测 ISO 14289-1 §7.1 要求的未标记真实内容:
pvuaiUntaggedContent标记既未被页面结构树(通过标记内容 ID)认领、也未标记为 Artifact 的已渲染文本和图像对象 - 新增页面级辅助函数
GetPageContentMarkInfos和ValidatePdfUaPageContentTagging,以及TPdfPageContentMarkInfo记录类型,可直接调用
Version 1.83.0
新增 (Added)
- PDF/UA 验证现已执行 ISO 14289-1 §7.4.4 标题模型:
pvuaiHeadingModelMixed标记同时混用通用H标签与编号标题H1..Hn的文档,pvuaiHeadingMultipleInNode标记包含多个子H标题的结构节点
Version 1.82.0
新增 (Added)
- PDF/UA 验证现可解析 ISO 14289-1 §7.1 要求的 RoleMap:
pvuaiRoleMapRemapsStandard标记重新定义标准结构类型的 RoleMap 条目,pvuaiRoleMapUnresolved标记已使用的非标准结构类型,其 RoleMap 链为缺失、悬空或循环的情况 — 最终抵达标准类型的间接链被接受,未使用的 RoleMap 条目不予评判 - 新增辅助函数
PdfUaIsStandardStructType、PdfReadRoleMapPairs(含 PDF 名称#hh转义解码)和ValidatePdfUaRoleMapUsage,可直接调用
Version 1.81.0
新增 (Added)
- PDF/UA 验证现已涵盖 ISO 14289-1 §7.6 要求的 ISO 32000-1 列表标签规则:
pvuaiListStructureInvalid标记位于 L 容器之外的 LI 项,以及位于 LI 项之外的 Lbl/LBody 部分,同时接受嵌套列表以及在 Note 和 BibEntry 元素中的合法 Lbl 用法
Version 1.80.0
新增 (Added)
- PDF/UA 验证现已涵盖 ISO 14289-1 §7.5 要求的 ISO 32000-1 表格标签规则:
pvuaiTableStructureInvalid标记位于 TR 行之外的 TH/TD 单元格以及位于 Table 容器之外的行或行组,pvuaiTableHeaderMissingScope标记无法通过 Scope 属性或 Headers/ID 关联确定关系的表头单元格,pvuaiTableHeadersUndefinedId标记在未定义任何结构元素 ID 的文档中存在 Headers 引用的情况 TPdfStructureElement现在在结构树遍历期间解析并暴露表格属性Scope、HasHeaders、HeadersIds、ColSpan和RowSpan
变更 (Changed)
- 结构树遍历现在在单次遍历每个元素的属性字典时即读取所有布局和表格属性,而非每个属性单独扫描一次
Version 1.79.1
新增 (Added)
- 将
AnnotationsLab示例移植到了 Lazarus 和 C++Builder,加入了现有的 Delphi 控制台示例
修复 (Fixed)
TPdf.CreateAnnotation对于使用四边形点(QuadPoints)的标记注释(如高亮、下划线、删除线、波浪线)可能会引发“Cannot set attachment points”错误,因为新注释还没有四边形槽位可供替换;现在它改为追加第一个四边形
Version 1.79.0
新增 (Added)
- 新增
AnnotationsLabDelphi 控制台示例:演示创建 Text、Highlight、Square、Circle 四种注释、写入 PDF、重新加载并枚举页面注释列表
Version 1.78.0
新增 (Added)
- 新增
TPdf.MeasureText与TPdf.MeasureTextWidth:在不向页面添加内容的前提下测量指定字体与字号下文本的渲染宽高(PDF 用户单位,1 单位 = 1/72 英寸),便于在AddText之上实现版面布局与自动换行;由独立单元FPdfMeasure以 class helper 形式提供 - 新增
TPdf.WrapText:基于MeasureTextWidth的贪心自动换行,按空格拆词并打包为不超过给定宽度(PDF 用户单位)的多行;超宽单词独占一行(不做词内断行),返回换行后的文本行数组
Version 1.77.0
新增 (Added)
ValidatePdfA新增了三个TPdfAValidationIssue值,涵盖了之前差距审计中被评为“NO”或“阅读器行为”(reader behaviour)的条款(追加序号,现有值不变):pvaiPdfiumNotDefGlyph(PDF/A-2 6.2.11.8 — 一个解析为 Unicode 0 且没有映射错误的字符,这是.notdef字形引用的运行时症状;通过 Pdfium 对象模型层检测),pvaiWordBreakMissing(Level A 6.8.3.2 — 长度超过 20 个字符且没有空格的内容流显示字符串,可能是合并词违规;一种避免 CJK 误报的粗略启发式方法),以及pvaiLinkActionMissingTarget(6.6.3 — 缺少显示目标键的 GoToR/URI/SubmitForm 动作,导致阅读器无法呈现)
Version 1.76.0
新增 (Added)
ValidatePdfA获得了三个新的TPdfAValidationIssue值(追加在末尾,现有值保持不变):pvaiNameNotValidUtf8(PDF/A-2/3 6.1.8 — 包含 ≥ 0x80 的字节且未构成有效 UTF-8 的/BaseFont或/FontName标记)、pvaiInlineImageLzwForbidden(PDF/A-2/3 6.1.10 — 页面内容流中的内联图像使用了 LZW 或 Crypt 过滤器)以及pvaiTrueTypeDifferencesForbidden(6.3.7 Cor.2 — 其 Encoding 字典携带/Differences的非符号 TrueType 字体)
Version 1.75.0
新增 (Added)
ValidatePdfA获得了三个新的TPdfAValidationIssue值(追加在末尾,现有值保持不变):pvaiIntegerImplementationLimit(PDF/A-2/3 6.1.13 — 超过 32 位有符号整数限制 2,147,483,647 的数字标记)、pvaiBlendModeNotWhitelisted(PDF/A-2/3 6.2.10 — 在 ISO 32000-1 §11.3.5 标准混合模式集之外的/BM值;对仅允许 Normal/Compatible 的 PDF/A-1 的pvaiTransparentColorSpace进行了补充)以及pvaiHexStringOddDigits(6.1.6 — 具有奇数个十六进制数字的<...>十六进制字符串)
Version 1.74.0
新增 (Added)
ValidatePdfA获得了三个新的TPdfAValidationIssue值(追加在末尾,现有值保持不变):pvaiPermissionsViolation(6.1.12 — 与/DocMDP一起携带/DigestLocation、/DigestMethod或/DigestValue的/Perms字典)、pvaiTransActionForbidden(PDF/A-2 6.5.1 — Trans 过渡动作,通过/S /Transaction-dict 模式检测以避免错误匹配/Transparency)以及pvaiPdfiumObjectTransparency(PDF/A-1 6.4 — 页面对象根据FPDFPageObj_HasTransparency带有真实的透明度,这扩展了 v1.73.0 中引入的 Pdfium 对象模型层,以捕获字节级名称扫描可能遗漏的混合模式 / 软掩码效果)
Version 1.73.0
新增 (Added)
TPdf.ValidatePdfA现在在字节级检查器之上叠加了一遍 Pdfium 对象模型扫描:它通过FPDFPage_GetObject→FPDFTextObj_GetFont→FPDFFont_GetIsEmbedded遍历每一页的文本对象,并将未嵌入的已渲染字体报告为pvaiPdfiumFontNotEmbedded(ISO 19005 6.3.4),并加载每个文本页面以扫描FPDFText_HasUnicodeMapError并将损坏的 Unicode 映射报告为pvaiPdfiumUnicodeMapError(6.3.8)。这些是字节级检查器无法执行的检查 —— 它只能看到名称标记,而无法看到已解析的字体句柄或每个字符的映射状态 —— 并且合并到字节级结果中。独立的ValidatePdfACompliance字节级函数保持不变
Version 1.72.0
新增 (Added)
ValidatePdfA获得了五个新的TPdfAValidationIssue值(追加在末尾,现有值保持不变):pvaiNeedsRenderingPresent(PDF/A-2 6.4.2 — catalog 不应携带/NeedsRendering)、pvaiDestOutputProfileRef(PDF/A-3 6.2.3 — OutputIntent 不应携带/DestOutputProfileRef)、pvaiEmbeddedFileMissingUF(PDF/A-3 6.8 — 带有/EF的文件规范还应携带/UF)、pvaiXmpPacketBytesAttr(6.7.5 — XMP 数据包标头不应携带已弃用的bytes=或encoding=属性)以及pvaiAnnotationToggleNoView(PDF/A-2 6.3.2 — 禁止注释的/FToggleNoView 位,值 512)
Version 1.71.0
变更 (Changed)
ValidatePdfUa现在会引发pvuaiOrderedListMissingListNumbering(ISO 14289-1 7.6):结构树遍历器通过 Pdfium attribute API 解析每个L元素的ListNumbering布局属性,并标记任何不在 ISO 32000-1 表 347 集合 (Decimal,UpperRoman,LowerRoman,UpperAlpha,LowerAlpha,None,Circle,Disc,Square) 内的值。由于列表可能是无序的,缺失属性不会被标记;这填补了第 5 轮结束时记录的最后一个残留的 ISO 14289-1 差距
Version 1.70.0
新增 (Added)
ValidatePdfUa新增了 4 个TPdfUaValidationIssue值(追加序号,现有值保持不变):pvuaiSubsetMissingCidSet(ISO 14289-1 7.21.4.2 — CID 子集FontDescriptor必须声明/CIDSet),pvuaiToUnicodeForbiddenValue(7.21.7 — ToUnicode CMap 不得将任何代码映射到U+FEFF或U+FFFE;未压缩流将扫描<FEFF>/<FFFE>输出格式),pvuaiLangInvalidFormat(7.2 —/Lang必须是有效的 RFC 1766 / BCP 47 标记;宽容的语法接受en,en-US,zh-Hans,es-419并标记明显不符合规范的值),以及pvuaiOrderedListMissingListNumbering(7.6 — 为保持 API 完整性而保留;尚未由验证器引发,因为可靠地区分有序列表与无序列表需要ListNumbering属性值,而结构树遍历器未暴露该值)
Version 1.69.0
新增 (Added)
ValidatePdfUa新增了 2 个TPdfUaValidationIssue值(追加序号,现有值保持不变):pvuaiWidgetOutsideForm(ISO 14289-1 7.18.4 — Widget 结构元素必须嵌套在Form元素内;结构树遍历器现在会验证每个 Widget 的直接父类型) 和pvuaiSubsetMissingCharSet(7.21.4.2 — Type 1 子集FontDescriptor必须声明/CharSet,由/FontName上 6 个字母的+子集名称前缀标识)
Version 1.68.0
新增 (Added)
ValidatePdfUa新增了 2 个TPdfUaValidationIssue值(追加序号,现有值保持不变):pvuaiUriActionIsMap(ISO 14289-1 7.18.5 — URI action 字典不得携带值为true的/IsMap,因为它会禁用可访问的链接目标) 和pvuaiHeadingSequenceViolation(7.4.2 — 编号标题必须从H1开始,且降序序列不得跳过中间级别,例如H1→H3属于违规)。标题检查是验证器中第一个结构树级别的 PDF/UA 规则:ValidatePdfUaStructureElements现在会遍历强类型元素列表,并按文档顺序验证H1…H6(以及根据 7.4.3 的H7+)序列
Version 1.67.0
新增 (Added)
ValidatePdfUa新增了 5 个TPdfUaValidationIssue值(追加序号,现有值保持不变):pvuaiLinkMissingContents(ISO 14289-1 7.18.5 — Link annotation 必须通过/Contents携带替代描述),pvuaiAnnotationMissingContents(7.18.1 — 任何没有/Contents且未被豁免的 annotation 都必须具有替代描述;Popup 和 Widget 被豁免),pvuaiEmbeddedFileMissingName(7.11 — file specification 字典必须包含/F和/UF),pvuaiMediaClipMissingAlt(7.18.6.2 — media clip data 字典必须包含/CT和/Alt),以及pvuaiCidFontMissingCidToGidMap(7.21.3.2 — 嵌入的 Type 2 CIDFont 必须包含/CIDToGIDMap)
Version 1.66.0
新增 (Added)
ValidatePdfUa新增了 5 个TPdfUaValidationIssue值(追加序号,现有值保持不变):pvuaiRoleMapMissing(ISO 14289-1 7.1 — 具有非标准结构类型的带标签文档必须携带/RoleMap),pvuaiOptionalContentAsKey(7.10 — optional-content configuration 字典不得携带/ASauto-state 键),pvuaiXfaPresent(7.15 — 由于禁止动态 XFA,AcroForm 的/XFA存在将被标记),pvuaiTrapNetAnnotation(7.18.2 — 禁止使用/TrapNetannotations),以及pvuaiReferenceXObject(7.20 — 禁止使用基于/Ref标记的 Reference XObjects)
修复 (Fixed)
ValidatePdfUa不再对每个加密文件误报pvuaiEncryptionPresent:只要 encryption 字典的/P键设置了第 10 位(值 1024)以授予辅助技术访问权限 (7.16),PDF/UA 就允许加密。现在精确的违规行为通过新增的pvuaiEncryptionPBitMissing报告;pvuaiEncryptionPresent在枚举中保留以维持 API 兼容性,但不再由字节级验证器引发
Version 1.65.0
新增 (Added)
ValidatePdfA新增了 5 个TPdfAValidationIssue值(追加序号,现有值保持不变):pvaiCidFontMissingCidToGidMap(ISO 19005-1 6.3.3.2 Cor.2 — 嵌入的 Type 2 CIDFont 必须携带/CIDToGIDMap),pvaiSubsetMissingCharSet(6.3.5 — Type 1 子集FontDescriptor必须携带/CharSet),pvaiSubsetMissingCidSet(6.3.5 — CID 子集FontDescriptor必须携带/CIDSet),pvaiWidgetActionForbidden(6.6.1 — Widget annotation 不得携带/A或/AA),以及pvaiOptionalContentAsKey(ISO 19005-2 6.9 — optional-content configuration 字典不得携带/ASauto-state 键,由于 PDF/A-2 允许可选内容,该项变为相关)
Version 1.64.0
新增 (Added)
ValidatePdfA新增了 8 个TPdfAValidationIssue值(追加序号,现有值保持不变):pvaiHeaderBinaryMarkerMissing(ISO 19005-1 6.1.2 —%PDF-x.yheader 后面必须跟一个包含至少四个大于 127 的字节的%注释),pvaiExternalStreamRef(6.1.7 — stream 字典不得携带/F、/FFilter或/FDecodeParms),pvaiOutputIntentScheme(6.2.2 — OutputIntent 的/S必须为/GTS_PDFA1),pvaiInfoXmpDateMismatch(6.7.3 — Info 的CreationDate/ModDate必须同时以xmp:CreateDate/xmp:ModifyDate形式出现),pvaiMarkInfoMissing(6.8.2.2 — Level A 要求带有/Marked true的/MarkInfo),pvaiAnnotationApDictViolation(6.5.3 Cor.2 — annotation 的/AP字典只能包含/N),pvaiEmbeddedFileMissingAFRelationship(ISO 19005-3 Annex E.2 — 每个相关的 filespec 必须携带/AFRelationship),以及pvaiJpeg2000Violation(ISO 19005-2 6.2.8.3 — JPEG2000 图像必须声明 1、3 或 4 个 components)
修复 (Fixed)
ValidatePdfA不再对使用单字母字体资源名称(例如/Font << /F 5 0 R >>)的文档误报pvaiAnnotationFlagsViolation;/F标志扫描现在受到 annotation 上下文(某个 annotation 类型的/Subtype)的限制,这与文档记录的行为一致 (6.5.3)ValidatePdfA现在按文件报告 PDF/A-3 相关文件(associated-file)要求:只有当通过/EF引用嵌入流的嵌入式/Type /Filespec缺少/AFRelationship时,文档才会被标记,而不是之前针对整个文档的“全有或全无”检查 (ISO 19005-3 Annex E.2)- 将废弃的
/SetStateaction 与/SetOCGState一起添加到了被禁用的 action 集合中,以便可以直接捕获 PDF Reference 的 action 名称 (6.6.1)
Version 1.63.0
新增 (Added)
- 新增
TPdf.MeasureText与TPdf.MeasureTextWidth:在不向页面添加内容的前提下测量指定字体与字号下文本的渲染宽高(PDF 用户单位,1 单位 = 1/72 英寸),便于在AddText之上实现版面布局与自动换行;由独立单元FPdfMeasure以 class helper 形式提供
变更 (Changed)
Demo\Delphi\MergePDF、Demo\CBuilder\MergePDF与Demo\Lazarus\MergePDF三端增强:支持每文件页范围选择、输出路径可选、添加去重、运行日志、取消按钮与合并完成汇总,并在首个源导入时携带书签 / 元数据CreatePDF三端示例新增“欧洲文本”选项,可写入带重音的捷克语 / 法语 / 德语 / 西班牙语 / 葡萄牙语 / 波兰语 / 土耳其语文本,用于检查字体选择与 Unicode 处理(原EuropeanText示例已并入)- 移除
ExtractTextPages与EuropeanText两个示例:ExtractTextPages的逐页文本输出能力已由ExtractText的页范围与页分隔符选项覆盖;EuropeanText的多语言文本渲染已并入CreatePDF
Version 1.62.2
修复 (Fixed)
- 重新生成了适用于所有 RAD Studio 版本和平台(Win32/Win64/Win64x)的 C++Builder 头文件(
.hpp);它们已偏离 Pascal 源码,留下过时的函数签名和缺失的单元,并通过源代码发行版传给了 C++Builder 用户
Version 1.62.1
修复 (Fixed)
- 恢复了 RAD Studio 12 Athens 及更早版本上的源码编译:PDF/UA 验证路径中的
TArray<Byte>赋值使用了仅 Delphi 13 才有的隐式数组转换,在旧 IDE 上无法编译
Version 1.62.0
新增 (Added)
TPdf.RenderPageThumbnail可将任意索引页渲染为按比例适配的位图,不会更改文档当前页、已加载页,也不会触发OnPageChange
修复 (Fixed)
TPdfThumbnailView在绘制时不再驱动宿主文档的PageNumber;此前每次重绘都会重新加载页面、触发OnPageChange并丢弃文本页,这可能干扰关联的TPdfView并引发重绘循环。缩略图现在通过RenderPageThumbnail渲染,不再产生这些副作用- PDF/X 一致性验证现在会检查交叉引用流文档(PDF 1.6,PDF/X-4 的常见形式)以及存放在压缩对象流中的对象,而不再把这类文件整体判为不一致;
GTS_PDFXVersion标记现在会同时从元素形式和 RDF 属性形式的 XMP 中读取 - 当 Info 字典与 XMP 在 Producer 或 Creator 上不一致时,PDF/R 验证现在会报告
pvriInfoXmpMismatch;这个问题之前只是声明过,却从未真正抛出 - 表单填充计时器现在按请求跟踪,因此某个文档即使同时运行多个计时器(例如 JavaScript interval 和字段光标闪烁)也会保留全部计时器,而不会只剩下最新的那个
TPdfView的绘制及其公开的RenderPage/RenderTile方法现在会持有文档渲染锁,从而与同一TPdf的工作线程渲染串行化(PDFium 不是线程安全的)- 写入 PDF/X、PDF/R 和 PDF/VT 元数据的非 ASCII 文本(OutputIntent 条件名、Creator、Producer)现在会按 ISO 32000-1 §7.9.2.2 编码为 UTF-16BE 字符串,而不再是原始 UTF-8,符合规范的读取器不会再误读
- 一致性辅助函数现在能正确读取
/Length为间接引用的嵌入元数据流,使用ReadBuffer加载源字节(因此短读会干净失败),并拒绝负的startxref偏移,而不是冒着越界读取的风险
Version 1.61.0
变更 (Changed)
- 修正了 FFI/ABI 声明,可能需要重新编译实现了受影响回调的代码:
FFI_OpenFile表单填充回调现在带有cdecl(Win32 栈约定),而value参数现在在FPDFAnnot_SetStringValue和FPDFAttachment_SetStringValue中声明为FPDF_WIDESTRING(UTF-16LE),以匹配 PDFium 头文件 - 渐进式加载回调
FX_FILEAVAIL.IsDataAvail和FX_DOWNLOADHINTS.AddSegment现在采用size_t偏移,而size_t在 Free Pascal / Lazarus Win64 上具有指针宽度(之前会截断为 32 位),从而修复了 FPC Win64 上的数据可用性以及outsize_tAPI 调用
修复 (Fixed)
- 内存安全:在销毁带有活动 AcroForm 光标的
TPdf时,表单填充计时器发生了 use-after-free;FPDF_CloseDocument在ImportNPagesToOne的错误路径上不再被重复调用;保存和插入 JPEG 时,Pascal 异常不会再跨越 C 边界从FPDF_FILEWRITE/FPDF_FILEACCESS回调中逸出;以及在从起始索引读取到页面末尾时出现的文本提取整数溢出也已修复 TPdfFuture<T>现在能够可靠地交付结果回调;此前由于工作线程在排队回调运行前就已自行释放,回复几乎总会丢失,而且还可能碰到已释放线程- PDF/A、PDF/X、PDF/E、PDF/R、PDF/VT 和 PDF/UA 输出现在会写入恰好 20 字节的交叉引用条目,符合 ISO 32000-1 §7.5.4 的要求
- 标准标记注入在移除的键(例如
/Trapped)恰好是最后一项时,不再销毁字典,这个问题此前会吞掉结尾的>>并生成损坏对象 - OutputIntent ICC profile 流现在会为 PDF/X 和 PDF/VT 声明所需的
/N分量数(PDF/A 已经具备);在注入 PDF/X、PDF/E、PDF/R、PDF/VT 和 PDF/UA 标记之前,先对加密源文档进行解密,因此输出是有效的,而不是被静默破坏 - 生成的 XMP 中 UTF-8 xpacket BOM 现在会按精确字节写出,修复了 ANSI code page 不是 Latin-1 的 Delphi 安装上的损坏;增量更新 trailer 现在会保留文档
/Info引用 - 带压缩的
SaveAs不再截断其/Length为间接引用的流,而重建后的交叉引用表现在使用 20 字节条目、真实生成号,并移除了过时的/Prev指针 - 一致性验证现在会读取 PDF/E 和 PDF/X 的属性形式 XMP 版本标记(因此可以识别以属性序列化的 PDF/X-4 文件),要求精确的
PDF/E-1标识符,正确读取间接/Length的元数据流,并且在检查 PDF/UA trailer 时不再把结构元素的/ID或/StructTreeRoot键误判为匹配;畸形的startxref偏移也不再抛出范围错误 TPdfThumbnailView:最后一页现在可通过滚动条到达,缩略图绘制后会恢复宿主文档的当前页,并且标准的 mouse-leave 处理会再次分发- 灰度页面和图像位图不再使用错误调色板渲染;
TPdfView在其所属的TPdf先被释放时,也不会再留下悬空引用 - 预检报告:HTML 现在以 UTF-8 保存以匹配其声明的字符集,而 JSON 字符串转义在 Free Pascal 上会为非 ASCII 字符生成正确的
\u序列 - 试用版构建:试用提醒对话框现在会正常出现,而不会在显示前被抑制
TPdfStreamAdapter现在会对大于 4 GiB 的流返回明确错误,而不是静默截断传给 PDFium 的长度
Version 1.60.1
变更 (Changed)
- Delphi、Lazarus 和 C++Builder 的 AccessibilityReader 示例现在改为在
TPdfReadingSession上执行朗读:每一页都会通过BuildSpokenTextFromWords组装成一个语音块,SAPI 字词位置驱动FeedSpokenPosition,会话负责推进页面并驱动视图的字词光标,从而取代了每个示例先前手写的编排 - 示例中的字级 karaoke 跟踪现在在 NVDA 作为语音引擎时也能工作:
EstimatePacing会依据已用朗读时间来调节阅读光标,而此前 NVDA 完全没有字词跟踪 - 示例中的 Pause 和 Resume 现在也能与 NVDA 配合:
ResumeRestartsChunk会在 Resume 时从当前页开头重新朗读该页,而 SAPI 仍保留其原生的原地暂停与恢复
Version 1.60.0
新增 (Added)
TPdfView上的实时低视力渲染:新的reInvert和reNightDuotone渲染选项会在绘制搜索、选择、阅读和字词光标叠加层之前,先为每个已渲染页面瓦片重新着色(完全反色或夜间双色调配色),把现有位图颜色转换带入单页和对开页布局的交互查看器;切换选项会立即重绘NightDuotoneInk和NightDuotonePaper用于配置夜间配色,默认是在黑色页面上显示琥珀色文字;当两项都设置时,reInvert优先
Version 1.59.0
新增 (Added)
TPdfReadingSession:一个与语音引擎无关的朗读编排组件。它会维护块光标、字词光标和播放状态(Play/PlayFrom/Pause/Resume/Stop),推进已加载的TPdfSpokenText块时由宿主通过Tick报告引擎空闲,把朗读文本偏移量映射回页面字符,并自动驱动附加的TPdfView字词光标;宿主通过OnSpeak以及取消 / 暂停 / 恢复请求事件接入任意语音引擎,因此库本身不链接任何语音 APIFeedSpokenPosition会消费引擎字词位置(例如 SAPIStatus.InputWordPosition);EstimatePacing配合EstimatedWordsPerMinute可为没有位置信号的引擎调节节奏;ResumeRestartsChunk会为没有原生暂停能力的引擎重新朗读当前块OnChunkChange、OnWordChange和OnFinished只在真正发生变化时触发,而已释放的附加视图会自动解除绑定,因此宿主代码可以保持无闪烁且不易崩溃
Version 1.58.0
新增 (Added)
EstimateSpokenWordIndex会根据已用时间和每分钟词数估算语音引擎当前在朗读哪个词,给更长的词按比例分配更多时间,因此不报告字词位置的引擎(例如 NVDA controller client)也能驱动字级阅读光标;调用方提供已用时间,所以该例程不依赖时钟,也便于单元测试
Version 1.57.0
新增 (Added)
- 支持用于朗读跟踪的双域映射语音文本组装:
BuildSpokenTextFromWords和SpokenTextAppend会根据页面词框构建交给文字转语音引擎的字符串,同时记录跨度表,而SpokenToPageChar会把引擎报告的朗读偏移量(例如 SAPIStatus.InputWordPosition)映射回页面字符索引,因此当朗读文本不是整页文本时(例如跳过区域、按单元朗读、发音覆盖)字级高亮跟踪仍然正确 TPdfSpokenText和TPdfSpokenSpan类型会同时携带朗读字符串以及其构建来源的页面范围;插入分隔符上的偏移会解析到下一个已映射词,而超出已映射片段的偏移会报告无匹配
Version 1.56.9
新增 (Added)
Demo\Delphi\PreflightReport增加了 Action Plan 预览,可将未通过的标准、优先级、下一步操作、问题代码和建议汇总成整改清单Demo\Delphi\PreflightReportCli在单文件和批量运行中接受plan/actionplan作为输出格式,并把同一份整改清单写入文本文件
变更 (Changed)
- 两个 Delphi PreflightReport 示例现在都会在标准总数和问题总数旁边显示通过 / 动作 / 复核状态计数
Version 1.56.8
变更 (Changed)
ViewerInteractionLab现在新增页面跳转控件、手动缩放控件、基于点击的DeviceToPage/PageToDevice坐标记录,以及更清晰的交互日志,可用于选择、搜索、旋转和导航检查ViewerInteractionLab的 readme 页面现在在本地化 demo readme 集合中补充了新增的交互流程说明
Version 1.56.7
新增 (Added)
AccessibilityWorkbenchCli将每个触发的发现项都映射到对应的 WCAG 2.1 成功标准和 ISO 14289-1(PDF/UA-1)条款区域,并在报告中展示标准覆盖段落AccessibilityWorkbenchCli计算有文档说明的 0-100 可访问性评分,使用公开的处罚规则,并以 excellent / good / needs work / poor 分段输出,按单文件和批量平均两种粒度展示AccessibilityWorkbenchCli接受failscore=N,当任一文件得分低于 N 时本次运行会失败(退出码 2)AccessibilityWorkbenchCli在批量汇总文件名以.sarif结尾时写入 SARIF 2.1.0 日志,每类发现对应一条规则,报告里携带其 WCAG 2.1 与 PDF/UA 标签,便于 CI 与代码扫描工具接入AccessibilityWorkbenchCli新增version命令,用于输出绑定的 PDFium Delphi Component 版本号
Version 1.56.6
新增 (Added)
IntakeWorkbenchCli为每个输入文件计算 SHA-256 取证哈希(会降级为unavailable,适用于不支持System.Hash的编译器),并在每种输出格式中报告IntakeWorkbenchCli接受passwords=file.txt,用于从候选列表中试解锁受密码保护的文档,并记录匹配到的候选项序号,不记录密码文本内容IntakeWorkbenchCli接受copyto=dir,将每个已审查文件路由到按风险级别划分的子文件夹,让审计器可直接充当 intake 分拣器IntakeWorkbenchCli在批量汇总文件名以.sarif结尾时写入 SARIF 2.1.0 日志,每个风险标记对应一条规则,每个被标记文件输出一条结果,供 CI 与代码扫描接入IntakeWorkbenchCli新增version命令,用于输出绑定的 PDFium Delphi Component 版本号
Version 1.56.5
新增 (Added)
IntakeWorkbenchCli现在会推导推荐的后续处理动作,例如 accept、request-password、manual-review、quarantine 和 deduplicate,并在批量汇总中暴露动作计数AccessibilityWorkbenchCli现在会推导推荐的修复动作,例如 pass-through、remediate-tags、run-ocr、remediate-semantics 和 manual-review,并提供对应批量动作计数
变更 (Changed)
- 两个工具级 CLI 示例现在都在 console、text、HTML、JSON 和 CSV 输出中显示推荐动作,使批处理人员在无需再次处理风险字段或状态字段的情况下即可分流文件
Version 1.56.4
修复 (Fixed)
- 在循环中读取注释、书签或链接注解时,不会再泄露上一个条目的文本字符串:
TPdfAnnotation、TBookmark与TLinkAnnotation的结果记录现在使用“带托管类型意识”的初始化进行清空,而不是原始内存清零,从而防止包含大量文字注解的文档在应用生命周期内持续占用进程内存 - 销毁一个
TPdf时,如果它注册过OnUnsupportedFeature处理程序,就会将其从进程级 PDFium 回调中解绑,因此后续来自另一个未配置自身处理程序的TPdf实例的文档加载,不会再被分发到已释放组件(use-after-free)
Version 1.56.3
修复 (Fixed)
AccessibilityWorkbenchCli不再将空白页当作启发式阅读顺序页处理,因此带有空分隔页的标记化文档会保留正确的可访问性状态,且可读内容为空的页面会单独上报AccessibilityWorkbenchCli的表头检测不再把嵌套表格中的TH单元归属于外层表格,表单字段和字体名称采用区分大小写匹配,因此不同字段不会被误合并IntakeWorkbenchCli的 URL host 清单会剥离 userinfo、query 与 fragment 部分,因此像[email protected]这类构造链接会归属到真实主机,且mailto:目标会贡献其域名而不会被忽略IntakeWorkbenchCli的 Markdown 报告会对攻击者可控路径、主机和附件名称中的反引号进行转义,避免文档内内容破坏报告格式
变更 (Changed)
AccessibilityWorkbenchCli将字体扫描失败和表单字段扫描失败分开计数,标记既有嵌入实例也标记非嵌入字体,并对过长字体清单加上明确的截断标记IntakeWorkbenchCli的批量汇总新增附件注解计数字段,单页注解统计上限为每页 20000 条,并在每种输出格式中上报该上限
Version 1.56.2
新增 (Added)
AccessibilityWorkbenchCli现在审计字体嵌入、表单字段 tooltip、阅读顺序来源、文档大纲、表格与列表结构、可疑替代文本以及更丰富的逐页复核细节,使 accessibility 批处理报告能够识别更多修复目标IntakeWorkbenchCli现在报告页面扫描上限、launch 与 remote-go-to 动作、URI host 清单、注解数量、不受支持的 PDFium 特性、重复文档标识符以及更完整的自动 intake 复核风险标记
变更 (Changed)
IntakeWorkbenchCli在单文件和批处理模式中接受maxpages=N,用于限制每个文档的页面扫描数量,同时仍完成 metadata、attachment、script、XFA、signature 和 risk 报告
Version 1.56.1
修复 (Fixed)
- 加载缺少较新导出的旧版
pdfium.dll现在会干净地失败:失败路径会重置每个已绑定的 API 入口点,因此Assigned()检查(例如FPDF_GetLastError或FPDF_GetSecurityHandlerRevision)会报告库未加载,而不是调用已经卸载的模块并因访问冲突崩溃 UnloadLibrary现在会清除所有 PDFium API 绑定,而不只是可选的 V8 辅助函数,因此 DLL 释放后不会留下陈旧函数指针
Version 1.56.0
新增 (Added)
TPdfView上的逐词卡拉 OK 朗读光标:TrackReadingWordAt将文本转语音引擎的当前词字符偏移,例如 SAPIStatus.InputWordPosition,映射到页面词框,高亮包含该偏移的词,在朗读块上方绘制独立叠加层,将其滚动到视图中,并返回词索引,让正在朗读的词随语音前进而亮起SetReadingWord和ClearReadingWord可直接从TPdfWordBox设置或清除高亮词;重复设置同一个词不会产生操作,因此逐词跟踪不会让视图闪烁ReadingWordColor和ReadingWordFollow控制词光标颜色以及视图是否自动滚动到正在朗读的词
Version 1.55.2
修复 (Fixed)
- ViewerInteractionLab 现在为工具栏各行提供更多垂直空间,因此 Open PDF、Create Sample、导航、搜索和选择控件在缩放字体下不再重叠
Version 1.55.1
修复 (Fixed)
- ViewerInteractionLab 现在把 Prev、Next 和 Rotate 放在第二行工具栏,避免启动时与 Open PDF 和 Create Sample 重叠
Version 1.55.0
新增 (Added)
- 为“朗读并选择”流程提供词到选区的桥接:
TPdfView.SelectWordBox和SelectWordSpan可按字符范围选择PageWordBoxes中的单个词框或同页词框范围,因此当前朗读的词或行也能被选中和复制 WordBoxIndexAtCharIndex可把字符下标映射回包含它的词框,驱动 TTS 朗读光标前进时的逐词高亮
Version 1.54.0
新增 (Added)
- 直接从逻辑光标读取当前字段的语音表单填写访问器:
FocusedFormFieldValue、FocusedFormFieldName和FocusedFormFieldDetails在TPdf和TPdfView上会报告当前字段的值、可读名称(/TU提示文本,不存在时回退到/T)以及完整的TPdfFormFieldInfo(类型、标志、选项),足以让语音界面在逐字段遍历表单时进行播报
修复 (Fixed)
FocusedFormFieldValue现在按FocusedFormFieldIndex读取字段,而不是依赖 pdfium 的交互焦点,因此即使屏幕上没有文本光标,语音驱动的表单填写器也能拿到正确的字段值(现有的FocusedFormFieldText仍然反映 pdfium 焦点,行为不变)
Version 1.53.0
新增 (Added)
- 字级高亮支持:
TPdf.PageWordBoxes和TPdfView.PageWordBoxes会把页面拆分成TPdfWordBox记录,每条记录都携带单词文本、字符范围和页面坐标矩形,因此辅助阅读器可以把该矩形传给SetReadingHighlight,按朗读进度逐词高亮内容 BuildWordBoxes把页面文本拆分为 TPdfWordBox 记录,包含词文本和 FTextPage 字符范围
Version 1.52.0
新增 (Added)
- 低视力渲染辅助函数
InvertPdfBitmap、GrayscalePdfBitmap和DuotonePdfBitmap会对已渲染的 32 位位图执行原地颜色变换,因此辅助阅读器可以向低视力用户提供反色 / 深色模式、灰度或自定义双色方案(例如深色背景配浅色文字)的页面视图 - 这些变换逐像素执行,在 VCL 和 Lazarus/LCL 上的行为一致,位图尺寸保持不变
Version 1.51.0
新增 (Added)
- 面向辅助听读的句子级阅读单元:
TPdf.ReadingUnits、TPdf.DocumentReadingUnits和TPdfView.ReadingUnits会把可读内容流线性化为按顺序排列、以句子为单位的TPdfReadingUnit记录,每条记录都携带要朗读的文本、语义类别、页码、高亮矩形和语言标签,因此屏幕阅读器应用可以按一次一个朗读单元的方式遍历单页或整份文档 NextReadingUnitOfKind查找下一个或上一个 Kind 匹配指定 TPdfContentFragmentKind 的 TPdfReadingUnitBuildReadingUnits可直接把任意TPdfContentFragments转换为阅读单元:标题以及图形 / 替代文本描述会保持完整,段落会按句子边界拆分,小数点不会被误切开,阅读光标则只是一个由调用方持有的普通索引
Version 1.50.0
新增 (Added)
ValidatePdfA现在可以检查将 catalog、OutputIntent 或其他字典存放在压缩的 object stream(/Type /ObjStm)中的 PDF 1.5+ 文档。这些 object stream 会被解压,其中承载的对象也会被解析,因此此类文档将按其实际内容进行校验,而不再被报告为缺少 PDF/A 标识
Version 1.49.5
修复 (Fixed)
ValidatePdfA不再将缺少pdfaExtension:schemas描述报告为问题。PDF/A 标识符 schema(pdfaid)是众所周知的,因此无论 veraPDF 还是 PDF/A-2/-3 都不要求为其提供 extension-schema 描述;而将其缺失标记为问题会导致每个合规的第三方 PDF/A 都被误报。本库自身生成的文档仍会包含该描述
Version 1.49.4
修复 (Fixed)
ValidatePdfA现在能够在 PDF/A 标识符以 XML 属性形式(pdfaid:part="2")而非子元素形式书写时检测出一致性级别,因此采用属性形式的文档不再被报告为级别未知。这同时修正了一个连锁问题:未能检测到级别会使针对特定 part 的检查回退到严格的 PDF/A-1 规则,从而错误地标记 PDF/A-2 和 PDF/A-3 允许的嵌入文件和透明度
Version 1.49.3
修复 (Fixed)
ValidatePdfA现在会检查交叉引用数据为 cross-reference stream 的 PDF 1.5+ 文档(即不含trailer关键字的文件)。一致性级别、trailer/ID以及其他标识会从 cross-reference stream 字典中读取,因此此类文档将按其实际内容进行校验,而不再被报告为完全不合规
Version 1.49.2
修复 (Fixed)
ValidatePdfA不再对嵌入了全部字体的文档误报未嵌入字体问题。此前的启发式做法是将/FontDescriptor标记的数量与已嵌入字体程序进行比较,但每个嵌入字体会贡献两个/FontDescriptor标记(字体字典引用加上 descriptor 对象),因此每个嵌入了字体的文件都会被错误标记。该检查现在仅当文档引用了字体却完全没有嵌入任何字体程序时才会报告,与相应的ValidatePdfUa修正保持一致
Version 1.49.1
修复 (Fixed)
- PDF/A 输出现在可通过 veraPDF 校验为合规的 PDF/A-1b 和 PDF/A-1a:嵌入的 sRGB OutputIntent ICC profile 流(由
/DestOutputProfile引用)现在会按照 ISO 19005-1 6.2.3.2 的要求声明所需的/N组件数量(内置 RGB profile 为 3)。此前由SaveAsPdfA生成的文档因为目标 profile 流省略了/N而无法通过严格的 PDF/A-1 校验;该值由 ICC profile 头部推导得出,因此调用方提供的 CMYK 或 Gray profile 也会获得正确的数量
Version 1.49.0
修复 (Fixed)
ValidatePdfUa不再对合规的已标记 (tagged) PDF 误报缺失 XMP 标识——PDF/UA 标识符 (pdfuaid:part)、dc:title、XMP 日期以及 trailer/ID现在从原始文档字节读取,而非从重新保存的副本读取;该副本会丢失/MetadataXMP 流,对于 cross-reference-stream 文件还会丢失 trailer/ID- 修正
ValidatePdfUa的字体嵌入检查,使已嵌入全部字体的文档不再被报告为含有未嵌入字体;现在仅当文档引用了字体却完全没有嵌入任何字体程序时才会标记 ValidatePdfUa现在接受Formula结构元素在ActualText中提供替代文本,而不是要求使用Alt条目(ISO 14289-1 §7.7),这与现有的Figure规则保持一致
Version 1.48.0
新增 (Added)
TPdfView上的程序化文本选择:SelectTextRange(按页和字符范围)和SetSelection(按每页显式范围)可从代码中选择文本——例如读取并高亮某个段落;两者在选择发生变化时都会重绘并触发OnSelectionChange。SelectionRanges以每页字符范围的形式读取当前选择,SelectionRectangles则以页面坐标返回其矩形,用于自定义高亮或滚动定位
Version 1.47.0
新增 (Added)
TPdf和TPdfView上均提供用于语音驱动表单填写的表单字段导航:FormFieldTabOrder、FocusedFormFieldIndex、FocusFormField、FocusNextFormField、FocusPreviousFormField、ClearFormFieldFocus和FocusedFormFieldText。它们按 Tab 顺序在页面的控件 (widget) 字段上移动一个逻辑字段光标(到两端时回环),使辅助阅读器可以逐个遍历表单,通过FormFieldInfo[Index].AlternateName(即 /TU 提示文本)播报每个字段,并通过FormField[Index]进行填写TPdfView.OnFormFieldFocusChange事件:在字段光标移动时触发(携带新的字段索引,清除焦点时为 -1)
Version 1.46.0
新增 (Added)
- 辅助性朗读阅读内容流:
TPdf.ReadableContent、TPdf.ReadablePageContent、TPdf.DocumentReadableContent和TPdfView.ReadableContent返回一个有序的语义化TPdfContentFragment项目列表,每一项都携带朗读文本(真实字形,或图形的ActualText/Alt)、片段类型(带级别的标题、段落、图形、列表项、表格单元格、链接、纯文本)、语言、从 1 开始的页码,以及块级和逐行高亮矩形。已标记 (tagged) 的 PDF 会按结构树中的逻辑阅读顺序线性化;未标记 (untagged) 的页面则回退到渲染顺序,因此任何文档都可以被朗读出来 TPdfView上的同步阅读高亮:SetReadingHighlight、ClearReadingHighlight以及已发布的ReadingHighlightColor会在搜索和选择叠加层之上,高亮当前正在朗读的块- 新增公共类型
TPdfContentFragment、TPdfContentFragments、TPdfReadableContent、TPdfContentFragmentKind和TPdfReadingOrderSource,以及新的辅助方法ClassifyStructType
Version 1.45.0
新增 (Added)
ValidatePdfUa现在还会遍历实时标记结构树,并报告三类字节级扫描无法检测的高置信度内容违规:没有 Alt 条目也没有 ActualText 的Figure元素(ISO 14289-1, 7.3)、缺少 Alt 属性的Formula元素(7.7),以及缺少唯一 ID 的Note元素(7.9)。三个新的TPdfUaValidationIssue枚举值用于标识这些问题:pvuaiFigureMissingAlt、pvuaiFormulaMissingAlt和pvuaiNoteMissingId。对于未标记的文档,结构树遍历将被跳过- 新增公共辅助方法
ValidatePdfUaStructureElements,可将上述结构树规则应用于扁平元素列表(如TPdf.StructureElements返回的列表),从而无需加载完整文档即可运行或单元测试相关检查
Version 1.44.5
修复 (Fixed)
ValidatePdfA字体嵌入检查(pvaiFontNotEmbedded,ISO 19005-1, 6.3.4)现在还能检测不含/FontDescriptor的未嵌入简单字体,尤其是 14 种标准 Type 1 字体(Helvetica、Times、Courier 等)——PDF/A 不为这些字体提供任何嵌入豁免。此前此类字体会被忽略;此检查现在还会将简单字体字典(/Type1、/TrueType、/MMType1)纳入已嵌入字体程序的计数中,与 1.44.3 中针对 PDF/UA 的修复保持一致
Version 1.44.4
修复 (Fixed)
ValidatePdfVT现在会拒绝格式错误的 ISO 16612-2 §6.5 DPart 树:例如/DParts是扁平引用数组而不是规范要求的 array of arrays,或 leaf DPart 在只包含一页的范围内把/Start页面重复写成/EndValidatePdfVT现在会在展开/NodeNameList名称中的 PDF name#xxescape 后,将其校验为 XML NMTOKEN 值,因此无效的层级名称会通过pvviMissingDPartRoot报告,而不会被当作可用 DPart 结构接受
Version 1.44.3
修复 (Fixed)
ValidatePdfUa字体嵌入检查(pvuaiFontNotEmbedded,ISO 14289-1, 7.21.4)现在还能检测不含/FontDescriptor的未嵌入简单字体,尤其是 14 种标准 Type 1 字体(Helvetica、Times、Courier 等)——PDF/UA 不为这些字体提供嵌入豁免。此前此类字体会被忽略,使用了这些字体的文档可能被错误地报告为合规;此检查现在还会将简单字体字典(/Type1、/TrueType、/MMType1)纳入已嵌入字体程序的计数中
Version 1.44.2
修复 (Fixed)
ValidatePdfVT现在会在存在但无法识别的pdfvtid:GTS_PDFVTVersion标记时保留pvcUnknown,而不是降级为pvcNone。这让PDF/VT-2s这类无效的文件级字符串能够与完全没有 PDF/VT 标记的文档区分开;PDF/VT-2s 按 ISO 16612-2 Annex A 由 MIME stream header 标识,而不是由 PDF 文件的 XMP 标记标识/DPartRoot检查现在会更严格地验证 ISO 16612-2 §6.5 tree semantics:/DPartRootNode和/NodeNameList必须描述实际的 DPart 深度,DPart parent links 必须形成一棵树,/Start与/DParts互斥,并且每一页的/DPart必须指向覆盖该页的 leaf DPart,且顺序与 page tree 的 depth-first 顺序一致
Version 1.44.1
修复 (Fixed)
SaveAsPdfVT现在会在源 PDF 缺少可用/DPartRoot时写入最小的 ISO 16612-2 §6.5 Document Part Hierarchy。生成的树会通过/DPart关联每一页,保留已有的有效层次结构,并把更丰富的收件人/DPM 元数据留给调用方工作流ValidatePdfVT现在会验证可用的 DPart 结构,从 RDF 属性和元素文本两种形式读取 PDF/VT XMP 值,并强制精确的 PDF/VT 与 PDF/X 基础配对:PDF/VT-1 必须是 PDF/X-4,而 PDF/VT-2 必须是 PDF/X-4p、PDF/X-5g 或 PDF/X-5pgTPdfVTSaveOptions.Conformance = pvc2不再写出无效的单文件 PDF/VT-2 标记。单文件写入器会将输出规范化为 PDF/VT-1,因为 PDF/VT-2 需要文件集语义
Version 1.44.0
新增 (Added)
ValidatePdfUa现在除文件格式标记外,还会报告可通过字节检查的内容级 PDF/UA 违规项:未嵌入的字体程序(ISO 14289-1, 7.21.4)、在没有豁免简单字体编码的情况下缺少/ToUnicodeCMap 的字体(7.21.7),以及携带注释但未在页面上声明/Tabs /S制表符顺序的文档(7.18.3)- 三个新的
TPdfUaValidationIssue值——pvuaiFontNotEmbedded、pvuaiFontMissingToUnicode和pvuaiMissingTabsOrder——由ValidatePdfUa及预检报告呈现。它们是粗粒度启发式检测,定位为预检提示,而非完整的 ISO 14289-1 验证
Version 1.43.1
修复 (Fixed)
SaveAsPdfUa现在会强制写入 ISO 14289-1, 7.1 所要求的/ViewerPreferences/DisplayDocTitle true以及/MarkInfo/Marked true/Suspects false目录条目,即使源文档已提供这些字典但其中存在缺失或相互冲突的值亦然。此前,这些标记仅在字典完全缺失时才会注入,因此若源文档已包含/ViewerPreferences但缺少DisplayDocTitle,或/MarkInfo中/Marked false,保存后的文件将不符合规范- 预先存在的
/ViewerPreferences或/MarkInfo字典中的现有键会被保留,且若字典以间接引用的形式提供,会在写入必需键之前先行解引用
Version 1.43.0
新增 (Added)
ValidatePdfA现在会针对嵌入文件与关联文件以及 Level U 文本应用 PDF/A-2 / PDF/A-3 规则。PDF/A-1 仍然拒绝嵌入文件;对于 PDF/A-3,缺少所需/AFRelationship键(ISO 19005-3 附录 E)的嵌入文件会被标记出来,而 PDF/A-2 的附件则被允许(不会递归校验其自身的合规性)。新增的pvaiUnicodeMappingMissing问题会报告其字体不带任何/ToUnicode映射的 PDF/A-2u 或 PDF/A-3u 文档(ISO 19005-2 6.2.11.7)。透明度与可选内容仍然仅针对 PDF/A-1 标记
Version 1.42.0
新增 (Added)
- 现在
SaveAsPdfA、ValidatePdfA以及PdfAConformance属性已在全部三个合规级别(a、b 和 u)上支持 PDF/A-2(ISO 19005-2)和 PDF/A-3(ISO 19005-3)。TPdfAConformance枚举新增pac2a、pac2u、pac3a和pac3u(PDF/A-1 没有 Level u)。保存时会写入相匹配的pdfaid:part(2 或 3)和pdfaid:conformance(A、B 或 U),并保留 ISO 19005-2 出于兼容性而沿用的GTS_PDFA1OutputIntent 子类型。当文档缺少某级别所要求的标记结构时,Level A 请求仍会降级为相匹配的 Level B(适用于任何 part)
Version 1.41.0
新增 (Added)
ValidatePdfA现在会检测标记注入无法修复的内容级 PDF/A 违规,作为对它原本就已报告的结构性标记的补充:JavaScript 及其他被禁止的动作、附加动作(/AA)、嵌入文件、LZWDecode、透明度(软蒙版与透明组)、可选内容(/OCProperties)、被禁止的注释子类型(FileAttachment、Sound、Movie、3D、Screen)、AcroForm 的/NeedAppearances true与/XFA、其字体描述符缺少嵌入字体程序的字体,以及在缺少 ISO 19005-1 6.8 所要求的标记结构的情况下作出的 Level A 声明。透明度、可选内容与嵌入文件检查仅适用于 PDF/A-1(这些特性在 PDF/A-2 和 PDF/A-3 中是允许的)。新增的TPdfAValidationIssue值会呈现每一种情况;现有的值保持不变
Version 1.40.3
修复 (Fixed)
SaveAsPdfA现在会在生成 PDF/A 输出之前剥离源文档的任何加密。ISO 19005-1 6.1.3 禁止 trailer 中出现/Encrypt键,但此前的保存路径会保留源文档的安全处理器,因此将加密文档另存为 PDF/A 会产生一个加密且不合规的文件。PDF/A 保存现在会先解密文档。未加密的文档不受影响
Version 1.40.2
修复 (Fixed)
- 阻止
SaveAsPdfA发出虚假的 PDF/A Level A 合规声明。当请求 Level A(pac1a)但源文档缺少 ISO 19005-1 6.8 所要求的标记结构标识,即目录中的/StructTreeRoot以及带有/MarkInfo字典和/Marked true标记时,保存后的文件现在会被标识为与之匹配的 Level B(pdfaid:conformance=B),而不再断言 Level A。纯视觉的 PDF/A-1b 输出不受影响
Version 1.40.1
修复 (Fixed)
- 收紧 PDF 版本合规校验,使
SetOCGState(set-optional-content-group-state)动作被识别为 PDF 1.5 特性。当目标为 PDF 1.2、1.3 或 1.4 且包含SetOCGState动作时,保存现在会被拒绝,以符合 ISO 32000-1(Table 198);此前这类动作可能混入低版本输出。与之相区别的、已废弃的 PDF 1.2SetState动作仍从 PDF 1.2 起继续被接受
Version 1.40.0
新增 (Added)
- 绑定 PDFium 的
FPDFPageObj_AddExistingMark()API:把一个已存在的内容标记附加到页面对象上。当连续的页面对象共用同一个标记时,保存后的 PDF 会将它们合并为一个跨越全部对象的标记;非连续对象则各自获得独立副本 - 绑定 PDFium 的
FPDFTextObj_SetFontSize()API:用于修改已存在文本对象的字号(磅值),与已有的FPDFTextObj_GetFontSize()绑定相对应
变更 (Changed)
- 将随附的 PDFium 运行时 DLL(Win32 与 Win64,标准版与 V8 版)刷新至 2026-06-02 PDFium 快照
Version 1.39.53
变更 (Changed)
- 将 Delphi
PDFViewer、SplitView和MultiPageViewer示例改为默认以Zoom to Page模式打开文档 - 初始渲染现在会先把整页适配到查看器区域,用户再按需选择手动缩放级别
- 更新
TPdf.AboutInfo、Lazarus 包元数据和安装程序版本元数据到 1.39.53
Version 1.39.52
变更 (Changed)
- 增强
Demo\Lazarus\CreatePDF,入门示例现在会生成包含 vector paths、table content、embedded image、text annotation、rotated text 和更清晰 document-building walkthrough 的两页 PDF - 为所有 Delphi、C++Builder 和 Lazarus demo folder 新增美观的
README.html页面,并将剩余 text-only demo README 替换为 browser-readable guide - 更新
TPdf.AboutInfo、Lazarus package metadata 和 installer version metadata 到 1.39.52
Version 1.39.51
- 增强
Demo\Delphi\PreflightReportClibatch summary,现在会按 selected standards 汇总 Pass、Action required 和 Review 三类 standard status totals - TXT / HTML / JSON / CSV summary 的 per-file rows 现在包含 action-required count 与 review count,CI artifacts 不必打开每个 generated report 也能快速检查状态分布
- 更新
TPdf.AboutInfo、Lazarus package metadata 和 installer version metadata 到 1.39.51
Version 1.39.50
- 增强
Demo\Delphi\PreflightReportClidirectory batch mode,batchdir=folder现在会先收集 discovered PDF paths、排序,然后按稳定顺序生成 reports - Recursive directory scans 现在会生成可复现的 report order 和 summary rows,而显式
batch=list.txtprocessing 继续保留 list file order - 更新
TPdf.AboutInfo、Lazarus package metadata 和 installer version metadata 到 1.39.50
Version 1.39.49
- 增强
Demo\Delphi\PreflightReportClibatch summary,现在会记录 run settings:source kind、source path、recursive state、output directory、report format、selected standards 和failon=mode - JSON summary 新增
runobject,TXT 与 HTML summary 显示 run settings section,CSV rows 重复同一组 audit columns,方便 spreadsheet 和 CI pipelines 使用 - 更新
TPdf.AboutInfo、Lazarus package metadata 和 installer version metadata 到 1.39.49
Version 1.39.48
- 增强
Demo\Delphi\PreflightReportClibatch output naming,当 duplicate input file names 共用同一个outdir=时,生成的 reports 不再互相覆盖 - Batch runs 会在同一次运行中已分配的 report path 冲突时追加
-2、-3及后续后缀,并在 summaries 中记录最终 collision-safe report path - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.48
Version 1.39.47
- 增强
Demo\Delphi\PreflightReportClibatch summaries,使 TXT 与 JSON 输出现在包含 total files、processed files、failed files、issues 与failon=matches 的 aggregate totals - CSV summaries 继续保持纯 row table,兼容现有 consumers;HTML summaries 继续在 dashboard header 中显示同一组 aggregate metrics
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.47
Version 1.39.46
- 增强
Demo\Delphi\PreflightReportCli,加入summary=batch.html/.htm,让 batch runs 可在 TXT / CSV / JSON manifests 之外输出 browser-readable dashboard - HTML summaries 会显示 total、processed、failed、issue 与
failon=match metrics,并逐项列出 input、report links、status、counts 与 error text - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.46
Version 1.39.45
- 增强
Demo\Delphi\PreflightReportCli,加入batchdir=folder与recursive,让脚本可直接扫描 PDF folders,而不必先写 list file - Directory batch mode 复用 list-based batch mode 的
outdir=、summary=、standards=与failon=行为;non-recursive 只扫描选定 folder,recursive会包含 subfolders - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.45
Version 1.39.44
- 增强
Demo\Delphi\PreflightReportCli,加入summary=batch.csv|json|txt,让 batch runs 可在 per-file reports 旁输出 machine-readable manifest - Batch summaries 包含每个 input path、report path、status、standard count、passed count、issue count、
failon=match state 与 error text,便于 CI jobs 和外部脚本使用 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.44
Version 1.39.43
- 增强
Demo\Delphi\PreflightReportCli,加入batch=list.txt与outdir=reports,方便脚本在一次运行中为一组 PDF 文件生成 preflight reports - Batch mode 会跳过空行和
#注释行,按输入 PDF 派生每个.preflight.<ext>report name,在单个文件失败后继续处理,并在返回前汇总 processed 与 failed files - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.43
Version 1.39.42
- 增强
Demo\Delphi\PreflightReportCli,新增failon=none|issues|action|review,使 CI jobs 可把生成的 preflight results 转换为确定性的 exit codes - CLI 会在 report file 和 optional attached-report PDF 生成完成后,根据选中的
failon=rule 命中情况返回 exit code 2;runtime errors 仍返回 exit code 1 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.42
Version 1.39.41
- 增强
Demo\Delphi\PreflightReportCli,新增attach=output.pdf,可把生成的 preflight report 作为 document-level attachment 嵌入新的 PDF copy - CLI 会保留落盘的 TXT / HTML / Markdown / JSON / CSV report file,并拒绝把附件写回原始 input PDF path,以降低误覆盖风险
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.41
Version 1.39.40
- 新增
Demo\Delphi\PreflightReportCli,作为 Delphi console companion,可在不打开 viewer 的情况下以 scriptable workflow 生成FPdfPreflightReport - CLI 支持无参数 sample creation,以及 input / output arguments、optional password、
text/html/md/json/csvoutput formats,并可通过standards=filtering 选择 PDF/A、PDF/UA、PDF/E、PDF/X、PDF/R 与 PDF/VT - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.40
Version 1.39.39
- 增强
FPdfPreflightReport,新增TPdfPreflightReport.ToMarkdown与SaveMarkdownToFile,使 preflight reports 可导出为适合 issue tracker 的 Markdown - 更新 Delphi、C++Builder 与 Lazarus
PreflightReport示例,在现有 TXT / HTML / JSON / CSV workflow 之外增加 Markdown preview switching 与 Save MD actions - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.39
Version 1.39.38
- 增强 Delphi、C++Builder 与 Lazarus
SecurityAudit示例,在现有 TXT save / copy workflow 之外增加 JSON audit report export - JSON report 包含
format、generatedAt、summary、findingCount,以及带 severity、area、detail 字段的结构化findingsrows - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,以报告 1.39.38
Version 1.39.37
- 增强
FPdfPreflightReport,新增TPdfPreflightReport.ToCsv与SaveCsvToFile,使 preflight reports 可以导出为 spreadsheet-friendly CSV - 更新 Delphi、C++Builder 与 Lazarus
PreflightReportsamples,在现有 TXT / HTML / JSON workflow 之外增加 CSV preview switching 与 Save CSV actions - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.37
Version 1.39.36
- 增强
FPdfPreflightReport,新增TPdfPreflightReport.IssueCategoryCounts以及可复用的TPdfPreflightIssueCategoryCount和TPdfPreflightIssueCategoryCounts类型,用于按 category 聚合 marker-level issues - 更新
TPdfPreflightReport.ToText、ToHtml与ToJson,使生成的 PreflightReport 输出在 per-standard rows 与 detailed issue recommendations 之外包含 issue-category count summaries - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.36
Version 1.39.35
- 将已扩展的
PrintDialogsample 在 Delphi、C++Builder 与 Lazarus 三端重命名为PrintPreferences,让 demo name 与 PDF author print preferences、N-up printing、odd / even filtering、grayscale、cell border 和 duplex mapping workflow 对齐 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.35
Version 1.39.34
- 增强
Demo\Delphi\PrintPDF,支持拖放加载 PDF,并将已有Demo\CBuilder\PrintPDFworkflow 与 Delphi、Lazarus PrintPDF 示例一起写入文档 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.34
Version 1.39.33
- 新增
Demo\CBuilder\SplitView,补齐 Delphi、C++Builder 与 Lazarus 三端 SplitView sample matrix - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.33
Version 1.39.32
- 新增
Demo\Lazarus\SplitView,让 side-by-side PDF comparison 覆盖 Lazarus,包含 two- or three-pane layouts、active-view navigation、synchronized commands、zoom presets 与 rotation - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.32
Version 1.39.31
- 新增
Demo\Lazarus\PrintPDF,让标准 PDF print workflow 覆盖 Lazarus,包含 preview navigation、page ranges、copies、collate mode、progress 与 cancellation - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.31
Version 1.39.30
- 新增
Demo\Lazarus\FontProperties,补齐 Delphi、C++Builder 与 Lazarus 三端 FontProperties sample matrix - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.30
Version 1.39.29
- 新增
Demo\CBuilder\FontProperties,让 indexed character 与 font metadata 检查在 Delphi sample 之外也覆盖 C++Builder - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.29
Version 1.39.28
- 新增
Demo\Delphi\ExtractTextPages,补齐 Delphi、C++Builder 与 Lazarus 三端 per-page text extraction sample matrix - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.28
Version 1.39.27
- 新增
Demo\Lazarus\PrintDialog,补齐 Delphi、C++Builder 与 Lazarus 三端 PrintDialog sample matrix - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.27
Version 1.39.26
- 新增
Demo\CBuilder\PrintDialog,让 N-up printing 与 PDF author print preferences workflow 在 Delphi sample 之外也覆盖 C++Builder - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.26
Version 1.39.25
- 新增
Demo\CBuilder\ViewerInteractionLab,补齐 Delphi、C++Builder 与 Lazarus 三端 ViewerInteractionLab sample matrix - 更新 library build workflow 与 Win64 C++Builder package outputs,使
TPdfViewviewer interaction methods 可在 Win64 demos 中正确链接 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.25
Version 1.39.24
- 新增
Demo\Lazarus\ViewerInteractionLab,让 focused viewer interaction workflow 在 Delphi sample 之外也覆盖 Lazarus - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.24
Version 1.39.23
- 新增
Demo\Lazarus\SearchAndSelect,补齐 Delphi、C++Builder 与 Lazarus 三端 SearchAndSelect sample matrix - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.23
Version 1.39.22
- 新增
Demo\CBuilder\ContentExtractionLab与Demo\Lazarus\ContentExtractionLab,让 multi-category content extraction workflow 覆盖所有支持的 demo IDE - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.22
Version 1.39.21
- 增强
Demo\Delphi\PreflightReport、Demo\Lazarus\PreflightReport与Demo\CBuilder\PreflightReport,新增 preview format selector,让用户在保存报告前可检查 text 或 JSON output - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.21
Version 1.39.20
- 为
FPdfPreflightReport增加 JSON 导出,可通过TPdfPreflightReport.ToJson与SaveJsonToFile生成机器可读的 summary、per-standard status / priority、next action 与 issue detail - 更新
Demo\Delphi\PreflightReport、Demo\Lazarus\PreflightReport与Demo\CBuilder\PreflightReport,在 TXT / HTML 导出之外加入 Save JSON 操作 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.20
Version 1.39.19
- 增强
FPdfPreflightReport,在 TXT / HTML report 中加入TPdfPreflightStatus、issue category、per-standard priority 与 next-action guidance - 更新
Demo\Delphi\PreflightReport、Demo\Lazarus\PreflightReport与Demo\CBuilder\PreflightReport,summary grid 现在显示 status、priority、issue count 与 next action - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.19
Version 1.39.18
- 新增
Demo\Lazarus\SecurityAudit,补齐 Delphi、C++Builder 与 Lazarus 的 read-only PDF risk-surface audit workflow 示例矩阵 - Lazarus 示例枚举 permissions、attachments、JavaScript actions、URI / Launch link annotations、web links、signatures、XFA state、V8 / XFA helper availability 与 unsupported-feature callbacks,并可把 finding list 保存或复制为 TXT report
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.18
Version 1.39.17
- 新增
Demo\CBuilder\SecurityAudit,在现有 Delphi 示例之外,把只读 PDF risk-surface audit workflow 带到 C++Builder - C++Builder 示例枚举 permissions、attachments、JavaScript actions、URI / Launch link annotations、web links、signatures、XFA state、V8 / XFA helper availability 与 unsupported-feature callbacks,并可把 finding list 保存或复制为 TXT report
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.17
Version 1.39.16
- 新增
Demo\CBuilder\SearchAndSelect,在现有 Delphi 示例之外,把独立 SearchAndSelect viewer workflow 带到 C++Builder - C++Builder 示例可创建或打开 PDF,按全页列出带 page / character-index preview 的 matches,支持 Previous / Next 与 double-click navigation,并用
HighlightSearchText高亮当前页 matches - 示例也暴露
AllowUserTextSelection、SelectedText、SelectAll、CopySelectionToClipboard、ClearSelection、OnSelectionChange与 spreadDisplayMode选项;版本元数据同步为 1.39.16
Version 1.39.15
- 新增
Demo\CBuilder\WatermarkStamp,补齐 reusable Form XObject watermark 与 stamp workflows 的 Delphi、Lazarus、C++Builder 示例矩阵 - C++Builder 示例会创建 target 与 stamp PDF,通过
CreateXObjectFromPage复用 stamp page,应用TPdfMatrixtransforms,并保存 centered watermarks、corner stamps 与 page number labels - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.15
Version 1.39.14
- 新增
Demo\Lazarus\WatermarkStamp,把可复用 Form XObject watermark 与 stamp workflow 带到 Lazarus - Lazarus 示例会创建 target 与 stamp PDF,通过
CreateXObjectFromPage复用 stamp page,应用TPdfMatrixtransforms,并保存 centered watermarks、corner stamps 与 page number labels - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.14
Version 1.39.13
- 新增
Demo\CBuilder\PreflightReport,补齐可复用FPdfPreflightReportworkflow 的 Delphi、Lazarus、C++Builder 示例矩阵 - C++Builder 示例使用
FPdfPreflightReport.hpp生成 standard summaries、TXT report previews、TXT / HTML report files,并提供 Open Last Report 行为 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.13
Version 1.39.12
- 新增
Demo\Lazarus\PreflightReport,把 PDF/A、PDF/UA、PDF/E、PDF/X、PDF/R、PDF/VT preflight report workflow 带到 Lazarus - Lazarus 示例可打开或创建 PDF、选择目标 standards、预览 summary rows 与 TXT report output、保存 TXT / HTML reports,并打开最近一次保存的 report
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.12
Version 1.39.11
- 增强
Demo\Delphi\SearchAndSelect,新增全页搜索结果列表,记录 page number、character index 与 preview text - 新增 Previous / Next match navigation 与 double-click result jumping,同时保留当前页
HighlightSearchText行为 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.11
Version 1.39.10
- 增强
Demo\Delphi\SecurityAudit,新增 Save Report 与 Copy Report 操作,可将当前 summary 和 finding rows 导出为 TXT audit report - 当 audit panel 被 reset 时,示例现在会清除 report export state,确保复制或保存的 reports 与可见 findings 一致
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.10
Version 1.39.9
- 增强
Demo\Delphi\ContentExtractionLab,新增 source-PDF save、report copy-to-clipboard 以及 all / none category selection 操作 - 当 category selection 变化时,示例现在会让当前 report 失效,确保 TXT / JSON exports 与可见 extraction scope 一致
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.9
Version 1.39.8
- 新增
Demo\Delphi\ContentExtractionLab,提供统一的 content extraction workflow sample,覆盖 document metadata、page text、page objects、images、attachments、links、annotations、bookmarks 和 font / character metrics - 该示例可打开现有 PDF,或创建包含 text、image、attachment、annotation 内容的 synthetic PDF,然后生成 summary rows 以及详细 TXT / JSON reports
- 更新
TPdf.AboutInfo、Lazarus package metadata 和 installer version metadata,使其报告 1.39.8
Version 1.39.7
- 新增
Lib\FPdfPreflightReport.pas,提供可复用报告 helper,将ValidatePdfA、ValidatePdfUa、ValidatePdfE、ValidatePdfX、ValidatePdfR、ValidatePdfVT统一包装为TPdfPreflightReport对象 - 新增
Demo\Delphi\PreflightReportworkflow 示例,可打开或创建 PDF、选择目标 standards、预览 summary rows 与 issue recommendations,并保存 TXT 或 HTML 报告 - 生成的报告会明确说明内置校验的 marker-level validation 边界,方便应用在需要时配合专用 content-level preflight tools
- 更新
TPdf.AboutInfo、Lazarus package metadata、package project lists 与 installer version metadata,使其报告 1.39.7
Version 1.39.6
- 新增
Demo\Delphi\SearchAndSelect,这是一个聚焦 search highlighting、text selection、selected-text preview、copy、clear 与 spread display modes 的 viewer workflow 示例 - 该示例展示
HighlightSearchText、match-case / whole-word 搜索选项、AllowUserTextSelection、SelectedText、SelectAll、CopySelectionToClipboard和ClearSelection,不新增库 API - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.6
Version 1.39.5
- 扩展
Demo\Delphi\ViewerInteractionLab,形成 SearchAndSelect 风格的 viewer UX 示例,包含HighlightSearchText、match-case / whole-word 选项、选中文本预览,以及既有 selection / clipboard controls - 扩展
Demo\Delphi\PrintDialog,用于检查 PDF author print preferences:PrintCopies、PrintPageRanges、PrintScaling、PrintPaperHandling,并显示SetPdfPrintPaperHandlingDevModeduplex mapping - 新增
Demo\Delphi\SecurityAudit,这是一个只读 risk-surface 示例,会列出 permissions、attachments、document JavaScript、URI / Launch links、web links、signatures、XFA state,以及 V8 / XFA helper availability - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.5
Version 1.39.4
- 新增
Demo\CBuilder\ImageToPDF与Demo\Lazarus\ImageToPDF,补齐 Delphi、C++Builder、Lazarus 三端 ImageToPDF 示例矩阵 - 新示例展示多图片选择、选中图片预览、每张图片生成一个 PDF 页面、A4 portrait / landscape 页面尺寸选择、居中缩放放置、逐图片进度,以及保存后打开生成的 PDF
- 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.4
Version 1.39.3
- 新增
Demo\CBuilder\BatchExport,让 C++Builder 与既有 Delphi、Lazarus 示例一样覆盖多文件 PDF 转 JPG 导出工作流 - 该示例展示
LoadCustomDocument、IPdfCancellationTokenSource、流式TFileStream输入、每文件与每页进度、取消处理、DPI / quality / password 输入,以及完成后打开输出目录 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.3
Version 1.39.2
- 新增
Demo\Delphi\WatermarkStamp,这是一个可运行的 Form XObject 工作流示例,会创建目标 PDF 与可复用 stamp PDF,并在每一页应用居中水印、右上角盖章和页码标签 - 该示例演示
CreateXObjectFromPage、InsertFormObjectFromXObject、TPdfMatrix和FPDFPageObj_SetMatrix,不新增库 API - 更新
Docs\en-us\Examples.html,改为使用当前的TPdfMatrix.Handle模式向FPDFPageObj_SetMatrix传递矩阵 - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.2
Version 1.39.1
- 新增
Demo\Delphi\ViewerInteractionLab,集中演示TPdfView的 display modes、fit modes、page colors、rotation、user text selection、clipboard actions 与DeviceToPage坐标反馈 - 新增
Demo\CBuilder\StandardsLab/Demo\Lazarus\StandardsLab,让 Lazarus 用户也能运行 PDF/A、PDF/UA、PDF/E、PDF/X、PDF/R、PDF/VT 校验与 marker-output 工作流 - 在
Lib\37.0\PDFiumPas.dprojandLib\FPC\PDFiumLaz.lpk中列出 standards 单元,并移除 DelphiSplitView示例中重复的Winapi.ShellAPIimport 以修复构建 - 修复
BatchExport、PDFViewer、MultiPageViewer与SplitView中的 Delphi demo 批量构建阻塞,且不改变其运行行为 - 修复
PDFViewer与MultiPageViewer的 C++Builder demo 批量构建兼容性:在当前 project mode 下将nullptr改为NULL - 更新
TPdf.AboutInfo、Lazarus package metadata 与 installer version metadata,使其报告 1.39.1
Version 1.39.0
- 新增
Demo\Delphi\StandardsLab,这是一个可运行的标准工作流示例:加载或创建 PDF,运行ValidatePdfA、ValidatePdfUa、ValidatePdfE、ValidatePdfX、ValidatePdfR、ValidatePdfVT,并在同一列表中显示检测到的 conformance、通过状态和 issue 数量 - StandardsLab 的保存按钮会调用
SaveAsPdfA、SaveAsPdfUa、SaveAsPdfE、SaveAsPdfX、SaveAsPdfR、SaveAsPdfVT,无需编写自定义测试程序即可查看 PDF 标准 marker 输出流程 - 更新
TPdf.AboutInfo、Lazarus 包元数据与安装器版本元数据到 1.39.0
Version 1.38.0
TPdfView搜索与文本选择覆盖层现在使用真正的 alpha blending,而不是逻辑 mask 绘制,因此高亮下方的页面内容会被保留- 新增
SetPdfPrintPaperHandlingDevMode,可将TPrintPaperHandling映射到 WindowsDEVMODE.dmDuplex值:DMDUP_SIMPLEX、DMDUP_HORIZONTAL、DMDUP_VERTICAL TPdfView.SmoothScroll现在会用 timer-driven segments 对 line/page scrollbar commands 做动画;thumb tracking 仍保持即时响应- 更新
TPdf.AboutInfo与安装器版本元数据到 1.38.0
Version 1.37.0
TPdf新增实例级渲染锁,串行化RenderPage、RenderTile、RenderPageProgressive、页面重载与文档卸载路径。应用现在可以更实际地通过共享组件做 worker 渲染,但仍需自行协调文档修改与生命周期- 修复 zero-copy bitmap 包装器:遇到 bottom-up
TBitmapDIB 时改走 PDFium 自有缓冲并在结束后 copy out,消除 VCL 渲染测试中的 stride 破坏 / access violation - 收紧
TPdfView选区行为:AllowUserTextSelection只限制用户输入,代码级选区 API 仍会绘制;SelectAll改按真实可见 spread 选择,封面页不再误选第 2 页。Delphi、Lazarus、C++Builder 测试同步扩展 - 更新
TPdf.AboutInfo与安装器版本元数据到 1.37.0
Version 1.36.0
- 已在
TPdfView中启用终端用户文本选择,v1.17.0 预留的AllowUserTextSelection属性现在会驱动完整的拖拽选取流程。左键点击文本字符会进入选择模式(自动做命中测试);左键点击空白区域则仍像以前一样继续平移视图。表单填充控件保持更高优先级,因此点击表单字段仍会聚焦字段,而不会启动文本选择 - 双击会选中单词,三击会选中整行,
Ctrl+A会选中当前页(在 spread display modes 下会同时选中两页),而Ctrl+C会把选区作为CF_UNICODETEXT复制到 Windows 剪贴板 Shift+Left/Shift+Right会按字符逐个扩展选区(在 spread mode 下可溢出到相邻页);Shift+Home/Shift+End会把选区扩展到可视行边界,并以起始字符框的高度作为行聚类容差,因此混合字号的行也能被正确归为一行- 鼠标悬停在文本上方时,光标会切换为
crIBeam;离开文本时则恢复默认光标。当文本拖选正在进行时,如果拖入查看器任意边缘的 20 像素死区,页面会自动滚动(50 ms tick、每 tick 16 px,并钳制到与平移路径相同的边界),这样无需先松开鼠标也能把选区扩展到当前视口之外 - 跨页选择在 spread display modes(
dmTwoPageContinuous、dmTwoPageContinuousWithCover)下可用:若拖拽从左页开始并在右页结束,选区会覆盖两页之间连续的范围。SelectedText会用 CR/LF 连接各页切片,因此往返复制后的文本读起来仍像正常的多行内容 - 新增已发布属性
SelectionColor(默认值为clHighlight,即 Windows 系统选择颜色),它独立于用黄色显示搜索结果的HighlightColor。因此搜索高亮与实时拖选可以同时显示在屏幕上,而不会产生颜色冲突 - 新增已发布事件
OnSelectionChange,只要选区已实体化的范围真的发生变化就会触发;对完全相同的选区重复应用时不会触发,因此宿主应用可以直接把它连接到状态栏文本或按钮启用状态,而无需自行去抖 TPdfView上新增公共 API:HasSelection、SelectionCharCount、SelectedText、ClearSelection、SelectAll、CopySelectionToClipboard。这些都是代码级入口,无论AllowUserTextSelection是否开启都始终可用;该标志只控制用户输入(鼠标、Ctrl+C、Ctrl+A、Shift+arrows),因此 kiosk 宿主即使禁用了用户驱动的选择,也仍可构建调用同一套 API 的“Select All / Copy”工具栏按钮- 会自动挂接一个默认的右键
Copy/复制弹出菜单,只要宿主没有分配自己的PopupMenu,“选中文本,右键复制”就能开箱即用。菜单标题会依据SysLocale.PriLangID在英文和中文之间选择;需要完整本地化或更丰富菜单的宿主只需自行分配PopupMenu,默认菜单就会被抑制 - 在
SetPdf、SetPageNumber、SetActive(False)和DisplayMode切换时,选区都会被自动清除;若先前选区非空,则OnSelectionChange只会精确触发一次。表单填充子系统保持更高优先级,因此当表单字段正在编辑时,所有选择快捷键都会让位,使字段自身继续接收Ctrl+C/Ctrl+A/Shift+arrows这类输入 - Delphi 与 Lazarus 回归测试套件现已各扩展到 202 个用例,C++Builder 套件扩展到 159 个用例,覆盖默认值、往返一致性、公共 API 行为、状态切换清除、鼠标拖拽(命中文本 / 命中空白)、点击与拖拽区分、IBeam 光标切换、双击选词、三击选行、键盘快捷键、默认弹出菜单的挂接 / 延迟 / 标题,以及 spread 跨页选择,其中还包含一次剪贴板 CR/LF 往返检查
Version 1.35.0
- 新增 PDF/VT (ISO 16612-2:2010) 标记注入支持:TPdf.SaveAsPdfVT 将当前文档提升为符合 PDF/VT-1 或 PDF/VT-2 的文件(可变数据与事务性印刷的 PDF 子集)。PDF/VT 基于 PDF/X-4 构建 —— ISO 16612-2 §6.2.1 要求每个 PDF/VT-1 文件也必须符合 PDF/X-4 —— 因此注入器在 PDF/VT 专用属性之外同时写入完整的 PDF/X-4 标记集(XMP
pdfxid:GTS_PDFXVersion = "PDF/X-4"、Info/GTS_PDFXVersion (PDF/X-4)与/Trapped、catalog/OutputIntents引用含内嵌 ICC profile 的 OutputIntent 字典) - PDF/VT 专用注入包括 XMP
pdfvtid:GTS_PDFVTVersion(按 §6.3 Table 2 取 "PDF/VT-1" 或 "PDF/VT-2")和pdfvtid:GTS_PDFVTModDate(按 §6.3 NOTE 1 与xmp:ModifyDate保持同步)以及同时声明 pdfxid 与 pdfvtid 两个命名空间的 pdfaExtension:schemas 描述(NPES URIhttp://www.npes.org/pdfx/ns/id/和http://www.npes.org/pdfvt/ns/id/)。trailer 含/ID数组 - 新增 TPdf.SaveAsPdfVTToStream 实现内存中 PDF/VT 输出,以及默认选项简化重载
TPdf.SaveAsPdfVT(FileName)—— 生成 PDF/VT-1 + 内置 sRGB IEC61966-2.1 OutputIntent(3144 字节,与 SaveAsPdfA / SaveAsPdfX 同一份 profile)+/Trapped /False - 新增 TPdf.ValidatePdfVT:检查已打开 PDF 的 PDF/VT 合规标记(XMP
pdfvtid:GTS_PDFVTVersion与GTS_PDFVTModDate存在性、pdfvtid:GTS_PDFVTModDate与xmp:ModifyDate相等、底层pdfxid:GTS_PDFXVersion标识、§6.5 catalog/DPartRoot存在性、/OutputIntents含/DestOutputProfile、trailer /ID、加密状态、xmp:CreateDate/ModifyDate存在性),返回 TPdfVTValidationResult,包含检测到的合规级别与问题集合 - 新增 TPdf.PdfVTConformance 属性:直接返回当前文档的合规级别(pvc1、pvc2、pvcNone 或 pvcUnknown),无需显式调用 ValidatePdfVT
- 新单元 FPdfPdfvt 中导出的新类型:TPdfVTConformance(pvcUnknown/None/1/2)、TPdfVTTrappedState(ptvUnspecified/True/False/Unknown)、TPdfVTValidationResult、TPdfVTValidationIssue、TPdfVTSaveOptions
- 文档部分层次结构(§6.5
DPartRoot/DPart树)是应用级结构,由可变数据印刷工作流的收件人 / 页面范围映射决定。SaveAsPdfVT 不会生成 DPart 树 —— ValidatePdfVT 在缺少/DPartRoot时以pvviMissingDPartRoot报告,方便调用方将 PDF/VT 文件转入独立的 DPart 构建流程。内容级 PDF/X-4 要求(字体嵌入、透明度、ICC 颜色管理、OPI / JavaScript / Reference XObject 禁用等)仍由文档作者与 PDFium 渲染端负责 - 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.34.0
- 新增 PDF/R-1 (ISO 23504-1:2020) 标记注入支持:TPdf.SaveAsPdfR 通过对基础 PDF 做增量更新后处理,将当前文档提升为符合 PDF/R-1 的文件(PDF 的 raster image 传输子集,用于扫描文档)。注入覆盖后处理可达成的文件格式级要求 —— 独特的
%PDF-raster-1.0版本标识注释行写在 trailer 字典与 startxref 关键字之间(§5)、catalog 字典精简到 §6.3 白名单(只保留 Version / ViewerPreferences / PageLayout / PageMode / AcroForm / Metadata)、文档信息字典精简到 §6.4.3 白名单(只保留 Creator / Producer / CreationDate / ModDate)、catalog /Metadata XMP 流携带 §6.4.4 Table 1 的 4 个映射条目(xmp:CreatorTool / pdf:Producer / xmp:CreateDate / xmp:ModifyDate),以及 trailer /ID 数组 - 新增 TPdf.SaveAsPdfRToStream 实现内存中 PDF/R 输出,以及默认选项简化重载
TPdf.SaveAsPdfR(FileName)适用于常见场景 - 新增 TPdf.ValidatePdfR:检查已打开 PDF 的 PDF/R-1 合规标记(
%PDF-raster-x.yfooter 注释、header 版本、/Type /ObjStm 不存在、catalog 白名单合规、Info 字典白名单合规、XMP 元数据流存在、trailer /ID),返回 TPdfRValidationResult,包含检测到的合规级别与问题集合 - 新增 TPdf.PdfRConformance 属性:直接返回当前文档的合规级别(prc1、prcNone 或 prcUnknown),无需显式调用 ValidatePdfR
- 新单元 FPdfPdfr 中导出的新类型:TPdfRConformance、TPdfRValidationResult、TPdfRValidationIssue、TPdfRSaveOptions。
TPdfRSaveOptions.Default设置 StripInfoOptionalEntries 与 StripCatalogOptionalEntries 为 True,注入器默认生成符合 §6.3 / §6.4.3 的 catalog 与 Info 字典;调用方可设为 False 保留源条目(这样不再满足那些 PDF/R 条款,但其余标记仍附加) - 内容级要求仍由源 PDF 负责:每页 Contents 结构(§6.5.1)、MediaBox
[0 0 w h]形式(§6.5.3)、Filter 限制(§6.2.2 仅允许 FlateDecode、CCITTFaxDecode bitonal、DCTDecode 8-bit gray/RGB)、不允许 object streams(§6.2.4)、§6.6 strip 布局。后处理无法强制这些 —— PDF/R 在结构上比其他 PDF/x 标准更严格,需要源字节就按合规方式生成。ValidatePdfR 暴露本单元能检测到的文件格式问题;完整内容级检查请配合 TWAIN Working Group PDF/R 验证器 - 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.33.0
- 新增 PDF/X (ISO 15930 系列) 标记注入支持:TPdf.SaveAsPdfX 通过对基础 PDF 做增量更新后处理,将当前文档提升为符合 PDF/X-1a:2001、PDF/X-3:2002 或 PDF/X-4 的文件。注入覆盖后处理可达成的文件格式级要求 —— XMP 元数据流携带
pdfxid:GTS_PDFXVersion(PDF/X-1a / PDF/X-3 还附带pdfxid:GTS_PDFXConformance)及匹配的 pdfaExtension:schemas 描述、重写后的文档信息字典含/GTS_PDFXVersion、/GTS_PDFXConformance、/Trapped,更新后的 catalog 携带/OutputIntents [N 0 R]引用/S /GTS_PDFX的 OutputIntent 字典与嵌入的 ICC profile,以及 trailer/ID数组 - 新增 TPdf.SaveAsPdfXToStream 实现内存中 PDF/X 输出,以及默认选项简化重载
TPdf.SaveAsPdfX(FileName)—— 生成 PDF/X-4 输出并使用内置 sRGB IEC61966-2.1 OutputIntent(3144 字节,与 SaveAsPdfA 使用同一份 profile) - 新增 TPdf.ValidatePdfX:检查已打开 PDF 的 PDF/X 合规标记(XMP pdfxid 标识与 Info 字典值相等、pdfxid 扩展模式描述、含 /DestOutputProfile 的 /OutputIntents 数组、Title 存在性、trailer /ID、加密状态、xmp:CreateDate / xmp:ModifyDate 存在性),返回 TPdfXValidationResult,包含检测到的合规级别与问题集合
- 新增 TPdf.PdfXConformance 属性:直接返回当前文档的合规级别(pxc1a、pxc3、pxc4、pxcNone 或 pxcUnknown),无需显式调用 ValidatePdfX。XMP 版本字符串被解析以区分三个合规级别
- 新单元 FPdfPdfx 中导出的新类型:TPdfXConformance(pxcUnknown/None/1a/3/4)、TPdfXTrappedState(ptUnspecified/True/False/Unknown)、TPdfXValidationResult、TPdfXValidationIssue、TPdfXSaveOptions。
TPdfXSaveOptions.Default目标为 PDF/X-4 + sRGB OutputIntent +/Trapped /False;调用方可覆盖Conformance、为商业印刷工作流提供 CMYKIccProfileData字节流,或修改OutputCondition/OutputConditionIdentifier/RegistryName指向特定 ICC 特征化注册项(如 FOGRA39、GRACoL2006_Coated1v2) - 内容级要求(所有字体嵌入、不允许 JavaScript、不允许可见 annotations、OPI 禁用、PDF/X-1a / PDF/X-3 的透明度规则等)仍由文档作者与 PDFium 渲染端负责。完整合规校验请配合 callas pdfaPilot 或 Ghent PDF Workgroup Output Suite 等专业预检工具
- 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.32.0
- 新增 PDF/E-1 (ISO 24517-1:2008) 标记注入支持:TPdf.SaveAsPdfE 通过对基础 PDF 做增量更新后处理,将当前文档提升为符合 PDF/E-1 的文件。注入覆盖后处理可达成的文件格式级要求 —— XMP 元数据流携带
pdfe:ISO_PDFEVersion = "PDF/E-1"及匹配的 pdfaExtension:schemas 描述、重写后的文档信息字典含 §5 强制的/ISO_PDFEVersion (PDF/E-1)条目、按 §13.1 从 ISO 19005-1 §6.7 继承的 Info-XMP 等价桥接(dc:title / dc:creator / dc:description / pdf:Producer / pdf:Keywords / xmp:CreateDate / xmp:ModifyDate / xmp:MetadataDate / xmp:CreatorTool),以及 §6.2 要求的 trailer/ID数组 - 新增 TPdf.SaveAsPdfEToStream 实现内存中 PDF/E 输出,以及默认选项简化重载
TPdf.SaveAsPdfE(FileName)适用于常见场景 - 新增 TPdf.ValidatePdfE:检查已打开 PDF 的 PDF/E-1 合规标记(XMP pdfe:ISO_PDFEVersion 存在并与 Info 字典值相等、pdfe 扩展模式描述、Info 字典 /ISO_PDFEVersion 条目、trailer /ID、xmp:CreateDate / xmp:ModifyDate 存在),返回结构化结果,包含检测到的合规级别与问题集合
- 新增 TPdf.PdfEConformance 属性:直接返回当前文档的合规级别(pec1、pecNone 或 pecUnknown),无需显式调用 ValidatePdfE
- 新单元 FPdfPdfe 中导出的新类型:TPdfEConformance、TPdfEValidationResult、TPdfEValidationIssue、TPdfESaveOptions
- Info 字典重写是 PDFium Delphi Component 的 PDF/x 后处理路径首次实现 —— 它用相同对象号重写现有 Info 对象(保持 xref 子区段 / trailer /Info 引用有效),当源 trailer 无 /Info 条目时则合成新的 Info 字典。PDFium 自身在每次 SaveAs 输出中都生成 Info 字典,所以常见情况下走重写路径
- 内容级要求(字体嵌入、ToUnicode CMap、禁用的 XObject / ExtGState 键 / XFA 表单等)仍由文档作者负责 —— SaveAsPdfE 只附加文件格式标记,不修改页面内容或删除禁用特性
- 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.31.0
- 新增 PDF/UA-1 (ISO 14289-1:2014) 标记注入支持:TPdf.SaveAsPdfUa 通过对基础 PDF 做增量更新后处理,将当前文档提升为符合 PDF/UA-1 的文件。注入覆盖后处理可达成的文件格式级要求 —— XMP 元数据流携带
pdfuaid:part = 1及匹配的 pdfaExtension:schemas 描述、必填的dc:title、catalog/MarkInfo << /Marked true /Suspects false >>与/ViewerPreferences << /DisplayDocTitle true >>(仅在源 catalog 中不存在时注入)、catalog/Lang(调用方提供 BCP 47 标签时)以及 trailer/ID数组 - 新增 TPdf.SaveAsPdfUaToStream 实现内存中 PDF/UA 输出,以及默认选项的简化重载
TPdf.SaveAsPdfUa(FileName)适用于常见场景 - 新增 TPdf.ValidatePdfUa:检查已打开 PDF 的 PDF/UA-1 合规标记(StructTreeRoot 是否存在、/Lang、/MarkInfo /Marked true 且 /Suspects = false、/ViewerPreferences /DisplayDocTitle true、XMP pdfuaid:part 标识、dc:title、trailer /ID、加密状态),返回结构化结果,包含检测到的合规级别与问题集合
- 新增 TPdf.PdfUaConformance 属性:直接返回当前文档的合规级别(puc1、pucNone 或 pucUnknown),无需显式调用 ValidatePdfUa
- 新单元 FPdfPdfua 中导出的新类型:TPdfUaConformance、TPdfUaValidationResult、TPdfUaValidationIssue、TPdfUaSaveOptions
- TPdfUaSaveOptions 中 Title / Author / Subject / Keywords / Creator / Producer / CreationDate / ModDate / DocumentId / InstanceId / Language 字段留空时,会自动从 FPDF_GetMetaText / FPDF_GetFileIdentifier / FPDFCatalog_GetLanguage 填充,因此常见情况只需一行就能保存
- 内容级要求(StructTreeRoot 标签完整性、Figure Alt 文本、ToUnicode CMap、字体嵌入等)仍由文档作者负责 —— SaveAsPdfUa 只附加文件格式标记,不会修改页面内容或自动生成标签。ValidatePdfUa 在缺少 StructTreeRoot 时以
pvuaiMissingStructTreeRoot报告,方便调用方将未标签化文档转入独立的标签化流程 - 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.30.0
- PDF/A-1b 输出现在满足 ISO 19005-1 (含 Cor.1:2007) 关于文档信息字典与 XMP 等价性的要求:PDFium 写入基础 PDF 的每个 Info 字典条目都会镜像到 XMP 包中,包括 Title (dc:title)、Author (dc:creator)、Subject (按 Cor.1 修正映射为 dc:description)、Keywords (pdf:Keywords)、Creator (xmp:CreatorTool)、Producer (pdf:Producer)、CreationDate (xmp:CreateDate)、ModDate (xmp:ModifyDate),并额外补齐 xmp:MetadataDate
- PDF/A 文档的 trailer 现在始终包含 /ID 数组(ISO 19005-1 6.1.3 硬性要求)。当 TPdf.SaveAsPdfA 处理的源 PDF 已有 file identifier 时,会复用其 16 字节的 permanent / changing ID;否则从源字节派生确定性的 16 字节回退 ID
- 注入的 XMP 现在嵌入 pdfaid extension schema 描述(ISO 19005-1 6.7.8,Cor.1 修订)—— pdfaid 相对 XMP Specification 2004 属于扩展 schema,所有合规文件必须在 pdfaExtension:schemas 容器中声明其属性名、值类型与类别
- TPdfASaveOptions 新增 5 个可选字段:Producer、CreationDate、ModDate(PDF 日期字符串 “D:YYYYMMDDHHmmSSOHH'mm'” 形式)、DocumentId、InstanceId(trailer /ID 数组的 16 字节字符串)。TPdf.SaveAsPdfA / SaveAsPdfAToStream 会自动从 FPDF_GetMetaText 与 FPDF_GetFileIdentifier 填充未指定字段,已有调用代码无需修改
- TPdf.ValidatePdfA / TPdf.PdfAConformance 新增三种问题报告:pvaiMissingTrailerId(trailer 缺少 /ID)、pvaiMissingXmpDates(xmp:CreateDate 或 xmp:ModifyDate 缺失)、pvaiMissingExtensionSchema(缺少 pdfaid 扩展 schema 描述)
- Title、Author、Subject、Keywords、Creator、Producer 中的非 ASCII 字符现在以 UTF-8 编码写入 XMP 包(XMP Specification 要求使用 UTF-8),保证多语言元数据通过 SaveAsPdfA 后能完整保留
- 更新 TPdf.AboutInfo 字符串,使其报告当前产品版本号
Version 1.29.0
- 更新内置 PDFium DLL(Win32 与 Win64,含标准版与 V8 版)至 2026-05-22 PDFium 快照,纳入 FPDFText_SetText / FPDFText_SetCharcodes 崩溃路径修复及若干内部加固
- 在 FPdfPageOps.pas 中暴露 PDFium 新增的 FPDF_SUBSET_NEW_FONTS 保存标志,允许 FPDF_SaveAsCopy 调用者对新增文本对象引用的嵌入字体执行自动子集化。FPDF_INCREMENTAL、FPDF_NO_INCREMENTAL、FPDF_REMOVE_SECURITY 三个常量改为 PDFium 位移定义(保留旧数值 3 为 FPDF_REMOVE_SECURITY_DEPRECATED,保证二进制兼容)
- 在 FPdfView.pas 中新增 FPDF_FONT_BACKEND_TYPE 枚举(FREETYPE / FONTATIONS)以及配套的 FPDF_LIBRARY_CONFIG.m_FontLibraryType 字段,使用 Skia 渲染器初始化 PDFium 的应用可在启动时选择字体后端
- 同步 TFPDFPage_InsertObject 签名以匹配 PDFium 的 C 导出:函数现在返回 FPDF_BOOL(成功为 TRUE,page_object 为 NULL 或所有权转移失败时为 FALSE)而非 void。PDFium Delphi Component 已有调用点无需修改即可继续编译,Delphi / FPC 允许忽略函数返回值
- 修正 TPdf.AboutInfo 字符串,使其报告当前产品版本(v1.28.0 仅修改文档时遗漏更新,导致一直停留在 v1.27.0)
Version 1.28.0
- 大幅扩充 API 参考页面内容:每个属性、方法、事件、全局函数条目现在均包含 3 段 Description、Remarks 列表、多行 Delphi Example、以及更丰富的 See Also 链接,覆盖 200+ 个先前内容较薄的页面,包括所有 TPdf 计数属性、元数据访问器、字体/字符索引属性、页面级属性、索引记录、文档级方法,以及 TPdfView 的完整状态、显示、事件 API
- 微调帮助布局以对齐 losLab 的视觉基线:统一 h1/h2 字号,把 API 导航网格样式整合到共用 StyleSheet,并移除 Navigation.html 的内联 CSS 重写
- 文档构建附带辅助脚本 Docs\Build-Expand-Entries.ps1,可基于单一数据表重新生成条目页内容,便于后续维护
Version 1.27.0
- 新增 PDF/A-1b 创建支持:TPdf.SaveAsPdfA 将当前打开的文档保存为 PDF/A-1b 合规文件——通过增量更新注入 XMP 元数据流、sRGB ICC OutputIntent 及更新后的文档目录,无需额外 DLL API,全平台可用
- 新增 TPdf.SaveAsPdfAToStream:内存流方式输出 PDF/A 文件
- 新增 TPdf.ValidatePdfA:检查当前文档的 PDF/A 合规性(XMP pdfaid 标记、带嵌入 ICC 的 OutputIntent、加密检测),返回检测到的合规级别及具体问题集
- 新增 TPdf.PdfAConformance 属性:直接返回当前文档的合规级别(pac1b、pac1a、pac2b、pac3b、pacNone 或 pacUnknown)
- 新增类型(在新单元 FPdfPdfa.pas 中):TPdfAConformance、TPdfAValidationResult、TPdfAValidationIssue、TPdfASaveOptions
- SaveAsPdfA 支持通过 TPdfASaveOptions.IccProfileData 指定自定义 ICC 配置文件;留空时自动使用内置 sRGB IEC61966-2.1(HP/Microsoft,3144 字节)
- 将单体 HTML 参考手册重构为结构化 Web 帮助系统:302 个独立 API 入口页面(TPdf 和 TPdfView 每个属性、方法、事件、全局函数各一页),每页含完整说明、参数表、Delphi 代码示例和 See Also 链接
- 新增 Navigation.html:分六节(TPdf 属性/方法/事件、TPdfView 属性/方法/事件、全局函数)的 5 列弹性网格导航总览页,方便快速定位 API
- 将 TPdf.html 和 TPdfView.html 重写为精简组件概览页,保留类型参考章节(Types、Constants、Global Variables),成员列表改为链接至各入口页面
- 基于 Search.js 新增全文搜索,在 312 个已索引页面上做增量客户端匹配
- 全站所有导航栏链接统一指向 Navigation.html
Version 1.26.0
- 新增 Demo/Lazarus/BatchExport,v1.14.0 Delphi BatchExport 的 LCL 移植版。功能一致:多文件 PDF→JPG 批量导出 + 每文件总体进度 + 每页当前进度 + DPI / 质量 / 密码输入 + 基于 IPdfCancellationToken 的合作式取消。导出成功后用平台文件管理器打开输出目录
Version 1.25.0
- 为 TPdf 增加 Form XObject 页面复用能力,支持水印、模板叠加、“一页盖多页” 等场景:CreateXObjectFromPage 把其它文档的某一页打包成可重用句柄;InsertFormObjectFromXObject 把句柄的一份副本插入当前页面。返回插入的 FPDF_PAGEOBJECT,调用方可结合 FPDFPageObj_SetMatrix 与 v1.9.0 的 TPdfMatrix 辅助类做定位、缩放、旋转
- 新增 Pascal 类 TPdfXObject 封装 PDFium 的 FPDF_XOBJECT 句柄,析构时自动调 FPDF_CloseXObject,无需手工管理资源
- Delphi 与 Lazarus 回归测试套件扩展到 147 个用例,C++Builder 套件扩展到 123 个用例,覆盖句柄创建与页面对象插入两类契约
Version 1.24.0
- 新增 TPdf.RenderPageProgressive:可取消的 RenderPage 变种,驱动 PDFium 的渐进式渲染循环,在迭代间轮询 v1.7.0 的 IPdfCancellationToken。高 DPI 长时间渲染可以在页面绘制过程中中断,而不是等到完成才返回
- 返回 TPdfProgressiveStatus 枚举:prsDone / prsCancelled / prsFailed。传 AToken = nil 表示渲染到完成、不轮询取消(不会返回 prsCancelled)
- 使用 v1.21.0 引入的 zero-copy fast path —— PDFium 直接写入目标 TBitmap 的 DIB 缓冲。同样保留 legacy fallback 应对无法 wrap DIB 的少数情况
- Delphi 与 Lazarus 回归测试套件扩展到 145 个用例,C++Builder 套件扩展到 121 个用例,覆盖 nil token(完成)、预取消 token(prsCancelled)、以及与同步 RenderPage 像素一致性
Version 1.23.0
- 为 TPdfView 增加六个新方法,把 PDFium 的表单字段文本选择 + Undo/Redo 能力暴露给应用:GetSelectedFormText 返回当前聚焦表单字段中的选中文本;SelectAllFormText 全选;FormUndo / FormRedo / FormCanUndo / FormCanRedo 驱动聚焦字段的编辑历史。底层 PDFium API 早已绑定,但没有 Pascal 风格高层入口。视图非 Active 或文档没有 AcroForm 聚焦字段时,六个方法都安全短路返回空串 / False,不会崩溃
- Delphi 与 Lazarus 回归测试套件扩展到 142 个用例,C++Builder 套件扩展到 119 个用例,覆盖“无表单 / 无聚焦”场景下每个方法的契约
Version 1.22.0
- 为 TPdf 增加页面组合操作便捷接口:ImportPagesByIndex 通过零基索引数组从源文档复制指定页;ImportNPagesToOne 返回一个全新 TPdf,其页面是当前文档的 N-up 拼版;MovePages 原地重排页面。底层 PDFium API 早已绑定,但没有 Pascal 风格高层入口
- ImportPagesByIndex 接受空数组以导入全部源页面(对应 C ABI 的 nil 参数)
- Delphi 与 Lazarus 回归测试套件扩展到 136 个用例,C++Builder 套件扩展到 115 个用例,覆盖子集导入、全文档导入、页面重排、N-up 拼版四类场景
Version 1.21.0
- 渲染性能优化:TPdf.RenderPage / TPdf.RenderTile(以及对应的 TPdfView 辅助方法)切换到 zero-copy 输出路径。PDFium 现在直接写入目标 TBitmap 的 DIB 缓冲,不再写入内部缓冲后再逐行 copy,每次渲染节省一份 width × height × 4 字节的内存拷贝。高 DPI 场景(缩略图面板、打印质量导出、批量导出)收益最明显
- 保留旧的 per-scanline 路径作为安全 fallback,应对极端尺寸 / 异常 stride / OOM 等无法 wrap DIB 的少数场景。两条路径输出字节一致,fallback 只是慢一点
- Delphi 与 Lazarus 回归测试套件扩展到 132 个用例,C++Builder 套件扩展到 112 个用例,覆盖调用方 bitmap 自动升级 pf32bit、尺寸 round-trip、以及大尺寸 stride sanity 测试
Version 1.20.0
- 为 TPdfView 增加查找结果高亮:HighlightSearchText(Text, MatchCase, MatchWholeWord) 扫描视图当前页,返回找到的匹配数,并在每次重绘时为每个匹配画 HighlightColor 高亮矩形。ClearHighlight 清除高亮;切换到其他页面自动清除(匹配按页面绑定)
- HighlightColor 默认 clYellow,published 属性让应用可以根据 UI 主题调整高亮色
- Delphi 与 Lazarus 回归测试套件扩展到 129 个用例,C++Builder 套件扩展到 109 个用例,覆盖默认色、色 round-trip、对 sample.pdf 中存在单词的真实匹配数检测、以及对不存在单词返回 0 的约束
Version 1.19.0
- 为 TPdfView 增加 FitMode 属性,四种模式:pfmNone(手动缩放)、pfmActualSize(100%)、pfmFitPage(整页适应视口)、pfmFitWidth(页面宽度匹配视口宽度)。Resize 时与切页时自动重新应用 fit 模式,混合页面尺寸的长文档也能保持稳定的视觉填充
- 直接设 Zoom 会自动取消当前 fit 模式(FitMode 退回 pfmNone),符合主流 PDF viewer 的“输入缩放值就退出 Fit Page / Fit Width”惯例
- 默认 pfmNone,旧应用的显式 Zoom 行为不受影响
- Delphi 与 Lazarus 回归测试套件扩展到 124 个用例,C++Builder 套件扩展到 106 个用例,覆盖默认值、模式 round-trip、实际加载文档时 fit-page 产生真实缩放比、以及手动 Zoom 取消 fit 模式四类场景
Version 1.18.0
- 为 TPdfView 增加 PageColor 属性,把渲染出来的 PDF 页面底色与控件自身 Color 解耦。默认 clWhite,使 PDF 页面无论宿主主题如何都以“纸白”渲染。dark mode viewer 可以让滚动区维持深色背景,同时 PDF 页面仍然是白(或应用层指定的任何颜色)
- 行为变化:之前通过 TPdfView.Color 间接换页面底色的应用,应改成 PageColor。常见场景(主题化控件 + 白色 PDF 页面)的默认体验在不改一行代码的情况下变好
- Delphi 与 Lazarus 回归测试套件扩展到 120 个用例,C++Builder 套件扩展到 103 个用例,覆盖默认值与颜色 round-trip
Version 1.17.0
- 为 TPdfView 增加用户输入锁定开关,方便把 viewer 嵌入到 kiosk、预览面板、只读场景时无需 subclass 即可禁用导航手势:AllowUserPageChange 控制新增的 PgUp / PgDn / Ctrl+Home / Ctrl+End 键盘快捷键;ChangePageOnMouseScrolling 控制新增的滚轮上/下翻页;AllowUserTextSelection 为将来的鼠标拖选文本路径预留。三个属性默认 True,旧应用升级无任何行为变化
- 滚轮翻页路径跳过 Ctrl+滚轮,方便应用层继续把 Ctrl+滚轮保留给缩放
- Delphi 与 Lazarus 回归测试套件扩展到 118 个用例,C++Builder 套件扩展到 101 个用例,覆盖默认值与开关 round-trip
Version 1.16.2
- 扩展 TPdfView 注释链接点击回归覆盖:当 viewer 当前页与关联 TPdf 当前页不一致时,通过真实无界面鼠标点击路径验证自动跳转行为,覆盖 Delphi、Lazarus 与 C++Builder
- Delphi 与 Lazarus 套件现在各 114 个用例,C++Builder 套件现在 99 个用例
Version 1.16.1
- 修复 TPdfView 链接点击处理:自动注释链接与网页链接动作现在使用 viewer 当前显示页,即使关联的 TPdf 组件停留在其它页也不会错取缓存
- 加固 TPdfThumbnailView 的 Pdf 引用生命周期,关联的 TPdf 组件销毁时会自动清空引用,避免悬挂指针
- 新增缩略图 Pdf 引用生命周期回归覆盖;Delphi 与 Lazarus 套件现在各 113 个用例,C++Builder 套件现在 98 个用例
- 同步 README、测试说明、HTML Help 搜索/索引内容以及 C++ 包生成输出,使其覆盖 v1.7.0 到 v1.16.0 的整合更新
Version 1.16.0
- 新增 Delphi PrintDialog 示例(Demo/Delphi/PrintDialog),重点演示 N-up 打印(1 / 2 / 4 / 9 页拼一张)+ 奇偶页过滤 + 灰度渲染 + 可选的 1 像素单元格边框。作为既有 PrintPDF demo 的轻量伙伴,PrintPDF 已经覆盖了预览、最近文件、缩放、scaling 等大件功能
Version 1.15.0
- 新增 TPdfThumbnailView 组件(FPdfThumbnail 单元),垂直滚动侧栏,每行一个页面缩略图,支持鼠标悬停高亮、当前选中页高亮、单击切页。设计为与 TPdfView 并排放置,让用户能快速翻阅长 PDF
- 组件已注册到 losLab 组件面板,与 TPdf、TPdfView 同 tab。主要属性:Pdf、CurrentPageIndex、ThumbnailWidth、ThumbnailHeight、TextColor、HoverColor、SelectionColor、BorderColor,以及 OnPageClick 事件
- Delphi 与 Lazarus 回归测试套件扩展到 112 个用例,C++Builder 套件扩展到 97 个用例,覆盖默认值、缩略图尺寸 round-trip、极值截断、颜色 round-trip、以及事件处理器赋值
Version 1.14.0
- 新增 Delphi BatchExport 示例(Demo/Delphi/BatchExport),演示如何一次性把多个 PDF 文件批量转换为 JPG,使用 TPdf.LoadCustomDocument 流式加载、IPdfCancellationToken 合作式取消、以及“按文件整体进度 + 按页当前进度”两个进度条。每个文件用独立 TPdf 实例(PDFium 本身不是线程安全),导出成功后自动打开输出文件夹
Version 1.13.0
- 为 TPdfView 增加异步渲染 UI 提示:新增 AsyncRendering、LoadingText、LoadingColor 三个属性。AsyncRendering = True 时,单页 paint 路径在页面中央绘制一个 “Loading...” 小提示框,便于应用层在自己的 worker 做长渲染时与库统一 UI 标识
- 默认 AsyncRendering = False 保持向后兼容,不引入新视觉
- 文档明确说明:PDFium 本身不是线程安全的,把渲染真正搬到 worker 必须保证每个 worker 持有独立的 TPdf 实例;后续的批量导出 demo 展示该模式
- Delphi 与 Lazarus 回归测试套件扩展到 106 个用例,C++Builder 套件扩展到 93 个用例,覆盖默认值与三属性 round-trip
Version 1.12.0
- 为 TPdfView 增加基于点击的链接处理:新增 LinkOptions 属性控制四类 PDF 链接动作的自动行为 —— goto(页面跳转)、URI(ShellExecute)、launch(ShellExecute)、嵌入 GotoR(保留)。默认开启 loAutoGoto 与 loAutoOpenURI;loAutoLaunch 与 loAutoEmbeddedGoto 默认关闭,避免误点触发任意程序
- 新增 OnAnnotationLinkClick 与 OnWebLinkClick 事件,在自动动作之前触发,允许应用层检查链接、标记 Handled、或重定向(例如弹出安全确认)
- 链接点击检测仅在 click(非 drag)时触发,使用独立的 MouseDown 锚点判断,panning 等长拖拽手势继续走原有滚动路径不受影响
- Delphi 与 Lazarus 回归测试套件扩展到 102 个用例,C++Builder 套件扩展到 91 个用例,覆盖 LinkOptions 默认值、集合 round-trip、以及事件处理器赋值
Version 1.11.0
- 为 TPdfView 增加视觉增强:PageShadowSize、PageShadowColor、PageBorderColor 三个属性,可选地在页面矩形下方绘制阴影,并在四周绘制一像素边框。默认值保持旧的平面外观(PageShadowSize = 0;边框颜色默认 clBlack,但在白底控件上不显眼,直到调用方修改颜色)
- 新增 SmoothScroll 属性,作为将来分段滚动动画的 opt-in 开关;属性可 read/write 持久化,渲染逻辑保持现有即时滚动行为以避免破坏旧应用
- Delphi 与 Lazarus 回归测试套件扩展到 98 个用例,C++Builder 套件扩展到 89 个用例,覆盖默认值、属性 round-trip、以及负阴影尺寸截断为 0 的约束
Version 1.10.0
- 新增直接的图像插入接口:TPdf.AddImage 与 TPdfView.AddImage 接受文件路径或 TBitmap,是既有 AddPicture(TPicture) 的简化版。AddImage(FileName) 识别 VCL 与 LCL 注册过的所有图像格式(BMP、通过 PngImage 单元的 PNG、JPG 等),并走与 AddPicture 完全相同的内部管线,行为一致
- AddImage(TBitmap) 跳过 TPicture 中间层,方便已经持有 TBitmap 的渲染或批量生成场景
- Delphi 与 Lazarus 回归测试套件扩展到 92 个用例,C++Builder 套件扩展到 84 个用例,覆盖位图插入、页面对象 bounds、nil 位图拒绝、以及 BMP 文件加载
Version 1.9.0
- 新增高层变换矩阵支持:FPdfMatrix 单元提供 TPdfMatrix 类,OO 风格包装 PDFium 的 FS_MATRIX,支持 Translate / Scale / Rotate / 水平翻转 / 垂直翻转 / 中心翻转 / Skew / Multiply 等组合操作,方便在调用 FPDFPageObj_SetMatrix 等 PDFium API 之前先构造好复合变换
- TPdfMatrix.Multiply 在写入新行之前完整 snapshot 六个矩阵元素,修正了已知的 Pascal 同类实现先覆写 m.a / m.c / m.e 再据此计算同行第二列的 bug —— 该 bug 会让除单纯 translate 之外的所有矩阵复合得到错误结果
- Delphi 与 Lazarus 回归测试套件扩展到 88 个用例,C++Builder 套件扩展到 81 个用例,覆盖 identity、reset、translate/scale/flip、post-multiplicative 组合顺序、以及上述 Multiply 回归用例
Version 1.8.0
- 新增按需流式加载:TPdf.LoadCustomDocument(AStream, AOwnsStream) 方法配合 TPdfStreamAdapter 辅助类,底层接入 PDFium 的 FPDF_LoadCustomDocument。PDFium 在需要时才从外部 TStream 读取数据块,超大 PDF 或远端流不再需要先完整拷入内存
- 支持可选的 stream 所有权:AOwnsStream = True 时把 TStream 生命周期交给 TPdf,UnloadDocument 时自动释放
- Delphi 与 Lazarus 回归测试套件扩展到 79 个用例,C++Builder 套件扩展到 75 个用例,覆盖 TFileStream 流式加载、owned-stream 卸载释放、以及外部所有 stream 在卸载后仍存活三类场景
Version 1.7.0
- 新增 FPdfAsync 单元,提供合作式异步取消原语:IPdfCancellationToken / IPdfCancellationTokenSource,以及全局 PdfNoCancellationToken 单例,使长任务渲染、批量导出等流程具备从 UI 端发起干净取消的能力
- 新增轻量 TPdfFuture<T> 助手,在后台线程跑 worker,把 TPdfFutureResult<T> 结果信封 dispatch 回主线程,区分成功、取消与失败三种结果
- Delphi 与 Lazarus 回归测试套件扩展到 76 个用例,C++Builder 套件扩展到 73 个用例,共享覆盖取消状态、幂等 Cancel、回调批量触发、取消后注册回调四类行为
Version 1.6.10
- 新增高层 TPdf.PrintPageRanges,可读取 PDF viewer preference 中的打印页码范围,并以一基页码范围返回给应用层
- 新增 TPdf.SetFormFieldFlags / SetFormFieldFlagsAt 以及对应 TPdfView 辅助方法,应用可通过公开 API 修改 AcroForm 字段标志,并补齐 password 与 multi-select 标志覆盖
- 加强 PDFium 绑定 ABI 覆盖,固定 Windows 下 FPDF_DWORD、FPDF_FILEACCESS 回调和 V8 embedder slot 字段的尺寸约束
Version 1.6.9
- 新增低层 Skia 渲染绑定,开放当前标准版与 V8 版 bundled PDFium DLL 新导出的 FPDF_RenderPageSkia 和 FPDF_FFLDrawSkia
- 扩展 public 绑定覆盖检查,现在标准 DLL 与 V8 DLL 加载测试会与既有 V8/XFA 能力探测一起验证 Skia 渲染入口
Version 1.6.8
- 新增 TPdf.SetTextPositions 与 TPdfSingleArray,可通过当前 DLL 新导出的 FPDFText_SetPositions 为既有文本对象设置逐字符位置
- 将 FPDFText_SetPositions 提升为当前随包 PDFium DLL 的必需绑定;同时确认 Skia 渲染入口仍不可用,因为当前 DLL 仍未导出这两个函数
- Delphi、C++Builder、Lazarus 三套回归测试扩展到每套 65 个用例,覆盖文本位置设置
Version 1.6.7
- 新增 TPdf 对文档级 JavaScript name-tree action 的高层读取能力,可通过 JavaScriptAction 与 JavaScriptActions 取得 action 名称和脚本内容
- 新增 TPdf.FileIdentifier,以不含 PDFium 终止字节的二进制 TBytes 读取 trailer 中的 permanent / changing 文件 ID
- 新增 TPdf.PageBox、GetPageBox、SetPageBox,可读写当前页的 MediaBox、CropBox、BleedBox、TrimBox 和 ArtBox
- 重新确认当前随包 PDFium DLL 只剩 Skia 渲染入口无法在运行时开放,因为这些导出并不存在于当前 DLL
- Delphi、C++Builder、Lazarus 三套回归测试扩展到每套 64 个用例,覆盖文档 JavaScript、trailer ID 与页面 box 读写
Version 1.6.6
- 新增随运行时 DLL 选择的 V8 版 PDFium 支持。加载前设置 EnableV8Engine 后,会从 DLLs\Win32 或 DLLs\Win64 目录树选择 pdfium.v8.dll,并在该 DLL 实际导出对应入口时开放 V8/XFA 专用绑定
- 新增 V8FeaturesAvailable、XfaBStrHelpersAvailable、GetRecommendedV8Flags,并开放 FPDF_BStr_*、FPDF_GetRecommendedV8Flags、FPDF_GetArrayBufferAllocatorSharedInstance 等低层可选绑定
- 将 FPDFText_SetPositions 改为可选绑定,让 PDFium Delphi Component 在所加载 PDFium DLL 不导出该实验性文本位置 setter 时仍可正常加载
- Delphi、C++Builder、Lazarus 三套回归测试扩展到每套 61 个用例,覆盖标准 DLL 与 V8 DLL 的能力探测