HotPDF 中文更新日志

HotPDF 面向最终用户的版本历史,包含功能增强、修复、兼容性更新和文档变化

注:仅保留最新 800 条变更记录

Last release

  • 最新版本:2.974.0;发布日期:2026-10-11

Version 2.974.0

Added

  • 按精确页面与 Unicode 名称移除页面注释,含 popup 与回复级联,经由有界原生 API、Windows 事务、JSON 作业和带版本回调完成,带经认证的权限与发布回滚

Version 2.973.0

Added

  • 通过原生 API、Windows 交换和带版本回调交换二进制 FDF 注释,保留外观资源、共享对象图和本地动作目的地

Version 2.972.0

Added

  • 渲染注释默认外观,保留文本状态、自动适配、富文本间距和文本裁剪,含渲染模式 4 到 7

Version 2.971.1

Fixed

  • 在 FPC 3.3.1 Windows 构建上防止公开 shaped-run 缓存的 range check 失败,保留显式 32 位模乘哈希、精确的缓存键隔离和 LRU 驱逐

Version 2.971.0

Added

  • 匹配根 :scope,并接受带非激活交互状态的静态 hover、active 和 focus 伪类,保留取反、逻辑与相对选择器、supports 查询以及已保存的 FDF/XFDF 外观

Version 2.970.0

Added

  • 对原生富文本的 @supports 组和 supports() 导入求值,带声明与选择器查询、有界的嵌套条件、感知命名空间的探测和取消后恢复,并计算出已保存的 FDF/XFDF 外观

Version 2.969.0

Added

  • 在原生富文本解码、保存字段外观和富文本 FDF/XFDF 导入中求值有限的 calc、min、max、clamp 表达式、相对根与显式视口长度,以及最终字体的行与间距度量

Fixed

  • 各编译器目标一致地接受精确的最小媒体尺寸、分辨率和初始字号,同时继续拒绝低于支持下界的值

Version 2.968.0

Added

  • 求值显式的富文本 color scheme、reduced motion、透明度与数据偏好、对比度、强制色与反色,以及脚本可用性,同时保留未知或省略的偏好和计算出的已保存外观

Version 2.967.0

Added

  • 应用调用方提供的链接与导入富文本样式表,支持共享的 preferred 或 alternate title 集合、有界的 URI 与文档基准解析,以及事务化的原生、Windows、Linux FDF/XFDF 发布

Version 2.966.0

Added

  • 求值带显式 print/screen 配置、嵌套条件和有界特性范围的原生富文本媒体查询,把计算出的样式保留在已保存外观和事务化 FDF/XFDF 导入中

Version 2.965.0

Added

  • 以事务化方式创建、克隆和编辑原生 XFA form tree,保留存活节点身份、事件回滚、受支持的空合并场景和已保存 form packet,不依赖作者编写的模板

Version 2.964.0

Added

  • 从完整的 OpenType CFF2 字体按默认 variation 坐标生成原生 plain、rich、shaped 与 family 外观,在有界的静态 CID-keyed CFF 1 输出中保留字形身份、Unicode、宽度和嵌入权限

Version 2.963.0

Added

  • 把带作用域的 CSS 命名空间声明和限定选择器应用到原生富文本字段与 Windows/Linux 表单事务,保留计算出的外观、有界命名空间查找、精确的 no-op 发布和 checked build 兼容性

Version 2.962.0

Added

  • 在空格和连字符边界对生成的 raw 字体注释文本跨样式 run 换行,保留完整的编码字符、硬换行、自动尺寸和有界取消

Version 2.961.0

Added

  • 用原始的 Type1C、CIDFontType0C 和裸 Type1 字体程序渲染缺失的注释文本外观,保留 Unicode 映射、自动尺寸、间距、行高和有界的不可变资源

Version 2.960.0

Added

  • 传输标准 XFDF Stamp 的 normal、rollover、down Form 外观,携带内嵌字体与图像资源、有界无环图、经认证的原生事务和既有 Windows/Linux 回调

Version 2.959.0

Added

  • 把复杂 not 列表、宽容的 is 与 where 列表、锚定的 has 关系和过滤的 nth-child 位置应用于原生内部富文本样式表,保留选择器优先级、计算值、字体和事务化 FDF/XFDF 外观

Version 2.958.0

Added

  • 在 JavaScript 和 FormCalc 中通过只读数字索引访问存活的 Data DOM 子集合,保留当前子节点顺序、留存的 script 对象引用、独立克隆、保存值和 PDF 外观

Fixed

  • 拒绝在当前集合和留存的词法 script 对象内部做数字赋值、删除和属性定义,配合有界的事件回滚与重试

Version 2.957.0

Added

  • 把属性选择器、兄弟组合器、结构与位置伪类、继承的语言匹配和复合取反应用于原生内部富文本样式表,保留实际计算值、字体、已保存外观和事务化 FDF/XFDF 导入

Version 2.956.1

Fixed

  • 通过真实的事件编译器解析 FormCalc 的 nodes 子列表路径,保留存活的 form/property 集合、Data DOM 条目访问、有界回放、保存的原生值和 PDF 外观

Version 2.956.0

Added

  • 从完整的 OpenType CFF 字体生成原生 plain、rich、shaped 字段外观,保留按名称键控的字形身份、实际 CID-keyed 字符集、Unicode 映射、嵌入权限和共享字体资源;用内嵌 OpenType 默认值渲染缺失的 FreeText 外观

Fixed

  • 为 CFF 解析和字形度量设界,保留取消与按样式独立的不可变读取器,并在六个原生编译器目标上保持 TrueType 行为

Version 2.955.1

Security

  • 在规范字节序列化后拒绝全零的 X25519 与 X448 共享密钥,包括弱域 limb 非零的低阶输入,并让协商结果保持 False,附空密钥和全新的诊断信息

Fixed

  • 在启用整数溢出与范围检查时保留可移植的 SHA3/SHAKE 常量和有意的 modulo-2^64 密钥协商算术,包括 32 位 Free Pascal 上的全宽度 P-256、P-384、P-521 交换

Version 2.955.0

Added

  • 新增存活的 JavaScript form/property 子集合,支持 length、按索引读取、item、namedItem、迭代和独立克隆;跨事件、重复实例编辑和隐式属性创建保留所有者身份,并保存原生值和 PDF 外观

Fixed

  • 让留存的存活列表始终挂在当前事件所有者上,所有者被移除时直接拒绝而不改投其他实例,并在集合分配、操作和截止期失败时保留原生值、留存状态和 journal 回滚

Version 2.954.0

Added

  • 把内部 XHTML 样式表应用到原生富文本字段和 FDF/XFDF 导入,支持 type、class、ID 选择器、后代与子组合器、分组选择器、Unicode 标识符转义、优先级、important 与源顺序

Fixed

  • 把计算出的样式保留进真实保存值和控件外观,扫描与匹配设界、支持取消、提交的 no-op 字节精确一致,回调按事务回滚

Version 2.953.0

Added

  • 新增独立的 XFA 查询节点集合,支持 all、classAll、classIndex、clone 和成员判断操作、稳定的留存引用、有界的事务化回放,以及原生保存 PDF 消费

Fixed

  • 让留存的查询 instance manager 挂在当前事件图上,并在原有默认栈与操作限制内求值普通 SOM 路径和谓词

Version 2.952.0

Added

  • 通过原生、普通 Windows 和带版本的回调 XFDF 交换保留远程 GoToR 注释目标,包括精确坐标、Unicode 文件规格和可选窗口行为

Fixed

  • 对已加载文档的普通注释导入按原始加密权限、签名和字段锁做认证,同时保留允许的调用方编辑和独立源生命周期;读取签名 ByteRange 整数不再经 Single 舍入,并在加密前分离共享的 RC4 字符串存储

Version 2.951.0

Added

  • 为没有 normal 外观的 Square、Circle、Polygon、FreeText 注释渲染有界的云状边框,保留宽度、虚线、不透明度和源图;在 FreeText 视图间共享不可变的生成字体字节,不重复计入解码字节,同时保留解析预算与取消

Version 2.950.0

Added

  • 创建、克隆、重命名、插入和移除原生 XFA Data DOM 节点,带边界的所有权、继承命名空间、稳定的导入引用、绑定刷新和完整事件回滚;通过保存的 XML 和原生 PDF 消费方保留 UTF-8 属性和留存的 FormCalc 引用

Version 2.949.0

Added

  • 通过原生、Windows 和 Linux XFDF 交换保留「没有选中选项」与「选中了空导出值」的区别,带精确 no-op 发布、有界校验和 checked 加密文档加载

Version 2.948.0

Fixed

  • 渲染填充字形掩码时捕获小数裁剪覆盖,同时保留 PDF 路径、pattern、alpha 和混合算子,并在分配前检查栅格工作内存容量

Version 2.947.1

Fixed

  • 在 XFA 解析和序列化期间保留显式的空默认 XML 命名空间声明,避免未限定的数据子树在保存并重新加载后继承祖先命名空间

Version 2.947.0

Added

  • 渲染斜面与内嵌矩形注释边框以及实测的 Unicode 或富文本行标题,保留不透明度、端点偏移、既有外观、有界字体资源和注释裁剪

Version 2.946.3

Fixed

  • 通过原生事件应用 xfa.host.resetData,不再误读为 Data XML 导入,保留模板默认值、绑定值、重复作用域、待处理编辑和事务化回滚

Version 2.946.2

Fixed

  • 修复启用编译器范围与溢出检查时的 SHA-1、SHA-256、SHA-384、SHA-512 字运算,保留有效摘要和 AES-256 口令认证,公共接口不变

Version 2.946.1

Fixed

  • 通过原生 XML 序列化、持久属性默认值、重复脚本事件和事务化回滚,保留存在但为空的 XFA 属性以及 UTF-8 名称、值、命名空间和索引查询

Version 2.946.0

Added

  • 以显式只读 Preview/Print 字体权限和不变的全量字体字节渲染临时富文本注释文本,保留可编辑的嵌入策略和既有 Screen 外观,不引入隐式媒体占位

Version 2.945.0

Added

  • 通过原生与 legacy XFDF 交换保留本地注释页与命名目标,十进制 token 精确且有界、限定名 Adobe XML、重复属性校验,以及事务化 Windows/Linux 回调发布

Version 2.944.0

Added

  • 通过 JavaScript 和 FormCalc 管理存活的 XFA choice 显示与导出条目,保留存活别名、精确的重复或空选中、原生的按实例列表,以及有界变更限制下保存的原生或 legacy PDF 外观

Version 2.943.1

Fixed

  • 当原生混合 scalar 与类型化富文本事务或空批次未做任何更改时,保持已加载 PDF 字节精确不变,保留待处理的图编辑、经认证的签名与加密策略、资源限制和原子发布

Version 2.943.0

Added

  • 通过 Windows 文件作业和原始 V1 回调交换映射注释 XFDF,带经认证的追加事务、有界二进制与 Unicode 数据、精确 no-op 字节和原子发布

Version 2.942.0

Added

  • 通过有界的临时几何、线端、图标和 Unicode FreeText 渲染没有 normal 外观的受支持注释,保留源资源、富文本、查看/打印标志和取消

Version 2.941.1

Fixed

  • 用有界可取消的排序校验原生 XFA choice 选中唯一性,同时精确保留区分大小写的导出值、原始选中顺序和事务化失败行为

Version 2.941.0

Added

  • 把独立级联的原生 CSS 与原始类型化字符/字间距应用到 shaped run、物理行、排版适配和已保存外观,带计算出的 point 序列化、精确十进制舍入和事务化 Windows/Linux JSON 发布

Version 2.940.0

Added

  • 通过有界的原生 XFDF 和 Linux V1 JSON 操作交换十八种映射注释类型,保留 Unicode 富内容、callout、透明色、二进制附件、popup 与转发回复链接、经认证的权限和事务化追加发布

Version 2.939.0

Added

  • 创建 legacy XFA combo 和 list 字段,精确保留重复实例导出值、显示标签、选中索引、滚动位置和带样式 Unicode 外观,保留高位字段标志和按字段回滚,并提供指定字体的分离 choice 工厂与仅元数据模式

Version 2.938.0

Added

  • 让四种标准色彩 intent 在图形状态、表单、图像、shading、pattern 和透明群组间一致渲染,支持图像级覆盖、未知名称的相对回退和有界可取消的 ICC 变换缓存

Version 2.937.0

Added

  • 从真实的重复实例作用域创建独立的 legacy XFA radio 组,精确保留导出值、选中状态和带样式的 Unicode 标题,支持整组接管的回滚,并提供独立分离、由调用方提供字体的原生成员外观 API

Version 2.936.1

Added

  • 解析合法的 PDF dictionary 与 trailer 时默认启用算术溢出检查,做法是显式保留 FNV 哈希乘法的 low32 位

Version 2.936.0

Added

  • 把显式的类型化 JSON 富文本行高绑定到 Windows 与 Linux 保存外观上,保留作者写入的 run、传入的父级度量、有界的聚合规划和跨混合字段的事务化更新

Version 2.935.1

Added

  • 在可移植的 XFA 密码外观中把增补 Unicode 字符只计一次,保留原始值,并在分配掩码前执行聚合字形预算,取消粒度精确到单个标量

Version 2.935.0

Added

  • 在原生排版、保存外观、Windows 文件作业与回调、以及 Linux FDF/XFDF JSON 导入的整条链路上,保留富文本行高、计算出的 CSS 长度、继承系数和父级字体度量,并配合有界的度量字体规划

Version 2.934.0

Added

  • 创建真正的 Unicode legacy XFA 文本、数字、日期和密码外观,带按实例生效的字体 family 与 style、可编辑的嵌入字体资源、标量密码掩码和事务化的资源接管

Version 2.933.0

Added

  • 求值多维采样的三次颜色函数时沿用现有的四节点标量约定、短维度线性回退,tensor 计算有界,支持取消,标量插值行为保持不变

Version 2.932.0

Added

  • 解码带符号与无符号的 JPEG 2000 分量至 26 bit,支持混合精度、subsampling 与不透明度,规范化有界采样,并在渲染前忽略 JPX 图像的 BitsPerComponent 声明

Version 2.931.0

Added

  • 保留 legacy XFA checkbox 的 on、off 与 neutral 导出状态、带样式的 Unicode 标题和原生外观包,一致地编码特殊 PDF 名称,并在 widget 接管被取消后还原直接页面资源

Version 2.930.0

Added

  • 求值自动的可选内容 usage 应用,支持显式 zoom、语言与用户上下文、持久的原生手动选择和有界的 Linux JSON 操作状态;文档变更后使借出的渲染上下文失效

Version 2.929.0

Added

  • 用调用方按序提供的 regular 字体 family 构建标量文本、comb 单元格、choice 标签和按钮标记,覆盖原生 setter、Windows 作业和带版本号的 Windows/Linux 回调;保留普通标量元数据,并区分空 choice 选择与选中的空导出值

Version 2.928.0

Added

  • 渲染 ExtGState 的 dash 数组与相位时使用有界的类型化 PDF 数组扫描,保留注释、严格的操作数校验、继承的描边几何与取消支持,普通文本数组不受影响

Version 2.927.0

Added

  • 用实际安装的 family/style 程序、持久的按实例覆盖和原生 normal/down/rollover 外观包,绘制原始 Windows ApplyXFAAsAcroForm push-button 的标量与富文本标题,并注册真正的 AcroForm 字体资源

Version 2.926.0

Added

  • 把有界的行内 CSS font shorthand 展开为独立级联的 size、weight、italic 和调用方指定 family 候选,保留继承的相对字号、缺省样式的重置、important 分量优先级和实际保存的字体外观

Version 2.925.0

Added

  • 通过 Windows 文件作业和 V1 回调,为完整的带样式富文本字形簇选择调用方按序提供的字体 family,保留 CSS 与类型化候选、真实的空值事务和聚合字体预算

Version 2.924.0

Added

  • 在带标记的页面内容、Form XObject 和注释上渲染默认文档可选内容组与成员关系表达式,保留隐藏图形与文本状态,并通过原生 Linux V1 JSON 接口暴露显式的 view 或 print usage

Version 2.923.0

Added

  • 经由原生外观和 Linux V1 JSON 保留有序的富文本字体候选列表,把标量与原始类型化 run 混合的内容绑定到 Windows 文件作业和保持不变的 V1 回调,带精确绘制、调用方提供的 style 程序和两阶段发布

Version 2.922.0

Added

  • 按 PDF 2.0 Invisible 规则选择原生注释的 view 或 print 可见性,识别 RichMedia 与 Projection 的静态外观以及隐式 Text 变换,并保留有界、可取消的 Windows PNG 原子替换和真实的 OS 错误诊断

Version 2.921.0

Added

  • 渲染原生 XFA push-button 的标量与 XHTML 标题,使用真正的调用方 family 和 style 程序,保留行内分隔符与原始 padding,生成真实的 normal/down/rollover 外观,支持标题可见性和持久的重复实例覆盖

Version 2.920.1

Fixed

  • 让成功的原生 Linux C ABI PDF 修改与其已提交的源快照保持对齐,后续同值 FDF 或 XFDF 导入因此能保留已发布的精确表单值、类型化外观、绘制的文本和导入页面,而不是回退到陈旧的输入字节

Version 2.920.0

Added

  • 在一次独立的原子文档事务里保存标量字段与原始类型化富文本 run 的混合内容,保留精确的外观值和调用方提供的字体程序,维持已认证策略与当前对象图编辑,并识别真正的只读外观 no-op

Version 2.919.0

Added

  • 用显式提供的候选字体 family 解析完整的带样式 Unicode 字形簇,保留原始值和精确的外观样式,通过保持不变的 V1 回调暴露可选择的原生 Linux JSON fallback,并在加载配置字体程序时保留真实的聚合字体额度

Version 2.918.0

Added

  • 从生效的 XHTML 和调用方提供的命名 style 字体渲染原生 XFA Boolean 标题,保留重复实例叠加和已保存的运行时 XML,并用最终逻辑文本行范围度量自动标题预留

Version 2.917.0

Added

  • 为 Windows FDF 和 XFDF 导入选择真正的命名 family 与 style 程序,来源可以是嵌套文件路径或既有的带版本号字体回调,并把同步的随机源读取与顺序事务发布隔离开

Version 2.916.0

Added

  • 解码并渲染 182 个内置 legacy CMap,支持 1 到 4 字节的有界编码、精确的父级与子级书写方向、Unicode 映射、确定性的坏码恢复和可取消的继承,并附带再分发声明

Version 2.915.0

Added

  • 通过字体度量选窗和持久化的顶部索引让选中的原生 XFA 列表选项保持可见,保留完整的选项与值数组,并支持重复实例字体变更和事件回滚,可见字形准备有界

Version 2.914.1

Fixed

  • 在取得真实内存预留后,把前台内存缓存命中与协作式预取取消重叠执行,保留操作缓存遥测,并在缓存锁或预留等待后重新检查取消,同时维持严格的 miss 顺序和线程 join

Version 2.914.0

Added

  • 创建原生 XFA Boolean 外观,支持六种自定义标记、圆角或方角边框、标记颜色与尺寸、五种标题摆放位置和共享的嵌入标题字体;在事件执行和已保存 PDF 重载的全程保留可逆的 Unicode 导出别名和语义不同的合法 neutral 状态

Version 2.913.2

Fixed

  • 先解码完整的旋转矩阵条码再处理断开的碎块,在全网格采样前拒绝精确不匹配的 QR finder 图案,保持更紧的分组、原有的线性条码行为、原子扫描预算和不变的两秒时限

Version 2.913.1

Added

  • 通过有界的实时数据上下文解析既有的隐式 XFA 值,不把重复的选择器解析计入脚本操作额度,保留原有的事务期限和显式绑定行为

Version 2.913.0

Added

  • 通过保持不变的 Linux V1 JSON 回调,为类型化填充和 FDF 或 XFDF 导入选择已配置的原生富文本字体 family,在聚合预算内加载实际需要的 family 与 style 程序,并通告两个已实现的 rich profile

Version 2.912.0

Added

  • 通过 Windows 文件作业和 V1 回调导入导出真实的 FDF 或 XFDF,输入不可变且自持,先准备当前未保存的对象图,生成真实的四字体富文本外观和已认证的签名 AES 策略,只有两个输出回调都成功才提交上下文

Version 2.911.0

Added

  • 创建原生 XFA 的矩形、直线和圆弧绘制以及行内 PNG 或 JPEG 图像,带真实的采样解码、alpha 掩码、适配的宽高比和旋转摆放,准备工作有界,取消时保持事务化的所有权

Version 2.910.0

Added

  • 围绕变换后的左上角矩形锚点适配 NoZoom 和 NoRotate 注释外观,在缩放与旋转全程保留 UserUnit、适配后的表单几何、不透明度和真实的页面裁剪

Version 2.909.0

Added

  • 按富文本 run 选择调用方实际提供的命名 TrueType family,支持有界的 XHTML font-family 声明,保留每个 family 的 style 度量和标记缓存,并以 family 感知的规范化比较导入真实的 FDF 或 XFDF 富文本值

Version 2.908.1

Fixed

  • 应用合法的行内富文本声明时支持独立的 important 优先级、外层计算出的 font-size 基准和显式继承属性,保留 CSS 注释以及引号/函数声明的边界

Version 2.908.0

Added

  • 直接从已保存的运行时数据创建真正的原生 XFA combo box、list box、多选字段、checkbox 和按结构分组的 radio 组,带成对的 display/export 标签、按实例的条目、访问标志和独立的原生外观状态

Version 2.907.1

Fixed

  • 在名称型与继承的表单字段里解码真实的 PDF 十六进制转义和 UTF-8 字节,经原生已保存文档重载后仍保留带空格、带标点和 Unicode 的按钮导出状态

Version 2.907.0

Added

  • 通过真实的字体 CID-to-GID 映射渲染真实的 CID-keyed CFF 字形标识和有界的 notdef 替换,在转义 CMap 解析全程保留独立的文本提取和取消检查

Version 2.906.0

Added

  • 在缺少 attachment 锚点时,用实际选中的字形边界和 canonical combining class 定位跨样式的 combining mark,支持独立字体缩放和同侧堆叠,双 mark 情形采用实际解析出的条目方向

Version 2.905.1

Fixed

  • 在真实 DecodeParms dictionary 内解析转义的 predictor 参数,并在平衡的外层 dictionary 语法之后定位真实流 token,普通 Windows 加载中保留空白值形式的二进制 xref 载荷

Version 2.905.0

Added

  • 在 Linux 和 Windows 上直接从 XDP 和已保存的运行时值创建原生 PDF 页面树、可编辑的重复字段、push button 和 Unicode 静态文本,带真正的嵌入外观,并在调用方输出前做有界的候选准备

Version 2.904.2

Fixed

  • 读取真实外层交叉引用流 dictionary 时不与嵌套的加密设置混淆,解析转义的条目名称,并在普通 Windows 增量修订中保留直接的 encryption dictionary

Version 2.904.1

Fixed

  • 在自动独立 shaping 和普通多行字段换行中保留完整的段落方向控制与配对括号,带物理行 joining 上下文、不可变段落缓存和有界的总字形输出

Version 2.904.0

Added

  • 在 Linux 上执行原生 XFA JavaScript、事件日志、Data DOM、XML、FormCalc 和 ICU locale 运行时,使用自持的共享模块租约和真实的单调时钟,同时保留现有的 Windows Unicode 初始化

Version 2.903.1

Fixed

  • 让仅含方向控制的 Unicode shaping 簇保持零字距推进,同时保留逻辑控制符、字形标识和正常的可见簇与词间距

Version 2.903.0

Added

  • 在换行的富样式文本行间保留方向 embedding、override、isolate 和配对括号段落上下文,暴露有界的、由段落推导并缓存的物理行排序 API,并以解析出的层级与脚本对真实行条目做 shaping

Version 2.902.0

Added

  • 通过真实的 Linux JSON C ABI 回调导入导出带样式的 FDF 和 XFDF,嵌入配置的真实 font face,保留签名策略以及 no-op 导入的精确私有源字节,只有两个回调输出都成功才发布当前文档状态

Version 2.901.0

Added

  • 渲染 Coons 与 tensor patch mesh shading,三次几何有界,支持源空间颜色插值、延续边和折痕处理,以及事务化的资源与取消限额

Version 2.900.0

Added

  • 以事务方式加载和保存感知命名空间的原生 XFA Data DOM XML,保留有序混合内容和数据绑定标识,线性时间引用宿主值,并通过有界的引擎重放保留精确的每会话 JavaScript 模块租约

Version 2.899.0

Added

  • 用独立字体缩放把带样式的 combining mark 挂接到真实的 GPOS base、ligature 和 mark 锚点,在富文本 widget 裁剪内保留负原点字形轮廓,并为可见堆叠 mark 预留合适的行范围

Version 2.898.0

Added

  • 读写有界的 FDF 和 XFDF 富文本,把原生 XHTML style span 解码为四种真实的嵌入字体样式,并以事务方式把真实外观导入已签名或已加密 PDF,包括对既有只读富文本值的规范化比较

Version 2.897.0

Added

  • 用真实的周围上下文对选定的 Unicode style span 做 HarfBuzz shaping,暴露原生段落顺序与方向 API,把类型化富文本条目放进实际换行后的物理行,同时保留逻辑样式和对象所有权

Version 2.896.0

Added

  • 在重复数据作用域内解析原生 XFA 绑定 SOM,后代遍历有界,支持转义名称、Unicode 匹配、按实例的缺失叶子回退和事务化的运行时值同步

Version 2.895.1

Fixed

  • 每个自持 JavaScript 引擎只编译一次静态原生 XFA 事件支持,并完整重放紧凑的动态事件参数,回滚期间保留闭包、记录的宿主响应、实例隔离、原有日志预算和事务期限

Version 2.895.0

Added

  • 通过既有的带版本号原生 Linux JSON 回调导入导出真实的 FDF 和 XFDF 字节,保留 Unicode 字段值、AES 安全性和已认证签名策略,输出或结果发布失败后回滚当前文档

Version 2.894.0

Fixed

  • 跨字体与颜色样式,在完整的 Unicode 字形簇边界换行过宽的类型化富文本,分配行之前先实测带样式范围,保留不可拆分的超大字形簇、混合字号和显式字符间距

Version 2.893.1

Security

  • 在接受受签名策略保护的表单更新前,先在真实的 RFC3161 文档时间戳内认证所需的 Adobe 签名 CRL 与 OCSP 证据,证据缺失、吊销、过期或不受信时一律按事务拒绝

Version 2.893.0

Added

  • 读写有界的原生 FDF 和 XFDF 标量字段数据,以事务方式把真实的 Unicode、choice 和 button 外观导入独立发布的 PDF,保留已认证签名策略和 AES 加密

Version 2.892.0

Added

  • 渲染有界的 free-form 与 lattice 三角 mesh shading,坐标、标志、函数、颜色和透明度语义真实,十六进制 Indexed 调色板流只解码一次

Version 2.891.0

Added

  • 在事件导入、序列化、克隆和事务回滚全程保留有序的原生 XFA XML 注释与处理指令,同时不让它们进入标量文本、富文本和 SOM 元素选择

Version 2.890.1

Fixed

  • 用最多八次可取消的替换尝试恢复暂时性的 Windows 原子发布锁冲突,精确保留目标、已准备字节、永久性操作系统错误和自持暂存清理

Version 2.890.0

Added

  • 在类型化富样式 run 间保留合法的 Unicode 单词、不换行空格、标点和数字分组,用真实的带样式字体 advance 整组适配,保留混合尺寸基线,并在样式接缝处合并 CRLF

Version 2.889.0

Added

  • 在可见字段提交后同步已物化的 hidden 与 invisible XFA 标量别名,保留原生重复数据作用域、显式空值和精确的事务回滚

Version 2.888.0

Added

  • 通过既有文档 API 应用完整的 Unicode 17 属性与上下文断行,暴露原始或经 LB1 解析的可移植属性查询,保留既定 enum 序号和 tailoring 契约,并遵守 soft hyphen 禁则

Version 2.887.0

Added

  • 导入并序列化持久的原生 XFA exData XML,支持脚本立即读取、命名空间与混合内容保留、重复实例标识维持、事务回滚和真实的已保存 XHTML 渲染

Version 2.886.0

Added

  • 创建并认证独立的 RFC3161 PDF 文档时间戳,流式处理有界,支持 SHA256、SHA384 或 SHA512 imprint、受信 TSA 身份与 nonce 绑定、必需的 ESIC 扩展声明,以及经过认证的 certification 或字段锁定例外

Version 2.885.0

Added

  • 暴露 Unicode 17 默认断行机会并在真实原生富文本字段中消费,保留不换行空格、连字符与标点分组及 Unicode 显式分隔符,V 与 RV 值同原始完全一致

Version 2.884.0

Added

  • 暴露可移植的 Unicode 17 默认扩展字形簇边界,在完整字形簇处换行过宽的富文本单词,保留真实 Unicode 外观内容,并修正子串 shaping 后的连写形式宽度变化

Version 2.883.0

Added

  • 创建持久的原生 XFA 图像与几何 value 子节点,渲染真实的 PNG alpha、图像 DPI 和宽高几何,保留重复实例隔离和事务回滚;修正 FPC 下此前渲染为黑色的图像像素

Version 2.882.0

Added

  • 在 Form、Type3 和 Pattern 渲染中继承真实的子流字体资源与 PDF 文本参数,保留图形状态文本保存,遵循不可见的 Type3 文本,并重置独立的注释外观默认值

Version 2.881.0

Added

  • 自动认证带必需签名证书绑定的标准 detached CAdES 签名,一致地读取真实的十六进制或转义字面 Contents 字符串,用于校验、允许的表单更新和长期验证证据

Version 2.880.2

Fixed

  • 富文本段落对齐在空初始 run、行内样式变更和显式换行时保持不变,并绘制请求的矩形或圆形边框和实测高亮行,不再静默省略

Version 2.880.1

Fixed

  • 在页面渲染器分配与上下文安装之前以及初始化期间都响应取消,构造初次被拒时保留调用方仍活跃的颜色上下文,释放借用的显示列表且不发布半成品位图

Version 2.880.0

Added

  • 在脚本创建后渲染真实的原生 XFA 标量 draw 与标题值,保留显式空值和重复实例隔离,后续原生绘制耗尽预算时仍能精确回滚

Version 2.879.0

Added

  • 创建持久的原生 XFA 标量 value 子节点,字段、数据和共享别名即时同步,类型化表单持久化、widget 提交、重复实例隔离和精确事务回滚一应俱全

Version 2.878.0

Added

  • 为合并与分离 widget、旋转、加密和 certification 工作流生成真实的 Windows 签名外观 profile,内嵌 Unicode 字体,并按实际生成的 profile 强制执行必需的 AppearanceFilter

Version 2.877.0

Added

  • 渲染真实的着色与未着色 PDF tiling 和 shading pattern,继承 pattern 原点,支持嵌套 cell、重叠、描边与 stencil 绘制、透明度和有界取消,覆盖原生 Linux 与 Windows 目标

Version 2.876.1

Fixed

  • 应用缺失实例的表单与模板默认值时,保留完整的 XFA SOM 绑定和真实的已发出实例数据选择,不向其他重复出现借用值

Version 2.876.0

Added

  • 在已签名的 Windows Adobe RevocationInfoArchival 属性中嵌入已认证的 CRL 与 OCSP 证据,强制执行真实 seed 策略,并在发布签名前校验受信状态、响应授权和新鲜度

Version 2.875.0

Added

  • 读取时解析真实 XFA 字段默认值而不凭空制造数据,保留显式空实例值,编辑写入独立实例数据,不改共享模板

Version 2.874.0

Added

  • 编辑原生富文本字段,支持类型化 Unicode 样式 run、真实的嵌入 regular/bold/italic/bold-italic 字体、实测的混合尺寸外观基线与装饰线,widget 间与加密输出都同步 V/RV 值

Version 2.873.0

Added

  • 通过原生脚本创建持久的按实例 XFA UI choice,并消费真实的文本、密码和 choice widget,支持多行与实测长词外观

Version 2.872.0

Added

  • 创建真实的 Windows DocMDP certification 签名,带 P1、P2 或 P3 权限和已认证的 Unicode 法定声明,遵循必需 seed 策略与 FieldMDP 锁定,仅当签名策略允许时才放行后续签名

Version 2.871.1

Fixed

  • XFA 事件体在自身的词法与严格作用域中执行,同时在外层作用域保留字段别名、事件的 this 值、显式 return 和精确的失败回滚

Version 2.871.0

Added

  • 通过真实的原生事件脚本创建缺失的 XFA font、paragraph、fill、color、border、edge 和 corner 属性,以精确回滚持久化稳定的按实例表单绑定,并在生效样式变化后重新生成可选 widget 外观

Version 2.870.0

Added

  • 渲染真实的原生 Windows Cairo 输出,带显式 GDI 标准字体轮廓和正确的 Win32 OpenJPEG 调用约定,使用可复现的钉版原生依赖和独立的输出验收

Version 2.869.0

Added

  • 用真实的同步 C ABI RFC 3161 传输回调签名 Windows 文档,支持 SHA256、SHA384 或 SHA512 imprint、已认证的 TSA 信任与 CRL 检查、必需的时间戳 seed 约束和有界的事务化发布

Version 2.868.0

Added

  • 生成掩码密码与字面 file-select 字段外观,保留 Unicode 值和 AES-256 策略,转义的增补 Unicode 经原生 JSON ABI 传递,保留次正规的 PDF 十进制源 token,并无需屏幕 DC 即可创建 RGB 预取缓冲

Version 2.867.0

Added

  • 跨行内样式对 XFA 富文本换行,使用实测词边界、显式换行、共享行基线与对齐、真实的两端对齐词间隙和片段链接几何,并保留原生重复实例的 XDP 持久化

Version 2.866.1

Added

  • 用 raw-signature RFC 3161 token 实际支持的 SHA256、SHA384 或 SHA512 message imprint 算法做认证,同时保留现有 SHA256 请求默认值和完整的 token 信任与吊销检查

Version 2.866.0

Added

  • 把混合字号的 XFA 富文本 run 对齐到统一的已保存 PDF 基线,保留调用方的 text-position 模式,并应用较大的相邻段边距,空段落过渡也不例外

Version 2.865.0

Added

  • 为显式的 SHA256、SHA384 和 SHA512 message imprint 请求并认证 RFC 3161 时间戳,不再对 imprint 重复哈希,保留严格的摘要长度、新鲜 nonce、有界传输、信任链和吊销校验

Version 2.864.0

Fixed

  • 通过优先处理完整线性光栅和静区候选组保留原有条码扫描时限,在采样内部模块前拒绝无效的 DataMatrix 投影 finder 边框,finder 容差不变

Version 2.863.0

Added

  • 遵循合法的继承 Windows 签名 seed 与证书约束,带真实的 digest 与 CAdES 选择、Unicode 签名信息、规范化的间接字段锁定、已认证的历史锁定权限、允许的第二签名和加密表单策略

Version 2.862.0

Added

  • 渲染真实的原生 function、axial 和 radial PDF shading,几何与函数求值有界,保留继承裁剪和 Domain、Matrix、Extend、BBox 语义,支持校准色与特殊色、透明度、soft mask、blend 和 knockout 组

Version 2.861.0

Added

  • 导出真实的原生带注释合同审阅 PDF 和显式 Unicode 高亮,normal 外观可见,保留源内容与增量签名修订,强制执行已认证的 P3 注释权限和加密用户权利,回调发布前完成有界的输出准备

Version 2.860.0

Added

  • 把原生 Linux 签名与验签选项绑定到真实的 digest 选择、Unicode 签名元数据、命名外观 profile、显式信任字节、时间戳传输身份和已认证吊销证据,发布前完成有界的私钥准备

Version 2.859.0

Added

  • 把实时的按实例 XFA font、paragraph 和标量 body 覆盖应用到真实的富文本绘制与测量,经原生 XDP 持久化保留行内 CSS 优先级和显式空内容,并保留精确事务回滚

Version 2.858.0

Added

  • 在原生渲染与共享文本提取中把转义的 PDF 字体、编码、字形、颜色和资源名称只解码一次,保留字面 hash 资源键,等价名称与真实轮廓和字形度量保持一致

Version 2.857.0

Added

  • 按页面与对象计数、Unicode 文本、规范化结构图和真实渲染的 RGB 或亮度像素比较原生文档,带语义流等价、已认证加密输入和回调发布前的有界准备

Version 2.856.0

Added

  • 按注册的 profile 名称选择真实的原生签名外观预设,生成不同的 approval、certification 和 compact 布局,保留已认证 profile 元数据和加密策略,发布前拒绝未知 profile

Version 2.855.0

Added

  • 应用原生 XFA 属性 schema 默认值,保留显式空值、按实例样式,以及带小数的磅值字体、边框和绘制测量,贯穿真实的 AcroForm 与扁平化 PDF 输出

Version 2.854.0

Added

  • 暴露原生 XFA property 与 attribute 对象,带持久的按实例表单绑定、同步的 value/data 写入和真实的字体、边框、段落与 UI 布局效果,保留事务回滚和无脚本焦点预算

Version 2.853.0

Added

  • 把真实的 Adobe 吊销证据嵌入为已认证的 CMS 签名属性,发布前按显式信任与最新 CRL 或 OCSP 证据校验完整证书与时间戳链,并强制执行必需的签名 seed 吊销嵌入

Version 2.852.0

Added

  • 在 certification 签名中写入已认证的 Unicode 法定声明,遵循仅 certification 的 Legal seed 要求,保留既有法律统计与 catalog 权限,并维持加密字符串策略

Version 2.851.0

Added

  • 在路径、文本、打包图像和 Indexed 调色板中渲染物理 Lab ICC 源颜色与有界 XYZ 兼容输入,经 RGB 或 CMYK 组保留校准色与 ICC 备选色调,并对内嵌 JPX profile 应用 separate 或 associated alpha

Version 2.850.0

Added

  • 把兼容的缺字体文档转换为可搜索文本与矢量 PDF/A-4,带显式有界的 Ghostscript 字体嵌入、真实的 veraPDF 校验和原子发布,并在各发行版间一致地选择原生 Unicode TrueType 字体

Version 2.849.0

Added

  • 渲染嵌入的简单 Type1 与 Type1C 字体,使用精确的声明式或内置 Adobe 字形编码,ToUnicode 提取与显示轮廓分离,并接受经过校验的中性 stroke-adjustment 和相对比色 graphics state

Version 2.848.0

Added

  • 在每个 wildcard 上下文内解析完整的 XFA 后代路径后缀,保留局部出现边界,并在当前事件作用域执行谓词,带精确事务回滚

Version 2.847.0

Added

  • 强制执行继承的原生签名 seed 与证书约束,带真实的 issuer 链、subject 与 key usage 策略、可选 CMS digest、加密 Unicode 签名元数据和文档锁定变换

Version 2.846.0

Added

  • 暴露原生 XFA datasets 与数据节点,带双向表单绑定、动态实例数据镜像、稳定的保留引用、独立的未绑定表单值和事务化脚本重放

Version 2.845.0

Added

  • 从既有或继承的签名字段锁发出已认证的 FieldMDP 引用,保留加密 Unicode 字段名与 certification 引用,并应用锁定权限级别而不削弱原有已签名策略

Version 2.844.0

Added

  • 渲染 Separation 与 DeviceN 备选色调,向量函数有界,支持打包图像与 CMYK 组混合,保留 None knockout 几何,All registration 颜色映射保持一致

Version 2.843.0

Added

  • 解析动态 XFA SOM 路径,支持推断与相对出现、带作用域谓词、class 与后代选择器、wildcard 集合和事务化的 script-object 属性赋值

Version 2.842.0

Added

  • 通过共享可移植核心提供原生双文档 C ABI 与 Pascal 语义合同比较,带源字形几何、加密与嵌套内容输入、预先准备的 JSON 或 HTML 审阅输出和稳定的并发锁顺序

Version 2.841.0

Added

  • 在原生表单更新前认证原始 CMS 与 CAdES 修订,强制执行原始 DocMDP 与 FieldMDP 权限及锁定字段,保留已签名内容与资源,并原子同步 push-button 标题元数据

Version 2.840.0

Added

  • 渲染校准的 CalGray、CalRGB 和 Lab 源颜色、校准的组与页面混合、Indexed 基色、16 位图像采样和 XYZ 亮度 soft mask,转换有界,gamma 求值安全

Version 2.839.0

Added

  • 实现 FormCalc 值复制与稳定节点引用,支持经引用赋值、重绑定与 null 脱离、数值同一性相等、保留句柄和事务回滚

Version 2.838.0

Added

  • 执行运行时生成的 FormCalc Eval 程序,计算作用域隔离,支持嵌套求值、Unicode 源码、有界编译重试和事务化宿主响应重放

Version 2.837.0

Added

  • 通过原生 Linux JSON 表单填充生成嵌入 Unicode 外观,覆盖文本、choice 与多选字段、checkbox 与 radio 状态和 push-button 标题,保留事务化发布与加密

Version 2.836.0

Added

  • 通过兼容的扩展原生签名操作记录提供同步 RFC 3161 时间戳传输,响应有界,共享取消,带显式 TSA 信任与吊销校验

Version 2.835.0

Added

  • 以事务方式执行 XFA 宿主状态、页面与生命周期标志、按实例焦点变更、待定编辑校验和重置操作,带稳定标识与词法状态重放

Version 2.834.0

Added

  • 独立于可选证书信任,对照实际签名者校验 CAdES 签名证书标识,并经原生字体适配器解析嵌入的 Encoding CMap 流

Version 2.833.0

Added

  • 渲染竖排 Identity-V 与 Unicode 预定义 CMap,带真实的 W2/DW2 原点、矩阵、文本位移和裁剪,并正确解码嵌入的 Encoding CMap 流

Version 2.832.0

Added

  • 经原生 Linux 回调 ABI 签名,支持 PEM 或有界 PFX 身份、新的 Unicode 外观字段与 certification,成功发布后把准备好的已签名文档保留为当前上下文

Version 2.831.0

Fixed

  • 对编码后的 PDF 名称一致地应用签名 seed、锁定与只读约束,拒绝语义重复键,并校验继承的策略 dictionary

Version 2.830.0

Added

  • 通过真实表单事件执行高级 XFA 数字、日历、文本和复合 picture 子句,保留输入精度、locale 语义和事务化脚本重放

Version 2.829.0

Added

  • 把原生页面资源图和变换后的注释外观导入普通或加密文档,并把兼容输入转换为可搜索文本与矢量 PDF/A-4,原子发布前先做真实校验

Version 2.828.0

Added

  • 渲染四分量 CMYK 与 ICC 透明度组及页面组,支持全部 blend 模式、嵌套 knockout 几何和共享的 color profile 预算

Version 2.827.0

Added

  • 执行感知 locale 的 XFA 日期、时间、数字和文本 picture,内嵌 locale 集,locale 查询有界且事务化,JavaScript IEEE 算术受保护

Version 2.826.0

Added

  • 读写 Unicode 数组值的 choice 选择,维护排序后的选项索引,并为可见与滚动后的 list box 选择生成匹配外观

Version 2.825.0

Added

  • 通过 Windows JSON 与 C ABI 作业签名加密文档,保留原始修订、AES 安全设置、文档 ID 和签名权限

Version 2.824.0

Added

  • 通过 Pascal 与回调 API 创建原生 Linux HTML 文档,插入可见或适配的可搜索 Unicode 文本,运行有界可取消的 Tesseract OCR,产出经独立校验的栅格 PDF/A-4 输出
  • 渲染图形状态的 Alpha/Luminosity 掩码、有界 transfer 函数、additive 透明与页面组、knockout 形状,以及扩展的 JPEG 2000 采样、内嵌颜色与 alpha
  • 在增量 DSS/VRI 发布前校验调用方提供的证书、OCSP 与 CRL 证据,同时保留既有签名与 AES 加密
  • 执行显式类型化的 XFA 宿主与 FormCalc transport 回调,请求有界、响应留痕,支持事务化重放

Fixed

  • 保留 Free Pascal QuickJS API 返回的 Unicode 值与异常诊断

Version 2.823.0

Added

  • 在 headless CMS 签名中嵌入经校验的 RFC 3161 时间戳,带 message imprint、nonce、TSA 授权、信任与调用方吊销证据检查,必需时间戳失败时保留目标文件
  • 保留 XFA script-object 词法状态、嵌套闭包和独立的重复实例模块,重放确定性、有界且事务化
  • 对实测与生成的 headless Unicode 文本外观应用显式字符与词间距

Fixed

  • 使用符合规范的 FormCalc At source/search 参数顺序,空搜索字符串返回第一个位置

Version 2.822.0

Added

  • 执行通用 QuickJS 与编译后的 FormCalc XFA 事件,支持实时的重复实例 DOM 操作、事务化的标准 form-packet 持久化、自动 initialize/calculate/validate/ready 生命周期,以及有界执行与取消

Fixed

  • 应用符合规范的 XFA 财务函数参数与现金流公式、公历日期原点和负余数行为,在 Delphi 与 Free Pascal 间保持 double 精度

Version 2.821.0

Added

  • 以带版本号的 Linux C ABI 扩展原生 headless 文档工作流:真实的基于回调的文本/表单/渲染/签名操作、有界取消与失败回滚、带 HarfBuzz/FriBidi shaping 的 multiline/comb/rotated/choice/button 外观、PFX 身份、新的可见签名字段和 DocMDP certification
  • 渲染有界的图像掩码、soft mask、Indexed/ICC 颜色、PDF blend 模式、isolated RGB 透明组、Type3 字形和文本裁剪,并经已认证的原生文档路径解码 JPEG、JPEG 2000、CCITT、JBIG2 和 RunLength 图像流

Version 2.820.0

Added

  • 在 Linux 与 Windows 上填充受支持的原生 headless 单行 Unicode AcroForm 字段,使用真正的嵌入 TrueType 外观、精确字形宽度和 CIDToGID/ToUnicode 映射,支持事务化多 widget 更新、保留 AES 安全、受控字体嵌入和有界原子保存

Version 2.819.0

Added

  • 在 Linux 上用原生 Cairo/FreeType CPU 表面把受支持的 PDF 路径、水平文本、图像、Form 和既有注释外观渲染为 PNG,强制有界工作与取消,保留源文件,并原子发布 PNG 文件

Fixed

  • PDF 宽度缺失时,对十二种标准 Helvetica/Times/Courier 样式使用标准 Adobe AFM advance,防止替代字体度量导致文本位置累积漂移,同时保留显式与嵌入字体宽度

Version 2.818.0

Added

  • 在 Linux 与 Windows 上发布真正的原生 headless 增量 CMS/CAdES PDF 签名,使用既有未签名字段和显式 PEM 凭据,保留先前修订与 AES-256 安全,校验精确的已签名字节,并通过有界原子发布保护既有目标文件

Version 2.817.0

Added

  • 完成有界的 JSON 与 C ABI 文档作业:经校验的增量 PFX 签名、既有签名字段、双文档比较、六种原生比较模式和双侧合同 JSON/HTML/带注释 PDF 审阅,包括协作式取消、资源限制和原子文件发布

Version 2.816.0

Added

  • 校验原生 headless PDF 签名,ByteRange/Contents 绑定精确,OpenSSL 3 流式处理,从显式 PEM 凭据生成真正的 detached CMS/CAdES 签名,并在 Linux 与 Windows 上把证书信任与完整性分开报告

Version 2.815.0

Added

  • 用有界的 XFA instance-presentation 辅助器处理条件事件、显式重复绑定、独立的实例存在与访问、稳定的持久化标识、事务化重排、宿主画布绘制和无障碍记录

Version 2.814.0

Added

  • 在 Linux 与 Windows 上打开原生 headless 的 AES-256 R5/R6 文档,认证 owner/user 权限,解码加密压缩对象,并保存加密增量表单值,源前缀精确保留,输出原子且有界

Version 2.813.0

Added

  • 在有界页面矩形内跨基线与选定的共享 Form 调用重排文本,支持更换字体与宽度、查看保守碰撞报告,并使用带事务提交或回滚的封存预览

Fixed

  • 在对象序列化后的重复保存中保留已加载文档的编辑,包括流到文件的保存和输出失败后的重试

Version 2.812.0

Added

  • 把兼容的已加载文档转换为 PDF/A-4,保留原始文本、矢量、图像与嵌入资源,合成可见的注释/widget 外观,保留或新增可搜索 OCR,显式报告损失,并在原子文件发布前校验保留效果

Version 2.811.0

Added

  • 经原生 headless 文档 API 加载交叉引用流、hybrid reference 段和压缩对象流,校验有界成员索引与修订优先级,精确保留宽数值源值,并在 Linux 与 Windows 上保存保留源内容的独立增量输出

Version 2.810.0

Added

  • 用有界的可逆几何校正扫描方向、连续角度倾斜、阴影、边框和显式透视四边形,采用可信的 Tesseract 方向证据,并把 OCR 单词、基线、页面四边形和语义布局映射回原始扫描,输出可编辑的结构化结果

Version 2.809.0

Added

  • 在 JSON 与 C ABI OCR 作业中配置本地 Tesseract 和 RapidOCR CLI 或 DLL 引擎,保留 Unicode 可搜索文本与扫描像素,发现受支持的适配器,校验显式设置,并强制渲染/识别预算,输出原子化,发布失败即回滚

Version 2.808.0

Added

  • 在原生 Linux 控制台应用中加载 classic-xref PDF,按继承资源提取 Unicode 页面与嵌套 Form 文本,检查并填充 AcroForm 文本值,发布保留源内容的增量输出,带类型化诊断、取消、资源预算和原子替换

Version 2.807.0

Added

  • 在单张光栅中定位多个分离的原生条码,保留不同位置上的重复载荷,解码带四角几何的旋转与投影 ECC 200 Data Matrix 符号,并强制聚合扫描预算,支持取消与原子结果发布

Version 2.806.0

Added

  • 对比合同段落与词句级修改,记录插入、删除、替换和移动,双侧页面定位,保留重复条款,显式排除样板文本,提供有界 HTML 审阅,并输出经源文档校验的带注释 PDF

Version 2.805.0

Added

  • HTML 业务模板导入支持嵌套的 flex/grid 面板、自动换行的行、grid 跨列,以及并排盒子中的图片与表单控件;显式提供的 font-face 资源经延迟嵌入后仍会保留,并配备独立的已解码图片缓存预算

Version 2.804.0

Added

  • 共享的 PDF 对象、Direct File I/O、内容与字体解码、压缩、加密和写入器核心现在能编译为原生 Linux 代码,使用 POSIX 映射与同步,保留 Windows API,并正确序列化经典 xref 条目

Version 2.803.0

Added

  • 注册带版本号的发票 profile 与国家规则层,用范围感知的报告校验显式提供的 CII XML 或混合式发票,并通过显式配置的 Saxon 引擎执行官方 XRechnung 3.0.2 与法国 CTC 发票规则,提供已发布 profile 的选择和失败即拦截的诊断

Version 2.802.0

Added

  • 通过原生 API、JSON 作业和 C ABI 把类型化表格导出为不依赖 Office 的 XLSX 工作簿,保留值类型、货币与百分比格式、合并单元格、精确大整数和可选的源元数据,配合有界暂存与失败安全的发布

Version 2.801.0

Added

  • JSON 作业和 C ABI 可把选中的已加载页面导出为语义化 HTML、XHTML、XML 或 JSON,把类型化表格导出为 CSV 或 JSON,支持原生选项、有界暂存、取消、签名字段兼容、源状态保留和原子文件发布

Version 2.800.2

Fixed

  • 在对象图回滚前先失效已加载的表单关系缓存,签名作业和失败的文档编辑过后,原文档仍可安全查询与复用

Version 2.800.1

Fixed

  • 有序并行渲染现在按输入顺序受理内存预留,投递等待较早页面时后续页面再也无法耗尽预算,Delphi 与 FPC 上的取消与有界输出保持不变

Version 2.800.0

Changed

  • SVG 文本、已加载的 FreeText 外观和已加载的文本替换现在会保留文档的 shaping 特性、脚本自动 shaping 标志以及 GSUB 脚本与语言选择,使用所选字体各自的 OpenType 数据,并在字体切换时保持 Unicode 映射

Version 2.799.0

Changed

  • SVG 矢量导入现在会为实线与渐变描边保留继承的 dash 数组、dash 偏移和 miter 限值;原生渲染保留带相位和零长度的 dash 图案

Version 2.798.0

Changed

  • 带样式的 Unicode 文本在 fallback 布局中现在能保持粗体和斜体字体;样式感知的 ResolveFontForCodePoint 与 AnalyzeUnresolvedGlyphs 重载使预检与输出一致;FPC XML 字符引用保留 Unicode 标量值,不再破坏文本

Version 2.797.0

Fixed

  • SVG 导入现在通过隔离的矢量透明 Form 合成对象与组的不透明度,保留填充与描边各自的 alpha,并在显式预算内保持嵌套资源、裁剪、掩码和链接行为

Version 2.796.0

Added

  • 通过 JSON 作业和 C ABI 暴露有界的 PDF/A-4 栅格归档转换,需要显式接受信息损失,提供结构化的预算失败报告、协作式取消、源状态恢复和原子文件输出

Version 2.795.0

Added

  • 已加载的 PDF 现在可规范化为经过校验的 PDF/A-4 栅格文档,采用严格的原生渲染、经过验证的 sRGB 颜色、有界的解码与栅格资源,支持取消、源别名保护和原子文件发布;转换报告会列明被有意移除的交互内容与附件内容

Version 2.794.0

Changed

  • HTML5 导入现在使用实测的混排方向文本行、孤行寡行分页控制、可选的连字符断行、有界的 flex 与 grid 布局,以及可观察的 CSS 诊断;FPC 原生位图让直接 GDI 绘制与 LCL 图像缓存保持同步

Version 2.793.0

Changed

  • 新增有界的动态 XFA instance-manager 节点增删与模板出现事件,配合布局重绑定、编辑状态保留、原子回滚、资源限制和可持久化的 XDP 输出

Version 2.792.0

Changed

  • SVG 导入扩展支持实测的嵌入式 Unicode 字体、PNG/JPEG 资源、渐变描边,以及真正的 Alpha 与 Luminosity 软掩码;同时修正原生组 alpha 与 FPC 位图表面的合成

Version 2.791.0

Changed

  • 新增可预览的已加载 Unicode 文本替换:使用嵌入字体,支持换行与宽度策略、逐匹配诊断、计划过期检测、有界资源、原子提交,并提供 JSON/C ABI 的预览与应用操作

Version 2.790.0

Changed

  • 在字形渲染中实现标准 CFF Type 2 栈操作与 transient array 操作,字体子集化时保留由算术运算推导出的局部与全局子程序依赖

Version 2.789.0

Changed

  • 内置条码解码扩展出 Code 128、EAN/UPC、可从透视畸变中恢复的 QR、Data Matrix ECC 200,以及带 Reed-Solomon 纠错与有界载荷解码的 PDF417

Version 2.788.0

Changed

  • Windows FPC 现在通过经 ABI 校验的编解码器桥支持原生 TIFF、JPEG/JPX、ICC 转换、JBIG2 和 Zopfli,页面、有序页面、tile、band 和 JPEG 2000 tile 渲染改用真实的工作线程,具备预算、有序回调、取消和确定性像素

Version 2.787.0

Changed

  • C ABI 与 JSON 作业处理器现在共享带 schema 版本的文档操作,覆盖能力查询、渲染、Unicode 文本与表单、OCR 图层、涂黑和 PFX 签名,配显式资源预算、回调失败回滚和原子文件输出;多页回调输入也能正确加载

Version 2.786.0

Changed

  • 已加载 FreeText 的编辑现在以原子方式重建嵌入的 Unicode 与富文本外观,支持换行、对齐、不透明度、旋转、callout 与内边距,以及显式的溢出策略;重写的流载荷在修改前先留存副本,事务回滚可恢复原始文本

Version 2.785.0

Added

  • SearchableOCR 控制台 demo 在 RapidOCR 之外新增内置 OCR 和 Tesseract DLL/CLI 引擎,可生成三页扫描样张,并提供页面选择、置信度过滤、识别预算和详细的转换统计

Version 2.784.0

Changed

  • FDF 和 XFDF 批量导入失败后会回滚此前已应用的字段与注释更新,保留调用方自己的事务,并清除失败交换的结果元数据

Version 2.782.0

Added

  • 本地 Tesseract OCR 适配器通过 THPDFTesseractOptions 接受可配置的页面分割、识别引擎模式、像素上限和超时,支持单行、单词、稀疏文本和纵向块识别

Fixed

  • 原生 Tesseract 适配器对以纵向为主的基线改用交叉方向的文本框尺寸,纵向词长不再虚增可搜索 PDF 的文本尺寸

Version 2.781.0

Changed

  • Delphi 与 C++Builder demo 合集新增多页条码字段指南(含业务标签)和一份完整的导航手册,带层级书签、命名目标和可用的伴生文档链接;最简 PDF/A 配方移入 Miscellaneous,冗余的独立大纲与元数据工程随之退役

Version 2.780.1

Fixed

  • Showcase 注释页把内容预览的图注与实际生效的 free-text、图章外观分开,PDF 阅读器里不再出现标签重叠,注释外观隐藏时示例也仍可辨认

Version 2.780.0

Changed

  • demo 目录现在优先展示完整工作流,把 17 个极简、单一功能或陈旧的示例分到 Miscellaneous 子目录;冗余的 ImageCompression 和 AddDelPages 工程已移除,其功能保留在主 demo 与回归套件中

Version 2.779.0

Added

  • Delphi 与 C++Builder 的 Showcase demo 现在打开一个完整的十章文档工作室,带内嵌预览、搜索高亮、个性化封面、一键审阅水印、经校验的页面导出,以及保留编辑内容的 AES-256 R6 加密副本;两者使用同一文档引擎,并支持无窗口的生成命令

Version 2.778.1

Removed

  • 冗余的 Delphi 与 C++Builder TestNumeric GUI demo 已退役,改由自动化数值回归测试接替:验证保存并重新加载未压缩与 Flate 压缩 PDF 后的小数页面尺寸和绘图操作数,并以持久化的数值数组保证覆盖

Version 2.778.0

Changed

  • 页面与客户报表 demo 现在提供实用的工作流:PageOperations 通过 extract、delete、move、insert、append 命令编辑真实 PDF 并做重载校验;DBTable 用表格引擎实现折行的表格行、重复表头和自动分页,默认样例无需数据库

Version 2.777.1

Fixed

  • OCR 在发布文本前会拒绝格式错误的 UTF-8、不支持的控件字符和不兼容的原生检测模型输出,执行跨页词数上限时也把被丢弃的识别结果计入

Version 2.777.0

Fixed

  • 内置 OCR 把空白页或识别不出的页面按成功的空结果处理,扫描文档批次得以继续;同时保留 Windows FPC 位图像素,并在图像分析全程检查取消请求与时间上限
  • 原生 RapidOCR 的角度分类保留短行的宽高比,只有对"上下颠倒"的判断足够确信才旋转文本裁剪块
  • 本地 Python RapidOCR 适配器保留识别出的行距和标点,不再逐字符发布而混进多余空格;Tesseract DLL 适配器则在发布文本前先剔除 C1 控制字符

Version 2.776.0

Added

  • 扫描版 PDF 文本层在保存并重新加载后可原子替换标记出的 HotPDF OCR 流;识别失败或结果为空时保留现有层,报告被替换的页;另新增原生多语言 RapidOCR 控制台示例做转换,不覆盖既有文件

Fixed

  • 同一行内相邻的拉丁与西里尔 OCR 词之间插入显式 Unicode 空格,短语搜索和复制结果因此稳定;相邻的 CJK 词仍不加间隔
  • Windows FPC 的 JPEG 扫描渲染在转成 OCR 位图格式时保留已解码像素,避免 LCL 像素格式变化导致识别输入变成空白

Version 2.775.0

Added

  • 原生 RapidOCR 新增本地模型预设,覆盖简体中文、繁体中文、英语、法语、德语、西班牙语、葡萄牙语、意大利语、荷兰语、土耳其语、日语、韩语、俄语、阿拉伯语和印地语,配套字符字典、安装校验、水平阅读顺序和多语言 Unicode 输出,Delphi、C++Builder 与 Windows FPC/Lazarus 构建均可用

Fixed

  • 本地进程 OCR 适配器在工作进程结束后诊断文件仍被短暂锁定时,会重试清理临时输出

Version 2.774.0

Added

  • 原生 RapidOCR DLL 适配器把本地 ONNX 模型留在进程内,无需 Python 即可识别位图快照,支持可选角度分类和 Unicode 可搜索 PDF,并在 Delphi、C++Builder 与 Windows FPC/Lazarus 构建中提供输出预算校验与协作式取消

Version 2.773.0

Added

  • 本地 RapidOCR 适配器新增显式 ONNX 模型配置、可选角度分类、本地字符字典与字体、CPU 线程控制、离线预检,以及面向 Unicode 可搜索 PDF 的识别预算,Delphi、C++Builder 与 FPC/Lazarus 构建均可用

Version 2.772.1

Fixed

  • Tesseract DLL 与 CLI 适配器现在能在 Windows FPC/Lazarus 的 Win32 和 Win64 构建中工作,保留 Unicode OCR 词,并读取当前 LCL 图像像素来生成可搜索 PDF 文本层

Version 2.772.0

Added

  • 可选的原生 Tesseract DLL 适配器带来多语言 OCR:页面分割模式与引擎模式可配置,输出 Unicode 词、置信度、词边界和基线,并带协作式取消、识别时限和输出预算,用于生成可搜索的扫描版 PDF

Version 2.771.1

Changed

  • 内置 OCR 能识别浅色或以深色为主背景上的常规、粗体、斜体和粗斜体 ASCII 文本,灰度对比度足够的褪色字迹也能接受;含不确定保留字形的词整词略去,而不是悄悄丢字符

Version 2.770.175

Fixed

  • LoadedDocInspector 和 SignatureValidator 遇到读不出的 PDF 返回失败退出码,并拒绝无效命令行参数,而不是报告一次"成功"的空检查

Version 2.770.174

Fixed

  • LoadedImageExport 在导出任何页之前先校验全部图像输出路径,防止路径别名覆盖输入 PDF 或另一个选定页,并拒绝不支持的格式名

Version 2.770.173

Fixed

  • 渲染页磁盘缓存的恢复、查找、写入、失效和淘汰环节都会跳过链接形式的文档目录,不会碰缓存之外的文件

Version 2.770.172

Fixed

  • JSON 作业在执行任何操作前就拒绝畸形语法、尾部多余内容、超出有限 Double 范围的数字和过深嵌套,失败时释放已部分解析的值

Version 2.770.171

Fixed

  • PreflightCLI 在写入前检查完整的报告输出计划,防止输入 PDF 被文件别名覆盖,并拒绝相互冲突的报告目标;递归扫描跳过链接形式的子目录以免成环

Version 2.770.170

Fixed

  • CopyPage 导出前先核对文件身份、拒绝冲突的输出别名;目录名里带点而输入没有扩展名时,自动命名的输出仍生成在输入旁边

Version 2.770.169

Fixed

  • JSON 作业的值保留转义的 null 字符;超出有符号 64 位范围的有限数字序列化时不发生整数溢出;越界整型参数返回默认值,且不改进程 locale

Version 2.770.168

Fixed

  • 简单对象解析器的恢复逻辑遇到未加括号数组体里的多余闭括号会正确结束,畸形分隔符之后紧跟的合法数字和字典键也保留下来

Version 2.770.167

Fixed

  • HotPDFCLI 拒绝与输入文件互为别名的输出路径,并在开始批量导出前检查所有将生成的路径,命令不再截断或替换自己的源数据

Version 2.770.166

Fixed

  • ExtractText 示例在输出经由目录联接或硬链接指向输入 PDF 时会保护输入文件;LoadedImageExport 对读不出的文档或未完成的页面导出报告失败

Version 2.770.165

Fixed

  • 直接文件读取在 I/O 失败后使未完成的缓存回填失效,并在接近有符号 64 位偏移上限处对预读范围做安全收界

Version 2.770.164

Fixed

  • RunLength 解码只按解码后载荷大小分配内存,并在分配输出前先校验畸形 run,带提前终止符的流不再被预留过量内存

Version 2.770.163

Fixed

  • Delphi 与 C++Builder 示例无论在项目目录还是嵌套的构建输出目录里,都能找到随附的图像、图元文件、色彩配置文件和可选签名测试素材

Version 2.770.162

Fixed

  • HugeFileBenchmark 示例在启动基准批次前拒绝与任何输入文档重合的生成 PDF 路径
  • C++Builder 示例为生成的 PDF 保留相对输入子目录,同名递归输入不再共用一个输出文件
  • 操作失败、超内存限制和零页无效加载现在都以非零退出码收场,基准报告仍然保留

Version 2.770.161

Fixed

  • Delphi 与 C++Builder 的 Preflight CLI 拒绝与输入 PDF 重合的报告和汇总输出路径,报告不再覆盖源文档

Version 2.770.160

Fixed

  • ASN.1 解析拒绝超出所支持 32 位标签范围的高标签号编码,而不是接受回绕后的标签号

Version 2.770.159

Fixed

  • C++Builder 的 Preflight CLI 在递归报告和仪表盘链接中保留相对子目录,同名 PDF 不再互相覆盖
  • Delphi 与 C++Builder 的 Preflight 仪表盘对特殊字符和非 ASCII 目录名正确编码报告链接
  • C++Builder 标准校验失败现在返回退出码 3,并在仪表盘中对所有报告格式都显示为无效,包括加载失败的输入

Version 2.770.158

Fixed

  • C++Builder 的 PDF 合并示例从可执行文件目录解析相对输入路径,并且不让文件对话框改变工作目录
  • 每个生成的书签现在都指向从其自身输入文档复制出的第一页

Version 2.770.157

Fixed

  • 对象解析器把 PDF 字面字符串里未转义的 CR 和 CRLF 行尾规范成 LF,转义的回车符与行续接保持原样

Version 2.770.156

Fixed

  • LZW 流压缩对空输入报告实际写入的字节数
  • InitialCodeSize 设为 2 时 LZW 压缩与解压可正确往返;压缩在写输出前拒绝缩减字母表之外的字面值

Version 2.770.155

Fixed

  • Win64 构建导入 SVG 或 XPS 路径数据时,指数接近 100 的数字(如 1e-100 或 5e99)在应用解除浮点异常屏蔽时不再触发浮点溢出
  • 这类数字现在按实际值读入,长尾数配大负指数也能正确导入

Version 2.770.154

Fixed

  • 未设置解码区域时,DecodeLoadedPageBarcodes 在 CropBox 与 MediaBox 不同的页面上现在报告正确的条码边界;过去位置被裁剪框偏移带偏,或按错误的页高缩放
  • 在这类页面上,启用人脸检测后 DetectLoadedRedactionFindings 的人脸结果正好落在检测到的人脸上,不再有偏移
  • 两个功能都以可见页面区域(CropBox 裁剪到 MediaBox)渲染,并把检测到的位置经同一区域映射回去;传给自定义 IHPDFFaceDetector 的页面框现在与其收到的位图一致
  • 带显式区域的条码解码,以及没有 CropBox 或 CropBox 等于 MediaBox 的页面,行为不变

Version 2.770.153

Fixed

  • 在 CropBox 与 MediaBox 不同的页面上,ApplyLoadedOCRTextLayer 现在能正确放置不可见文本层;过去可搜索文本被裁剪框偏移带偏或按错误的页高缩放,选区和搜索命中与可见文字对不上
  • OCR 栅格从可见页面区域(CropBox 裁剪到 MediaBox)渲染,识别出的词位置经同一区域映射回去
  • THPDFOCRRequest 传给自定义 IHPDFOCREngine 的页面框现在是渲染出的可见区域,与其收到的位图一致
  • 没有 CropBox 或 CropBox 等于 MediaBox 的页面行为不变

Version 2.770.152

Fixed

  • GetLoadedInvoiceSummary 现在把买方名称(BT-44)作为解码后的文本返回,"Müller & Söhne" 这样含非 ASCII 字母的名字不再以仍带 XML 转义的原始 UTF-8 字节形式出现
  • 买方名称现在总是从买方贸易方自身读取,与卖方名称及其他汇总字段的做法一致
  • ValidateVisualXmlConsistency 也跟着受益:带重音字母或转义字符的买方名称现在按书写原样与可见页面文本比较

Version 2.770.151

Fixed

  • THPDFTable 现在把被 RowSpan 绑在一起的行留在同一页:组放不进剩余空间时,整组连同重复表头一起挪到下一页
  • 被覆盖的行延续到下一页时,跨多行的单元格不再越过下边距
  • 比整页还高的行跨组仍逐行拆分,跨行单元格在每页下边距处截断
  • TotalHeightRendered 会反映最后一页上被挪动的组

Version 2.770.150

Fixed

  • ColSpan 或 RowSpan 为零或负数的 THPDFTable 单元格现在按表格网格已安排的位置画成单格,不再把后面的单元格挤进错误的列
  • 负跨度不再让表格读越出网格;越出最后一列或最后一行的跨度在测量和绘制时同样在表格边缘截断
  • 首个单词比列宽还宽的单元格不再以空行开头,所在行的高度不超过换行文本所需

Version 2.770.149

Security

  • 在 DOCTYPE 里声明内部实体的 XFA 表单无法再靠反复引用一个大实体把内存撑爆:内部实体替换出的文本上限为每文档 16 MB
  • 单个内部实体值超过 1 MB 即被拒绝
  • 超出任一上限的文档加载时抛 EHPDFXFAError 失败,而不是膨胀成数 GB 的文本;普通实体用法不受影响
  • 含大量实体或字符引用的文本同样以线性时间解码

Version 2.770.148

Fixed

  • RecalculateLoadedFormFieldsIncremental 现在对传入的每个变更字段一视同仁,无论名称按什么顺序列出
  • 与某个源字段一起被直接写入的计算字段保留写入值,而不是只在列在该源之后时才被重算
  • 依赖这些变更字段的字段仍按计算顺序重算一次

Version 2.770.147

Fixed

  • 起始符为 A 的 GS1-128 条码(THPDFBarcode 类型 20)现在像 Code 128 A 一样把数据编进码集 A
  • 这类条码里的小写字母现在以 SHIFT 切到码集 B 的方式写入,而不再用会被扫描器读成码集 A 控制字符的码集 B 码字
  • 因此含小写文本的 GS1-128 A 符号扫描后能返回原文

Version 2.770.146

Fixed

  • 启用 Checksum 时,EAN-2 和 EAN-5 附加条码(THPDFBarcode 类型 18 和 19)不再往 Text 追加计算出的数字
  • 反复绘制这类条码每次都得到相同符号,而不再每重绘一次文本就多一位、条纹图案也跟着变
  • 按定义附加符号本就不带校验字符,因此 Checksum 对它们被忽略;奇偶图案仍和以前一样从数值推导

Version 2.770.145

Fixed

  • XFDF 导出现在把表单字段值和注释文本按 PDF 文本字符串解码(ISO 32000-1 7.9.2.2):UTF-16BE 值、十六进制字符串和项目符号这类 PDFDocEncoding 字符都写成实际 Unicode 文本,而不是十六进制数字或代码页乱码
  • 导出到 XFDF 的注释内容、作者、主题、状态和覆盖文本保留非拉丁字符,例如中文或西里尔文批注
  • 以 XML 声明开头的富文本(/RC、/RV)现在嵌入时去掉该声明,导出的 XFDF 保持格式良好的 XML
  • XFDF 导入不再经系统 ANSI 代码页转文本:表单字段和注释文本里 PDFDocEncoding 能表示的值原样存储,其余存为 UTF-16BE 文本字符串
  • 导出的 XFDF 文件经 ImportLoadedFormFromXFDF 和 ImportLoadedAnnotationsFromXFDF 往返时,ANSI 代码页之外的字符不再变成问号

Version 2.770.144

Fixed

  • 发票汇总里的名称和其他文本现在从 UTF-8 发票 XML 解码,"Müller GmbH" 这样的卖方不再返回乱码多字节字符
  • 转义的标记字符和字符引用会被解析,XML 里的 "A & B" 报告为 "A & B"
  • 卖方名称含重音字母或 & 符号且确实印在页面上时,ValidateVisualXmlConsistency 不再误报其在可见页面文本中缺失
  • 汇总文本以系统 ANSI 代码页返回,因为汇总记录的字段是 ANSI 字符串;该代码页表示不了的字符变成问号

Version 2.770.143

Fixed

  • GetLoadedInvoiceSummary 现在从头部货币汇总报告发票级净额合计(BT-106),而不是取第一个行项目的金额
  • 税额合计、总计和应付金额同样取自头部汇总,ZUGFeRD 1.0 发票也包括在内
  • 开票日期(BT-2)现在返回纯日期值,例如 20260305,不再带嵌套的 DateTimeString 标记
  • HPDFFacturXXMLElementText 现在返回整个元素去掉子标签后的字符数据,不再匹配名称只是以所请求名称开头的元素

Version 2.770.142

Fixed

  • XFDF 导出现在把基本多文种平面之外的字符(如 emoji 或生僻 CJK 汉字)写成合法的四字节 UTF-8,而不是把代理对两半分别编码,严格的 XML 解析器也能接受文件
  • XFDF 导入现在能把 U+FFFF 以上的字符引用(如 😀)解码成完整字符,不再截断成无关的 BMP 字符
  • 未指向 Unicode 标量值的字符引用,以及导出时的未配对代理,现在都变成 U+FFFD,不再损坏文本
  • 早期版本写出的 XFDF 文件仍能正确导入

Version 2.770.141

Fixed

  • 含反斜杠的字段值和注释文本(如 C:\Data\2024\001 这样的 Windows 路径)现在经 XFDF 导出再导入后原样保留,数字序列不再被变成控制字符
  • 反斜杠若会被当成转义读回,XFDF 导出现在把它写成八进制转义 \134,与 PDF 字面字符串的做法一致(ISO 19444-1 5.8.2)
  • XFDF 导入只解码该格式用于控制字符和反斜杠的八进制转义;第三方文件里的其他反斜杠序列按字面保留
  • 经同一轻量 XML 解析器读取的 SVG 文本也不再丢失反斜杠序列

Version 2.770.140

Fixed

  • RenderCacheFolder 启用的持久渲染页缓存现在对用 LoadFromFile、LoadFromStream 和 LoadFromRandomAccessSource 打开的文档都生效;过去普通加载会跳过磁盘层,文件夹里从未写入或读取过任何页
  • 从文件加载的文档按大小、最后写入时间和首尾字节识别,重新打开未变动的文件直接从缓存读页,不必对整个文件做哈希
  • 从流或随机访问源加载的文档按内容的 SHA-256 识别;这类文档要使用磁盘层,需在加载前设置 RenderCacheFolder
  • 加载后被编辑过的文档,在本次加载的余下过程中不再读写磁盘条目,被编辑的页既不会取自原文件的缓存页,也不会存成原文件的缓存页
  • 磁盘条目现在还依赖页面渲染后端和 ICC 打样工作流,后端或输出配置不同就不会复用其他设置渲染的页;加密文档绝不写入磁盘缓存

Version 2.770.139

Fixed

  • 导入大 XFDF 文件不再随文件大小的平方变慢:含数千字段或注释的文件现在毫秒级解析完,而不是几秒几分钟
  • 含大量换行或其他字符引用的字段值以线性时间解码
  • 解析 XFDF 的峰值内存不再按元素数乘文件大小增长
  • 经同一轻量 XML 解析器读取的 SVG 输入同样受益于这次提速

Version 2.770.138

Fixed

  • DecodeLoadedPageBarcodes 以 90 或 270 度重试页面时,交给解码器的栅格现在按 AttemptRotationDegrees 文档所述顺时针旋转
  • 只在这些重试中找到的符号现在按页面上的真实位置报告,而不是点镜像后的位置
  • 这类符号报告的方向现在与页面上的阅读方向一致,不再差 180 度
  • 依赖文档所述顺时针旋转的自定义条码解码器现在能收到正确旋转的栅格

Version 2.770.137

Fixed

  • 跨文档复制页面(CopyPageFromDocument、CopyPageByPhysicalIndex 以及页面导入和合并方法)不再把含 "<<" 和 ">>" 或 "[" 和 "]" 的文本字符串变成字典或数组;过去 "Read <<this>> [now]" 这样的注释会被复制成残缺字典
  • 十六进制字符串(如注释名称和标识符)按十六进制形式复制,不再被写成由十六进制数字组成的字面字符串

Version 2.770.136

Fixed

  • 在新页面上创建的注释(AddStampAnnotation、AddTextAnnotation 及其他 THPDFPage 注释方法)现在写入的 /Rect 左下角在前,形如 [llx lly urx ury];其中几个过去先写上边再写下边,例如 [395 712 575 652],查看器能接受,PDF/A 校验器和一些处理工具却会拒绝或误读

Version 2.770.135

Changed

  • THotPDF.RenderCacheFolder 现在是字符串类型(Delphi 2009 及以后和 C++Builder 中均为 UnicodeString),不再是 AnsiString;路径含系统代码页之外字符的缓存文件夹(例如英文 Windows 上的中文用户名)按原样使用,不再变成问号
  • 给该属性赋 AnsiString 的代码照常编译,赋值时会转换成 Unicode

Version 2.770.134

Fixed

  • SetOptionalContentGroupUsage 的 Zoom 类别现在按 PDF 规范把缩放范围写成 /min 和 /max 数值;过去整个值被当作文本字符串写到 /Min 下,查看器会忽略它,图层的缩放范围因而不起作用
  • Zoom 值是最小倍率,后面可选跟最大倍率,以空格分隔(例如 '0.5 4');不以数字开头的值现在抛异常

Version 2.770.133

Fixed

  • 子集化嵌入的 CFF/OpenType 字体不再丢弃字形仍在使用的子程序;带超过八个 hint、hstemhm hint 或 counter mask 的字形过去会被扫错,在用的子程序可能被换成空子程序,字形渲染出缺失或破损的轮廓

Version 2.770.132

Fixed

  • RegisterNChannelColorSpace(带专色定义的重载)现在能把含空格或分隔符的专色名称(如 "PANTONE 185 C")正确写成 /Colorants、/Solidities 和 /DotGain 字典的键;过去裸名称会破坏文件语法
  • AddPDFX6ExternalOutputIntentSpotData 的 solidities 和光谱数据专色键也按同样方式写入

Version 2.770.131

Fixed

  • EnableXMPMetadata 写出的 XMP 元数据在 Title、Author、Subject 和 Keywords 含系统代码页文本(例如以 AnsiString 赋值的带重音或中文字符)时,现在以合法 UTF-8 携带;过去的原始代码页字节让数据包成为非法 XML,PDF/A 校验器和 XMP 解析器都会拒绝
  • XML 1.0 不允许的控制字符不会进入这些 XMP 值

Version 2.770.130

Fixed

  • 用 JBIG2Options.AccumulateGlobalsAcrossPages 写出的 JBIG2 图像,在后续页面添加了前面页面没用过的符号时又能正确解码;这类页面过去一直引用第一页的 globals 流,而那里面没有新符号,查看器便把它们显示成乱码或干脆不显示
  • 现在只要某页添加了符号,就会写出一个包含截至该页完整字典的 globals 流并从那时起使用;不添加符号的页继续共享最新那个

Version 2.770.129

Fixed

  • 保存对象生成号非 0 的已加载文档时,现在写出一致的对象编号:完整重写(SaveLoadedDocument 及相关方法)把每个对象、引用和交叉引用条目都按生成号 0 写出,而过去对象头和 trailer 保留旧生成号、引用和交叉引用表却用 0
  • 增量更新(SaveIncrementalUpdate 及相关方法)现在以对象真实的生成号引用既有对象;过去引用一律写生成号 0,原文件用其他生成号时就指向了不存在的对象

Version 2.770.128

Fixed

  • THPDFPage.TextOutHTML 设了 MaxWidth 后不再在换行处丢失格式:多个不同样式的 run 一起挪到下一行时,过去会被合并成一个 run、按换行时刻生效的样式绘制,颜色、粗斜体、字体、字号、上下标偏移和链接全部丢失。现在每个 run 在新行上都保留自己的格式

Version 2.770.127

Fixed

  • InvalidateRenderedPageCache 现在也会清掉并行渲染共享的 Type 3 字形和半色调条目;过去整文档失效后,下一次并行渲染可能复用为旧内容缓存的字形
  • PreflightLoadedPAdES 检查签名 PAdES 级别时不再顺手清空共享渲染缓存,预检之后的渲染仍能用上缓存的字形

Version 2.770.126

Fixed

  • 已签名文档的修订与修改分析现在能正确报告含括号或以括号结尾的字段名,例如 "Total (net)";过去最后一个字符被切掉
  • 以八进制转义或反斜杠行续接写入的字段名也能正确解码

Version 2.770.125

Fixed

  • SplitPDFToFiles 写出每个输出文件时不再用默认 PDF 查看器打开它;其内部创建的文档现在关闭了 AutoLaunch

Version 2.770.124

Fixed

  • GetLoadedTrailerID 现在从 trailer 的 /ID 数组以十六进制文本返回文档的永久文件标识符;过去它在文档 catalog 里找 /ID——那地方从来不会有——于是几乎所有文件都报不出标识符

Version 2.770.123

Fixed

  • SetLoadedOpenActionPage 现在写出指向所请求页面的目的地;过去页面引用写成 0 0 R,查看器无法在该页打开文档
  • 目的地保留当前视图位置(left 和 top 为 null),而不是强制 0 0——那会跳到页面左下角

Version 2.770.122

Fixed

  • SetLoadedViewerPreferences 现在把 HideToolbar、HideMenubar、FitWindow 和 DisplayDocTitle 写成布尔值;过去写成名称 /true 和 /false,查看器不当作布尔处理,这些偏好设置因而不起作用

Version 2.770.121

Fixed

  • 当签名字段的 /Ff 标志把 /Reasons 种子值标为必填(第 4 位,值 8)时,CheckLoadedSignatureSeedValue 现在会强制执行;过去不在列表里的理由也能通过
  • 理由按 PDF 文本字符串的方式精确比较;"approved" 不再满足列出 "Approved" 的种子值

Version 2.770.120

Fixed

  • 用 StampLoadedPageText 或 StampLoadedPageShape 对已加载页面多次盖章时,每个章现在有自己的不透明度,每个文字章有自己的标准字体;过去第二个及之后的章复用页面上第一个章的透明度和字体
  • 与前面的章不透明度和字体都相同的章仍会共享资源,重复盖同样的章不会撑大页面资源

Version 2.770.119

Fixed

  • ExtractLoadedPageStructureText 现在会跟随 /K 条目为普通标记内容编号的结构元素(例如 /K 3 或 /K [0 1])——这是带标签 PDF 里最常见的形式;这类元素过去被忽略,方法对很多带标签文档报不出结构顺序,或按绘制顺序返回文本
  • 文档没有可用根对象时,方法不再读取无效的 catalog 条目

Version 2.770.118

Fixed

  • StampLoadedPageText、StampLoadedPageImage、StampLoadedPageShape、StitchLoadedPage 和 FlattenLoadedAnnotations 不再破坏从父 /Pages 节点继承资源的页面;过去它们给这类页面挂上一个空的 /Resources 字典,继承来的字体和图像被遮住,页面原有的文字和图片就显示不出来
  • 现在页面会在新字体、图像或 form 加入之前先拿到继承资源自己的副本

Version 2.770.117

Fixed

  • ComposeLoadedPagesNUp、ImposeLoadedPagesNUp、ImposeLoadedPagesBooklet 和各页面拼接方法现在会带上源页面从父 /Pages 节点继承的资源;过去这类页面放置时缺字体缺图像,拼出的版面上文字和图片缺失或出错

Version 2.770.116

Fixed

  • SaveIncrementalUpdateAuthenticated 现在能写回启动增量更新时所用的文件;过去已接受的更新无法替换目标,因为文档仍占着源文件,调用总是以拒绝访问的提交错误失败
  • 与原地 SaveIncrementalUpdate 一样,替换前先释放源,替换失败则重新打开;下一次增量保存前必须重新调用 BeginIncrementalUpdate

Version 2.770.115

Fixed

  • 结构树里元素被多个父节点列出(或成环)时,RepairPDFUA2Structure 不再耗指数时间;语言继承修复、标题顺序修复和替代文本修复背后的标记内容扫描现在对每个结构元素只走一遍。过去一个 24 个元素、每个都把下一个列两次的构造树要花约 40 秒

Version 2.770.114

Fixed

  • 不可拆分的行在重复表头之下放不下时,HPDFPaginateTable 不再无休止加页直到内存耗尽;现在在只有重复表头的页上会拆分该行(表头占满整页时则放置该行并允许溢出)
  • 分隔符在页上不留空间、或脚注的最小片段高度在空页上无法满足时,HPDFLayoutFootnotes 和 HPDFLayoutEndnotes 不再死循环;脚注会直接放在该页上

Version 2.770.113

Fixed

  • 可拆分项里有行高于栏高时,HPDFBalanceColumns 不再卡死——过去它会永远跳到下一栏;这样的行现在单独放在空栏顶部并允许溢出,排版继续

Version 2.770.112

Fixed

  • 用标准安全处理器 revision 4(RC4 或 AES-128 crypt filter)加密的文档,加密字典省略可选的顶层 /Length 条目时又能打开了;过去加载失败并报 "Unsupported legacy Standard security handler V=4 R=4 Length=40"
  • 这类文档接受任意顶层 /Length 值,文件密钥固定是 128 位

Version 2.770.111

Fixed

  • ProcessObjectStreamsForDecompression 和 ExtractRawObjectFromStream 不再信任对象流声明的 /N 计数:超过一千万的计数被拒绝,计数还被限制在流头部实际容纳得下的对象号对数之内,构造出来的文件再也无法让它们分配或遍历数百万个空条目

Version 2.770.110

Fixed

  • Direct File API(DADirectEncryptFileAES256、DADirectDecryptFileAES256 及相关方法)现在读取经典交叉引用节的 /Root、/Info、/Encrypt、/Prev 和 /XRefStm 时只看该节自己的 trailer 字典;在增量更新的文件上,过去它可能从后续修订的对象(比如大纲条目)或 trailer 里捡到一个 /Prev,导致失败或读错修订
  • /Prev 链绕回已读过的节时现在会停下,不再重复读取同样的节

Version 2.770.109

Security

  • 页面内容拆在多个流里时,ApplyLoadedRedactions 现在也能删除涂黑区域下的文本;过去当一个流以操作符结尾、下一个流以操作符开头(例如 ET 后跟 BT)时,拼接点之后的文本会匹配到错误的操作数,区域虽然被涂盖,文本在保存的文件里仍可读
  • 无数据的内容流现在被一致地跳过,其余流与页面上定位到的文本一一对齐

Version 2.770.108

Changed

  • GetLoadedOCGCount、GetLoadedOCGName、GetLoadedOCGVisibility 和 SetLoadedOCGVisibility 现在都用同一个索引:可选内容组在文档 /OCProperties /OCGs 数组中的位置。过去 Count 和 name 用默认配置 /ON 数组里的位置,visibility 用 /OFF 里的位置,setter 用 /OCGs,同一个索引可能指到三个不同的组;没有 /OCGs 的文档仍回退到 /ON 数组
  • GetLoadedOCGVisibility 现在在组被列入 /OFF、或它不在两个数组中且默认配置的 /BaseState 为 /OFF 时,把该组报告为隐藏

Fixed

  • SetLoadedOCGVisibility 不再把同一个引用对象同时放进 /OCGs 和 /ON 或 /OFF(文档释放时它会被释放两次),也不再泄漏它移除的条目

Version 2.770.107

Fixed

  • CopyLoadedPage 不再让源页面字典和目标页面字典共享同一份 /Contents 与 /Resources 条目对象;文档释放或目标条目被替换时这些共享对象会被释放两次,可能损坏内存
  • 目标页面现在拿到指向源内容和资源的自己的引用(直接值则复制),其渲染页缓存条目也会刷新

Version 2.770.106

Fixed

  • 加载损坏的 PDF 不再为每个读不出的流对象泄漏内存,例如既没有 /Length 条目也没有 endstream 关键字的流,或字典、数据加载不了的流;反复打开这类文件曾让进程内存无限增长

Version 2.770.105

Fixed

  • 以空小数部分写出的数字(如 "21.",PDF 规范允许)不再导致加载失败;间接流的 /Length 若这样写,过去会丢掉整个流,页面因此空白
  • 带前导加号、整数部分为空(如 ".5")或整数部分超出 32 位范围的数字现在也能正确读取

Version 2.770.104

Fixed

  • PDFmerge demo:启用书签后,每个按源生成的书签现在打开该源合并出的第一页;过去所有书签都指向合并文件的首页
  • PDFmerge demo:默认示例源和输出名,以及表单里输入的相对名,都以 demo 目录为基准解析;在对话框里添加文件或选择输出不再改变当前目录、弄坏相对条目

Version 2.770.103

Fixed

  • TextOut demo:生成的 TextOut.pdf 现在真的使用压缩内容流,与 demo 注释里的承诺一致;它把 Compression 设为 cmFlateDecode,不再依赖并不控制压缩的 BeginDoc 参数

Version 2.770.102

Fixed

  • 增强型图元文件里用 AlphaBlend 绘制的图像,经 THPDFEmfPatcher.RenderEmfDirect 转换时保留记录在案的不透明度;过去它们按零不透明度混合,直接消失
  • 记录的 alpha 格式同样被遵守,没有 alpha 通道的图像按其常量不透明度混合,不再失败
  • 头部或像素数据指向记录之外的位图记录、或像素数据短于所声明位图的,现在直接跳过,不再读出记录之外
  • 单边超过 32768 像素或总量超过 64 兆像素的位图直接跳过,不再整块分配

Version 2.770.101

Fixed

  • StitchLoadedPage、StitchLoadedPageSideBySide 和 StitchLoadedPageSideBySideEx 现在通过一个携带页面内容、页面框和资源的 Form XObject 绘制源页面;过去页面字典本身被注册成 XObject,查看器画不出来,拼接的页面因此不显示
  • 往同一目标拼接多页时每一页都保留:各页有自己的 XObject 名称,而不是全部共享一个会顶掉前一页的名称

Version 2.770.100

Fixed

  • Form XObject 渲染时现在按 /BBox 裁剪,ISO 32000-1 就是这么要求的;form 画在包围盒之外的内容不再出现在页面上
  • 嵌套超过四层的 Form XObject 现在能画出来;过去它们被当成递归丢弃。嵌套允许到 32 层
  • 直接或经由其他 form 绘制自身的 form XObject 会被检测出来并跳过重复调用,渲染诊断里记一条递归

Version 2.770.99

Fixed

  • PDFOptimize demo:每个文本页上的那排小矩形现在有描边,条形可见,内容流里每条路径也按 ISO 32000-1 8.5.2 的要求以绘制操作符收尾;报告的文本 PDF 尺寸因此略有变化

Version 2.770.98

Fixed

  • 含成对括号且无反斜杠的字面字符串(如 /Title (Report (draft) v2))在加载文档时能完整读入;过去字符串在第一个闭括号处就结束,字典其余部分被读错
  • 转义括号的行为和以前一样

Version 2.770.97

Fixed

  • 当字典对象的某个字符串或名称值在行尾含 "stream" 字样(如带 /Title (Livestream) 的 Info 字典)时,加载不再把它误认成流;过去对象被当流读取,条目全部丢失
  • stream 关键字现在只在字典闭合 >> 之后且位于行尾时作为独立记号识别,与 PDF 规范对流对象的规定一致

Version 2.770.96

Fixed

  • Stamp demo:图像选择器提供的 PNG 和 BMP 文件现在能用作图像章;过去只有 JPEG 能用,其他文件报无效位图错误
  • Stamp demo:橡皮图章注释现在按设计放在每页右上方、顶部角落图像章之下,而不是右下角——那里它会和右下角的图像章重叠
  • Stamp demo:默认输入、输出和图像路径以 demo 目录为基准解析,对话框里选文件不再改变当前目录,相对名始终指向同一批文件

Version 2.770.95

Fixed

  • 带策略 OID 构造的时间戳请求(HPDFRFC3161BuildRequest,以及带时间戳权威策略的签名)现在把所请求策略编码成 RFC 3161 规定的纯对象标识符
  • 过去策略被包在一个上下文标签里,而 RFC 3161 把那个标签留给请求扩展,严格的时间戳权威会拒绝请求或忽略策略
  • 不带策略 OID 的请求行为不变

Version 2.770.94

Fixed

  • ViewerPref demo:Initial Zoom 不勾选现在真正表示 "None (Default)";生成的 PDF 不再以适页高方式打开——那是组件默认值,demo 过去没有重置它

Version 2.770.93

Fixed

  • FileAttach demo:demo 从名称含系统 ANSI 代码页之外字符的目录运行时,页面级附件注释现在能创建;附件文件按纯文件名传递而不是绝对路径

Version 2.770.92

Fixed

  • HTMLText demo:输出路径含系统 ANSI 代码页之外字符(例如希腊文或西里尔文目录名)时现在能正确写出,不再失败
  • HTMLText demo:生成的 PDF 不再自动在外部阅读器中打开,与其他控制台 demo 一致

Version 2.770.91

Fixed

  • SVG 和 XPS 路径导入遇到数百位数字、或长数字配大指数时不再抛 EOverflow;这类数值和其他越界数值一样被拒绝
  • 影响经 SVG 导入 API 放置的 SVG 图像和 XPS 路径几何,限浮点异常未屏蔽的编译器
  • 普通数字(包括带负指数的长尾数)照旧读取

Version 2.770.90

Fixed

  • EmfDraw demo:转换失败(例如输入图元文件缺失)现在以退出码 1 结束而不是 0,跑这个 demo 的脚本和构建步骤就能发现失败

Version 2.770.89

Fixed

  • CJKAnnotations demo:未安装 Arial Unicode MS 时,demo 现在真的回退到 Microsoft YaHei;它改为检查已安装字体,而不是等一个缺字体永远不会抛的异常,CJK 文本不再落进没有 CJK 覆盖的替换字体

Version 2.770.88

Fixed

  • 嵌套超过 32 个 q 操作符的内容流不再丢失外层图形状态:过去更深的保存被忽略,与之配对的 Q 却仍然恢复,嵌套块之后的文字和图形用上了外层 q 之前的状态
  • 影响经 content device 接口的文本提取和这类页面的 SVG 导出
  • 保存的状态栈现在随嵌套深度增长;极深的嵌套仍能正确配对

Version 2.770.87

Fixed

  • ImageDemo:"Image zoom" 书签现在跳到 IMAGE ZOOM 标题处,而不是第一页底部附近的某个位置

Version 2.770.86

Security

  • 打开以带椭圆曲线密钥的接收方证书加密的 PDF(ECDH 密钥协商)时,原始共享密钥和中间密钥派生缓冲现在一不再需要就被清掉,包括按备选字节序重试时和每条提前失败的路径上
  • 用 Windows 证书存储里的证书签名时,若找不到所需的 CryptoAPI 函数,不再把 crypt32.dll 和 advapi32.dll 留在已加载状态

Version 2.770.85

Security

  • 给 charstring 里 sbw 操作数过少的 Type 1 字形取轮廓,不再读取操作数栈之前的内存;格式错误的操作符会被忽略
  • 以双字节操作符的转义字节结尾的 Type 1 charstring,不再读过 charstring 末尾

Version 2.770.84

Fixed

  • CMap codespace 范围里字符码的字节长度现在按其十六进制字符串的长度取,与 ISO 32000-1 9.7.6.2 的规定一致;像 <0000> <00FF> 这样的范围过去因为上界装得进一个字节而被当成单字节,渲染和提取文本时把双字节码拆开了
  • 从内置 CMap 加载的 codespace 范围同样带上各自的码长

Version 2.770.83

Fixed

  • 嵌入已安装 TrueType 字体的子集时,复合字形(带变音符号的字母等)中组件带缩放或 2x2 变换的,每个组件都会保留;这类变换之后的组件过去会被读错,于是可能从子集中消失,或者其字形引用覆写到变换字节上
  • 组件相互成环、引用超出字体字形数或指向空字形的复合字形,不再让字体子集化崩溃或卡死
  • 子集里嵌在另一复合字形之内的复合字形,其组件引用只重编号一次而不是两次

Version 2.770.82

Fixed

  • CFF 字体字典(FontMatrix、FontBBox、blue 值等)里的实数,当一个字节同时装着数字和符号、小数点或指数时也能正确读取;同一字节里的数字过去会被丢掉,-2.25 就读成了 -0.5
  • 这些值一律按句点作小数分隔符解析,不受 Windows 区域设置影响;在小数分隔符为逗号的系统上过去会报转换错误

Version 2.770.81

Fixed

  • beginbfrange 数组条目跟在带多字符目标的数组条目后面时,文本提取和 ToUnicode 查找不再为其中的码返回残留的多字符字符串;这类码现在映射到自己的单字符

Version 2.770.80

Fixed

  • 按选定轴值实例化 TrueType 可变字体(比如通过 SetVariableFontAxis)时,gvar 数据里某个元组之后还跟稀疏元组的字形不再变形;稀疏元组过去会从上一元组的增量起步,把那些点移动两次
  • 稀疏元组未列出的点现在只从该元组列出的点插值,符合 OpenType gvar 规则的要求

Version 2.770.79

Security

  • AddTiffFromFile 现在会拒绝宽乘高需要超过 2 GB 光栅的 TIFF 页,抛出异常而不是分配一个大小已回绕的缓冲区、再让解码器写到缓冲区之外(堆溢出)
  • 宽或高为零的 TIFF 页同样被拒绝
  • 特别高的 TIFF 页(1200 行以上)现在报告分配失败,而不是往 nil 缓冲区里解码

Version 2.770.78

Fixed

  • Type 3 字体字形现在遵循水平缩放(Tz):按 200% 水平缩放绘制的一段文本会画成两倍宽,而不是保持原始宽度
  • Type 3 字体字形现在遵循文本提升(Ts),Type 3 字体排的上标和下标会升高或降低,而不是停在基线上
  • 字形的步进此前已按缩放处理;现在字形形状也与之对齐了

Version 2.770.77

Fixed

  • HPDFRFC3161BuildRequest 构建的 RFC 3161 时间戳请求总是把 nonce 编码成最简 DER INTEGER;随机 nonce 以零字节开头时,请求会带一个多余的先导零,严格的时间戳服务器会将其当作格式错误而拒绝
  • 返回的 nonce 保持请求的长度,拿它和时间戳响应做比较的调用方不受影响
  • 加密 PDF 2.0 文件(AES-256-GCM)的对象流解密为空内容时不再因 GCM 认证错误而加载失败;带有效认证标签的空对象流现在会被接受,被篡改的标签仍然拒绝

Version 2.770.76

Fixed

  • Hyperlink demo:链接标题和 URL 里系统 ANSI 代码页之外的字符(比如希腊文、西里尔文或带变音符号的文本)不再变成问号;标题按 Unicode 文本绘制,上面再覆盖一个 URI 链接
  • Hyperlink demo:URL 里的非 ASCII 字符在存入链接动作前先按 UTF-8 做百分号编码,阅读器因此能打开正确的地址

Version 2.770.75

Fixed

  • 分量超出 0..1 的 CalRGB 颜色在渲染时不再触发浮点异常(EInvalidOp);分量会先裁剪到有效范围再做 gamma
  • 在浮点异常被屏蔽的编译器上,这类颜色现在渲染成最接近的范围内颜色,而不是未定义的颜色

Version 2.770.74

Fixed

  • 多个线程同时跑 Direct File API 重写(比如 DADirectEncryptFileAES256 和 DADirectDecryptFileAES256)不再互相破坏输出;它们共享的字节范围拷贝过去用的是进程级单一缓冲区

Version 2.770.73

Fixed

  • THPDFSignatureValidationBatch 的共享吊销缓存现在能找到序列号最高位为 1 的签名者证书对应的 OCSP 响应;这类响应过去存的时候不带先导零字节、查的时候却带着它,后续每个签名因此都错过缓存
  • 由受委托 responder 签名、或按键标识 responder 的 OCSP 响应,现在按证书签发者存储,批量里的后续签名可以复用;过去它们存在 responder 名下,或根本不存
  • 在这些情形下,依赖同批次先前签名所缓存证据的签名现在能得出可信结论,而不是未知的吊销状态

Version 2.770.72

Fixed

  • 按名称查找嵌入文件(GetLoadedEmbeddedFileSpec、ExtractEmbeddedFileBytes、SaveLoadedEmbeddedFileToDisk 及相关方法)时,若文档 /EmbeddedFiles 名称树里有节点把彼此或自己列为 /Kids,不再栈溢出
  • 每个名称树节点只搜索一次,经共享节点可达的名称仍能找到

Version 2.770.71

Fixed

  • PageSizes demo:中文 8K 和 16K 格式的页面现在在任何系统上都能打印完整描述;中文格式名用拼音给出,因为描述用 Arial 绘制,而 Arial 没有 CJK 字形,非 CJK 代码页上非 ASCII 文本又会变成问号

Version 2.770.70

Fixed

  • 轴向(Type 2)渐变在渐变轴远离绘制区域时也能铺满整个区域,比如在页面边缘之外定义、带 /Extend [true true] 的渐变;这类区域过去会留白
  • 适用于 sh 操作符和用作填充或描边颜色的 shading pattern

Version 2.770.69

Fixed

  • Navigation demo:命名目标 chapter-1 和 chapter-2 现在把页面打开到顶部、距上边缘 60 points 处,而不是滚到页面底部;目标坐标位于 PDF 默认用户空间,原点在左下角

Version 2.770.68

Fixed

  • 对带嵌入 TrueType 字体的 PDF 提取文本时,若字体 cmap 被截断却声称有数千个段或组,不再卡住数分钟;现在会先检查表长度再读段和组
  • 为嵌入 TrueType 字体构建字形到 Unicode 的映射时,每个 cmap 子表按段或组走一遍,而不是把 65,535 个 BMP 码点逐个查一遍;大 CJK 字体的提取也因此提速
  • 经截断的 format 4 或 format 12 cmap 子表查字形时,到字体数据末尾就停,不再扫描根本不存在的段

Version 2.770.67

Fixed

  • 指数(Type 2)和 stitching(Type 3)函数现在遵守单输入的 /Domain(比如 [0 0.5]);过去它被忽略并替换成 [0 1],输入于是被裁到错误的区间
  • 没有 /C1 的指数函数现在用默认值 [1.0];这样定义的 Separation 颜色和渐变过去渲染成黑色
  • 指数函数现在直接用输入本身计算 C0 + x^N (C1 - C0),而不是先把它重缩放到 0..1,对 [0 1] 以外的定义域与 ISO 32000-1 一致
  • 指数函数的输出只在 /Range 存在时才裁剪;带 Lab 替代色彩空间(L* 最高 100)的专色过去被裁到 0..1,渲染出来近乎全黑
  • 输入超出定义范围的指数函数会被拒绝,而不是触发浮点异常

Version 2.770.66

Fixed

  • 由从零长度密码派生密钥的工具导出的无密码 PKCS#12 / PFX 文件,现在能在 HPDFParsePFX、HPDFParsePFXByLocalKeyID、HPDFEnumeratePFXIdentities 和各 PFX 签名方法中用空密码打开;过去它们会报认证错误
  • 空密码时先试 RFC 7292 的标准编码、再试零长度形式,完整性检查和密钥解密都是如此,已能打开的文件打开方式不变

Version 2.770.65

Fixed

  • C++Builder DBTable demo 的页眉现在显示 "Page 1" 而不是 "Page1"
  • C++Builder DBTable demo 写表格中途出错时,现在会关掉建了一半的文档,下一次点击从干净状态开始

Version 2.770.64

Fixed

  • C++Builder 控制台 demo AnnotationInteraction、FormFields、CanvasDraw、EmfDraw、FormXObject、GraphicDraw、ImageDemo、ImageMask、LineGraphicsState 和 RtLTextOut 不带参数启动时会切换到可执行文件所在目录,与 Delphi demo 一致,从别的目录运行也能找到输入文件、把 PDF 写到那里
  • C++Builder Graphic demo 不再给标题包含其输出 PDF 名的每个窗口发关闭消息——那可能关掉不相干的窗口
  • C++Builder ImageMask demo 现在与 Delphi 版本一致:检查 Mask.bmp 和 Image.jpg 是否存在、压缩输出、不打开查看器,出错时报告错误而不是以未处理异常收场
  • C++Builder EmfDraw demo 会报告错误(比如 Sample.emf 缺失)并返回非零退出码,而不是以未处理异常收场
  • C++Builder AddDelPages demo 以可执行文件所在目录解析相对输入输出文件名,与 Delphi 版本一致

Version 2.770.63

Fixed

  • C++Builder FileAttach demo 把 FileAttach.pdf 写到可执行文件旁边——这是 Delphi 版本和 readme 用的名字——而不是工作目录里的 Output.pdf,其 FileAttach.txt 附件也放在同一目录

Version 2.770.62

Fixed

  • Direct File API(DADirectEncryptFileAES256、DADirectDecryptFileAES256 及其他直接重写方法)现在能正确读取超过 2 GiB 的交叉引用流偏移;这类偏移过去被截断成负数,大文件上半部分的对象因此找不到
  • trailer 或交叉引用流里超过 2 GiB 的 /Prev 和 /XRefStm 偏移现在会跟随,而不再被读成 0,大文件的旧修订和混合交叉引用节不再被跳过
  • 加载大文件和检查其修订时同样如此
  • 新增 HPDFDirectReadUIntBE64 和 HPDFFindNameInt64 辅助函数,返回完整 64 位值

Version 2.770.61

Fixed

  • /W 字段宽度为负或大于 8 字节的交叉引用流现在会被拒绝而不解码;加载退回到扫描文件找对象
  • 对这类文件,Direct File API 方法(比如 DADirectEncryptFileAES256)不再读解码表之外的内存、不再可能崩溃,而是直接拒绝

Version 2.770.60

Fixed

  • 文本提取、搜索和字形位置现在能正确解读 " 文本操作符:其第一个操作数是词间距、第二个是字符间距;过去两者颠倒了
  • 用 " 且词间距或字符间距非零写的行不再报告偏移的字形位置——那会让提取的页面文本合并或拆散单词、让搜索命中错位
  • 页面渲染不受影响

Version 2.770.59

Fixed

  • Table demo:"Group A" rowspan 覆盖的行现在能在 Item 和 Notes 列显示各自的条目和备注;过去备注文本错位一列并被丢弃
  • Table demo:生成的 PDF 不再自动用外部阅读器打开,与其他控制台 demo 一致;系统 ANSI 代码页之外的输出路径原样保留

Version 2.770.58

Fixed

  • 把 Flate 数据解压进流时,若源流或目标流中途抛异常(比如写入失败或流到达大小上限),不再泄漏解码器状态(每次约 40 KB)
  • 压缩字符串时若压缩抛出异常,不再泄漏其临时缓冲区
  • 成功的压缩和解压行为与之前完全一致

Version 2.770.57

Fixed

  • 名称约束扩展未标记为 critical 的证书在签名证书验证时不再被当作不可读而拒绝;这类 CA 证书过去会让经过它的每条链都构建失败
  • 这类证书的约束现在像 critical 的一样作用于链的其余部分,允许子树之外的签名者名称仍会报为名称约束违规

Version 2.770.56

Fixed

  • 带深层嵌套 if 或 ifelse 过程的 PostScript calculator(Type 4)函数渲染时不再栈溢出;这类函数按不可用处理,颜色像其他无效函数一样回退
  • 嵌套限制为 64 层,远超真实 calculator 程序的用量;普通 Type 4 tint transform 和渐变的渲染如旧
  • 求值 calculator 函数每层嵌套所需的栈更少

Version 2.770.55

Fixed

  • E-Invoice demo:提取出的 Factur-X / ZUGFeRD XML 按 UTF-8 解码,名称和地址里的变音及其他非 ASCII 字符不再在 XML 面板里显示成乱码
  • E-Invoice demo:在 Delphi XE2 及更高版本上,综合 e-invoice 结论现在会决定业务规则步骤的走向,规则文件或引擎失败会使验证失败,而不是悄然通过
  • E-Invoice demo:启发式一致性检查发现可见文本与 XML 不一致时报告为警告,其本身不再让整体验证失败

Version 2.770.54

Security

  • CMS 签名验证(HPDFVerifyCMSSignature、HPDFVerifyCMSSignatureEx 和已加载的 PDF 签名)现在会在签名属性缺少 content-type 属性、或声明的 content type 与被签内容不同时报告签名格式错误,与 RFC 5652 的要求一致;这类签名过去能验证为有效,为一种 content type 制作的签名属性就能冒充签了另一种内容
  • content-type 属性重复的签名照旧被拒绝
  • 按定义不带 content-type 属性的会签和 RFC 3161 时间戳令牌照旧正常验证

Version 2.770.53

Fixed

  • 第二次点击 C++Builder Annotations demo 的按钮时,不再在开始新文档前把上一个文档再写一遍
  • C++Builder Annotations demo 构建 PDF 中途出错时,现在会关掉建了一半的文档,下一次点击从干净状态开始

Version 2.770.52

Fixed

  • 同一进程里使用同一磁盘渲染缓存目录的多个文档或 THotPDF 实例,现在共享一份缓存索引;过去每个实例各留一份索引,每次保存都覆盖别人的,最近使用的顺序随之丢失
  • 磁盘渲染缓存的文档数和总大小上限在共享同一目录的所有实例间统一执行,多个查看器或渲染线程同时使用时,目录不会再超出预算增长
  • 同一目录无论大小写还是末尾路径分隔符的差异都能识别为同一目录

Version 2.770.51

Fixed

  • 用双三次或 Lanczos3 内核对位图重采样现在对每种源像素格式都正常;32 位、8 位或 1 位的源过去被当作 3 字节像素来读,颜色通道因此错乱,或读到行末之外
  • 这类源会先转成 24 位,重采样后的图像与源颜色一致;结果仍和从前一样是 24 位位图
  • 24 位源和 halftone 内核不受影响

Version 2.770.50

Fixed

  • PreflightCLI demo:对单个 PDF 用 -d 时,即使文件 preflight 失败也会写出 dashboard 索引
  • PreflightCLI demo:preflight 期间报错的文件会在 dashboard 索引中列为失败,退出码反映每个失败的文件
  • PreflightCLI demo:带 -r 时,不同子目录下同名 PDF 的报告会写到对应的子目录,不再互相覆盖,-o 和 dashboard 两种方式都如此
  • PreflightCLI demo:-f json 和 -f csv 无论带不带 --profile / --preset / --aggregate,产出的 schema 都一致,包括 CSV 的 spec 列
  • PreflightReport demo:带 profile 生成的 CSV 报告现在会像不带 profile 的报告一样填好 spec 列

Version 2.770.49

Fixed

  • C++Builder LargeFile demo 现在能生成其 readme 描述的基准输入集,与 Delphi 版本一致:可执行文件旁 BenchmarkInputs 目录里的 LargeFile-Text.pdf、LargeFile-Image.pdf、LargeFile-Mixed.pdf 和 AES-256 加密的 LargeFile-Encrypted.pdf;过去它只写一个 200 页的 LargeFile.pdf
  • C++Builder LargeFile demo 接受 --output-dir、--scale(small、default、large、huge)和 --pages 选项,并打印针对生成目录的 HugeFileBenchmark 命令

Version 2.770.48

Fixed

  • C++Builder Outlines demo 现在把 Outlines.pdf 写到可执行文件旁边——readme 说的就是这个名字——而不是工作目录里的 Output.pdf,并报告保存位置,不打开查看器
  • C++Builder Outlines demo 现在构建与 Delphi 版本相同的带 Arial 页标签的 10 页文档;过去页底 y = 830 处的标签被页面边缘截断,最后一页的 "Bottom" 书签指向其下方
  • C++Builder Outlines demo 写 PDF 中途出错不再导致 demo 无法再创建文档

Version 2.770.47

Fixed

  • 持久化磁盘渲染缓存现在能在名称含系统 ANSI 代码页之外字符的目录下工作(比如带非拉丁字符的用户配置目录);过去那里每次页面写入都失败,缓存从不命中
  • THPDFDiskPageCache 以 Unicode 字符串接受根目录,所有缓存路径都保持 Unicode,包括页面文件和缓存索引的原子替换

Version 2.770.46

Fixed

  • 区域和 tile 渲染(RenderLoadedPageRegionToBitmap、RenderLoadedPageTiles、渐进式区域渲染)不再让内容全部来自远离原点的 form XObject 的 tile 空白;form 现在按其 /Matrix 和当前变换放置后的 /BBox 计入覆盖范围
  • 用 TD、T*、' 或 " 放置的文本,在判断哪些 tile 包含它时现在会落到正确的行上,段落的后续行不再被错误剔除出其所在的 tile
  • Td 偏移按文本矩阵缩放、从行首起算,与文本实际绘制的方式一致
  • 估算一段文本的结束位置时会考虑字符间距、词间距、水平缩放和文本提升,字形也不再被假定窄于一个 em

Version 2.770.45

Fixed

  • C++Builder MemStream demo 把 MemStream.pdf 写到可执行文件旁边——Delphi 版本用的名字——而不是工作目录里的 Memory.pdf
  • C++Builder MemStream demo 现在会用 LoadFromStream 重新加载内存中的 PDF,保存前检查它有一页
  • C++Builder MemStream demo 写 PDF 中途出错不再导致 demo 无法再创建文档

Version 2.770.44

Fixed

  • C++Builder HelloWorld demo 启动时不再给标题含 HelloWorld.pdf 的每个窗口发关闭消息——那可能关掉编辑器或文件管理器等不相干的窗口
  • C++Builder HelloWorld demo 把 HelloWorld.pdf 写到可执行文件旁边,仅在给了 --open 时才打开;与 Delphi 版本一样接受输出文件名或 --output <file>

Version 2.770.43

Fixed

  • 加载页面树带中间 /Pages 节点的 PDF 不再丢掉这些节点之下的页面;这类文档过去只报告直接列在树根下的页面
  • 页面保持页面树顺序,页索引、页框和内容与其他查看器显示的一致
  • /Type 存为间接对象的页面在这一排序步骤中被识别为页面

Version 2.770.42

Fixed

  • 加载页面树自引用的 PDF(/Pages 节点列在自己的 /Kids 里,或两个节点互相列出对方)不再栈溢出崩溃;每个页面树节点只走一次,深得离谱的树会被截断
  • /Kids 数组或 /Type 名存为间接对象的页面树节点现在能加载其页面,不再失败或读无效内存

Version 2.770.41

Fixed

  • THPDFPage.LastAnnotation 现在返回 AddGoToLink、AddURILink、AddNamedDestinationLink、AddGoToRLink、AddLaunchLink、AddStructureDestinationLink 和 AddGoToRStructureDestinationLink 创建的链接
  • 添加链接后立即用 LastAnnotation 调 SetAnnotationFlags、SetAnnotationBorderStyle 或 AddPopupAnnotationFor,不再静默无效、也不再改动之前创建的注释

Version 2.770.40

Fixed

  • 传给 THPDFJobProcessor.Execute、HPDFDocRunJob 和 HPDFDocRunJobWithCallbacks 的作业 JSON 现在全程按 UTF-8 读取:\uXXXX 转义不再坍缩进 ANSI 代码页,😀 这类转义代理对能产出正确的字符,而不是两个坏字符
  • merge、split、optimise、encrypt 和 validate 作业里的输入输出文件名保留系统代码页之外的字符——无论写成原始 UTF-8 还是 \u 转义——这类文件能按真实名称找到并写出
  • 十六进制位数不足四个的畸形 \u 转义会被丢弃,不吞掉后续字符或收尾引号
  • 作业文本开头的 UTF-8 字节顺序标记会被忽略

Version 2.770.39

Fixed

  • 构建签名和时间戳请求时调用方提供的对象标识符(signature policy、commitment type、claimed role、timestamp policy 等 OID),首弧为 2、第二弧大于等于 48 时现在能正确编码;合并后的首值过去被截成一个字节,产出另一个错误的标识符
  • 大到无法表示的对象标识符弧现在报错拒绝,而不是静默回绕成另一个值

Version 2.770.38

Fixed

  • HugeFileBenchmark demo:带 --recursive --keep-output 时,不同子目录下同名的 PDF 不再互相覆盖生成的文件;工作目录现在镜像输入目录树

Version 2.770.37

Security

  • 渲染带嵌入 TrueType 字体的 PDF 时,若其复合字形列出大量组件、且每个组件又是复合字形,不再挂死渲染器或文本转路径导出;单个字形现在跨所有嵌套层最多展开 1024 个组件
  • 指回自身字形的复合字形组件会被跳过,而不是一路展开到嵌套上限

Version 2.770.36

Fixed

  • 直接或经其他函数指回自身的 stitching(Type 3)函数不再递归到栈溢出;它按不可用函数处理
  • 影响用 RenderLoadedPageToBitmap 和其他渲染路径渲染的畸形或恶意 PDF 中的 Separation 与 DeviceN tint transform、渐变函数和 transfer function
  • 函数嵌套限制为 16 层;正常文档的嵌套远达不到这个深度

Version 2.770.35

Fixed

  • C++Builder PageOperations demo 现在与 Delphi 版本跑同样的流程:也会用 InsertLoadedBlankPage 插入自定义尺寸的空白页,并用 ExtractLoadedPagesText 打印第 1-3 页的文本
  • C++Builder PageOperations demo 重排和提取出的文件与 Delphi 版本包含相同的页面:把最后一页移到第 2 页,提取第 2 和第 5 页

Version 2.770.34

Fixed

  • C++Builder Hyperlink demo 在链接列表一页放不下时会换新页继续;过去越过第一页底部的链接被写到页面之外
  • C++Builder Hyperlink demo 写 PDF 期间禁用 Add、Remove 和 Make PDF 按钮,生成中途链接列表不再能变动,文档也不会被二次启动

Version 2.770.33

Fixed

  • C++Builder Stamp demo 现在按每页尺寸放置文本水印和橡皮图章注释;横向及其他非 A4 页面上,图章注释过去落到页面之外,水印则偏离中心

Version 2.770.32

Fixed

  • C++Builder ViewerPref demo 的每个按钮现在都从全新文档开始;过去上一次点击设置的阅读方向、初始缩放等查看器偏好继续生效,比如 Test Direction 之后再点 Create PDF,仍会写出从右到左的文本和已不再勾选的偏好
  • C++Builder PDF_INFO demo 现在把 PDFInfo.pdf 写到可执行文件旁边——Delphi 版本和 readme 用的文件名

Version 2.770.30

Security

  • 证书路径验证(HPDFValidateCMSCertificatePath、在线变体和签名批量)不再被嵌入大量同名同钥证书的签名拖停;这样一组证书过去会让路径搜索尝试每种可能的排序,排序数按阶乘增长,一次验证可能耗上数小时
  • 候选链中每个签发者签名每次验证只验一次并复用结果,而不是每条经过它的路径都重验一遍
  • 路径搜索有固定的工作量上限;达到上限时验证报告没有有效路径到达信任锚,普通链远低于该上限

Version 2.770.29

Fixed

  • ImportLoadedInterchangeFromFDF 读取注释和 FDF 状态时现在按完整键名匹配:/T 不再停在 /Type 或 /Text,/F 不再停在 /FreeText,/Status 不再停在同样开头更长的键上,导入的注释因此保住作者和标志
  • 导入注释内部嵌套字典的键,以及字符串里长得像键的文本,不再被当作注释自身的条目
  • 导入的 FDF 注释和状态里的字面字符串按 ISO 32000-1 定义的全部转义解码:除了 \n、\r 和转义括号,还包括 \t、\b、\f、八进制 \ddd 和反斜杠续行

Version 2.770.28

Fixed

  • 在用 XE2 之前的 Delphi 版本构建(自带 PNG 读取器)的程序里,加载带压缩文本(zTXt)块的 PNG 不再读过内部缓冲区;超过 256 字节的文本过去会损坏且长得离谱,大块可能崩溃
  • 压缩文本块的压缩方法现在从正确的字节读取,方法不支持的块会被忽略,而不是当成 deflate 数据来解
  • 被截断或畸形的压缩文本不再有无限解码循环的风险
  • Delphi XE2 及更高版本的构建使用系统 PNG 读取器,不受影响

Version 2.770.27

Changed

  • C++Builder SearchAndSelect demo 现在与 Delphi 版本一致:创建示例 PDF、加载它、用 SearchLoadedDocumentText 找搜索词,并用 AddLoadedHighlightAnnotation 在每个命中上加高亮注释
  • C++Builder SearchAndSelect demo 接受输入 PDF、搜索词、输出文件和 --case-sensitive、--whole-word 选项,并检查保存出的副本中的新注释

Fixed

  • C++Builder SearchAndSelect demo 的高亮现在盖住命中的单词;过去高亮位置高一整行,因为把文本位置当成了基线而不是文本顶部

Version 2.770.26

Fixed

  • C++Builder DigiPrint demo 现在能在小数分隔符为句点的系统上启动;demo.xml 里的逗号小数过去按系统 locale 解析,创建窗体时报错
  • DigiPrint demo 从可执行文件目录读取 demo.xml 和它的两个 JPEG 图标,demo.pdf 也写在那里;工程现在把可执行文件放到 demo 目录中这些文件旁边
  • DigiPrint demo 的页脚页面图标画在页脚行内,而不是页面底线下方;标题、年份和页脚文本使用报表样式的字号
  • 多次点击 DigiPrint 按钮不再让左边距随每次点击继续右移
  • DigiPrint demo 构建 PDF 中途出错(比如图像文件缺失)不再导致 demo 无法再创建文档

Version 2.770.25

Fixed

  • Showcase demo:页头条带、封面背景、渐变色样和封底点缀现在与它们填充的形状对齐;渐变坐标按 PDF 默认用户空间(原点在左下)给出,颜色不再错位或翻转
  • Showcase demo:Save Copy 不再切换工作文件,Regenerate 和 Open External 继续使用主画廊,而不是最后写出的副本
  • Showcase demo:画廊生成失败时,查看器会重新绑定并继续显示上一个加载成功的画廊,而不是停留在空白
  • Showcase demo:含系统 ANSI 代码页之外字符的输出路径原样传递

Version 2.770.24

Fixed

  • 把四分量(RGB 加 alpha,或 YCC 加 alpha)的 JPEG 2000 图像加载进 TJpeg2000Bitmap 时,红、绿、蓝和 alpha 现在放进 32 位位图的正确字节;过去颜色通道错位一个字节,alpha 通道还覆盖了其中一个
  • 这也修复了 32 位 TJpeg2000Bitmap 经 SaveToStream 和 LoadFromStream 走一圈回来颜色错乱的问题
  • 三分量彩色图像、灰度图像和四分量 CMYK 图像的加载照旧

Version 2.770.23

Security

  • 值以 << 开头、以 >> 结尾的文本字符串(比如标题、作者、表单字段值或 "<<URGENT>>" 这类注释文本)现在总是按字符串保存;过去它被原样写出,破坏了文件语法,精心构造的文本可以把动作字典之类注入保存出的文档
  • 适用于新文档,以及用 SaveLoadedDocument 及相关方法保存的已加载文档

Version 2.770.22

Fixed

  • C++Builder Barcodes demo 把 Barcodes.pdf 写到可执行文件旁边而不是当前工作目录,并接受可选的输出文件名作为唯一参数
  • C++Builder Barcodes demo 运行后不再打开 PDF 查看器,并与 Delphi 版本一样压缩页面内容、以适高缩放打开
  • C++Builder Barcodes demo 的错误现在带消息文本报告;过去控制台只显示一个内存地址

Version 2.770.21

Fixed

  • 在稳定 C ABI 中,同一句柄上另一个调用还在运行时(来自另一线程,或来自 read、write、progress、cancellation 回调内部)调用 hpdf_document_destroy,不再把该调用正用的文档释放掉
  • hpdf_document_destroy 一返回句柄即失效;文档本身在最后一个运行中的调用结束后释放
  • 与销毁并发查找句柄的调用会得到 HPDF_STATUS_INVALID_HANDLE,而不是碰上已释放的内存

Version 2.770.20

Security

  • 用 GSUB 上下文 lookup 自引用的 TrueType/OpenType 字体对文本做 shaping,不再栈溢出崩溃;嵌套深度现在真正跨层累积
  • 触发大量嵌套 lookup 的上下文规则不再把它们滚成近乎无尽的循环:每个顶层匹配最多运行 1024 个嵌套 lookup

Fixed

  • 从另一上下文 lookup 到达的链式上下文替换(GSUB lookup type 6)现在会被应用;过去它按普通上下文布局读取、永远匹配不上,部分连字和上下文字形因此缺失
  • 上下文规则引用的反向链式替换(GSUB lookup type 8)按 OpenType 规范要求被跳过,而不是被误读成上下文子表

Version 2.770.19

Fixed

  • 页面含图像 XObject 或内联图像时,RenderLoadedPageToDC 不再触发访问违例;图像会画进调用方的设备上下文
  • GetLoadedPageMetafile 在带图像的页面上不再失败,图像也会记录进返回的图元文件
  • 设备上下文没有裁剪区域时,图像对可见表面的裁剪现在使用传给 RenderLoadedPageToDC 的尺寸

Version 2.770.18

Fixed

  • 启用 grid skipping 的 JBIG2 halftone 区域不再丢掉起始于区域左方或上方、但仍与区域重叠的网格单元;这类单元过去被当作远在区域之外,其灰度值被跳过,区域其余单元的解码也因此错步
  • 非整像素的负网格坐标现在按 JBIG2 规范要求向负无穷取整,部分可见的单元因此落在正确的像素上
  • 网格完全处在非负坐标的 halftone 区域不受影响

Version 2.770.17

Fixed

  • responder 按 RFC 6960 标准形式(键哈希外带显式 [2] 标签)以密钥哈希标识的 OCSP 响应重新被接受;证书路径验证过去会丢弃它们,凡以密钥自称的 responder 吊销状态因此一直是未知
  • 按键标识的直接 responder(签发 CA)和受委托 OCSP 签名证书都能匹配,较老的隐式标签形式照常工作
  • HPDFDescribeValidationEvidence 现在按每条响应中署名的证书签发者 DN(从响应的 issuer name hash 解析)来组织 OCSP 描述,而不是按 responder DN;受委托 responder 的响应和按键标识的响应产出的描述,按证书签发者查找就能找到
  • 新增接受 CMS 签名和额外签发者证书的 HPDFDescribeValidationEvidence 重载,用于按键标识 responder 且不嵌入证书的响应

Version 2.770.16

Fixed

  • Viewer demo:窗体启动时不再触发访问违例;状态栏现在在查看器绑定文档之前就已存在,并开始报告页面变化
  • Viewer demo:在搜索框中按 Enter 现在激活第一个命中,而不是直接跳到第二个
  • Viewer demo:目标页无法解析的书签列出时不再带假的 "(p0)" 后缀,点击它们也不再触发范围错误

Version 2.770.15

Fixed

  • C++Builder Security demo 的解密步骤现在真正用用户口令 "user" 打开加密样例;过去口令参数被当成了自动解密标志,样例没带口令就加载了,Security-Decrypted.pdf 也不是解密副本

Version 2.770.14

Fixed

  • 用 W 或 W* 设置的裁剪路径现在在路径绘制之后生效,与 ISO 32000-1 的要求一致,而不是之前生效
  • 描边同时设置裁剪的路径(re W S)现在画出整条线宽;描边的外半边过去被路径自身的裁剪切掉了
  • 带 even-odd 裁剪的填充加描边(W* B)现在按绘制操作符自身的环绕规则填充;even-odd 裁剪过去会在填充里打出洞来
  • B* 和 b* 现在总是按 even-odd 规则填充,不受先前操作遗留的填充规则影响

Version 2.770.13

Fixed

  • 灰度平面用 MMR 编码的 JBIG2 halftone 区域现在能解码;过去平面解出来是反相的、每八列只读一列,且每个平面的结尾定位到错误的字节,后续平面于是从错误位置开始解码
  • 每个 MMR 平面之后的块结束标记,无论紧跟最后一行还是隔着字节填充都能识别,每个平面现在都从随后的字节边界开始
  • 算术编码的 halftone 区域不受影响
  • 适用于带 JBIG2Decode 滤镜、用内置解码器加载、提取或渲染的 PDF 图像

Version 2.770.12

Fixed

  • 作业处理器(THPDFJobProcessor.Execute、HPDFDocRunJob、HPDFDocRunJobWithCallbacks)和文档比较产出的 JSON 现在把引号和反斜杠转义成 \" 和 \;过去的 \x22 / \x5C 形式不是合法 JSON,会让标准解析器拒绝含引号或 Windows 路径的结果
  • 控制字符写成 \uXXXX 转义,输出始终是良构 UTF-8:无效 UTF-8 字节替换成 U+FFFD,而不是原样拷进结果
  • 作业结果和比较错误对象里的错误消息按 UTF-8 编码,非英文异常文本和文件名不再以 ANSI 代码页到达

Version 2.770.11

Fixed

  • RedactLoadedRect、StampLoadedPageText、StampLoadedPageImage、StampLoadedPageShape、StitchLoadedPage 和 FlattenLoadedAnnotations 在页面 /Contents 是流数组时不再丢弃页面既有内容;新操作符作为额外的流加在数组末尾,底层放置时加在最前面
  • 内容拆成多个流的页面上做底层 stamp,会保留每一个原始流
  • 单一内容流用了纯 FlateDecode 之外滤镜(ASCIIHex、ASCII85、LZW、RunLength、滤镜链或带 predictor 的 Flate)的页面,现在会在追加新操作符前先解码,stamp、涂黑框或压平外观真正画得出来,原始内容也保持可读
  • 页面内容流完全无法解码时保持原样不动,新操作符写进单独的流,而不是追加到已编码字节后面

Version 2.770.10

Security

  • 渲染嵌入 CFF 字体(FontFile3、Type1C 或 CIDFontType0C)存有 0x80000000 及以上 INDEX 偏移的 PDF,不再读字体数据之外的内存;这类偏移过去被当成负数,绕过了边界检查
  • 嵌入 TrueType 字体的字形位置和表长度达到 0x80000000 及以上时同样处理:跳过该字形或该字体,而不是从错误位置读取
  • subroutine 相互多层调用的 CFF 字形不再挂死渲染或文本转路径导出;每个字形现在有固定的 charstring 操作预算,远高于真实字体的用量

Version 2.770.9

Fixed

  • 文本区域使用 Huffman 编码并配 13 像素模板符号精化的 JBIG2 图像现在能解码;区域头里精化自适应像素的字节过去被跳过,实例计数及其后每个字段都从错误偏移读取,图像因此被拒
  • 算术编码或用 10 像素精化模板的文本区域不受影响,解码与从前完全一致
  • 适用于带 JBIG2Decode 滤镜、用内置解码器加载、提取或渲染的 PDF 图像

Version 2.770.8

Security

  • 启用编解码器隔离时,隔离 codec worker 返回的解码图像尺寸现在按配置的输出上限和宿主进程分配的共享内存来检查,而不是按 worker 自己能改写的容量字段
  • 被攻破或有故障的 worker 无法再让宿主拷贝越过共享内存块末尾;这类应答按协议错误拒绝,图像不会从中绘制
  • worker 的应答只拷贝一次并从该副本验证,其头部无法在检查与像素拷贝之间被改动

Version 2.770.7

Fixed

  • 为实时吊销检查构建的 OCSP 请求(HPDFCollectCMSRevocationRequests 和在线证书路径验证)现在能正确编码 CertID 的 SHA-256 算法标识符;过去对象标识符的前两个弧被写成独立字节,哈希算法因此无效
  • 拒绝畸形请求的 OCSP responder 现在对这些请求以正常状态应答而不是报错,在线吊销检查不再因请求编码而退回离线证据

Version 2.770.6

Fixed

  • 渲染 Type 3 字体现在会画出字形的每一次出现;过去同一文本串里重复的字形,或页面上其他地方同尺寸同朝向的同一字形,只在第一次绘制,之后就留白
  • 影响 RenderLoadedPageToBitmap、RenderLoadedPageToDC、页面图元文件和图像导出路径,无论是否启用共享渲染缓存
  • 重复的 Type 3 字形继续走字形缓存,该修复不会为每次出现重读字形过程

Version 2.770.5

Fixed

  • 稳定 C ABI 中,hpdf_document_load_from_io 在文档解析中途失败时(比如 read 回调报错或操作中途取消)不再二次释放输入源;这类加载可能破坏堆或让宿主进程崩溃
  • 失败的加载现在返回回调或取消状态而不是内部错误,同一文档句柄之后可以再次加载
  • 向已有句柄加载新文档时,只有新加载接管之后才释放先前的输入源

Version 2.770.4

Fixed

  • 在带 /Rotate 90 或 /Rotate 270 的页面上,DecodeLoadedPageBarcodes 的条形码结果现在按符号真实位置报告边界,而不是跨页镜像的位置
  • 这些页面上报告的条形码方向现在与符号在页面空间中实际的读向一致
  • ApplyLoadedOCRTextLayer 放在旋转四分之一圈页面上的不可见文本现在落在识别出的单词上,选择和搜索高亮的位置因此正确
  • 涂黑检测在旋转四分之一圈页面上的人脸发现项同样映射回正确的页面区域
  • 未旋转和倒置的页面不受影响

Version 2.770.3

Fixed

  • 32 位构建下,加载或写出 PixarLog 压缩的 TIFF 图像不再栈溢出崩溃;选择该编解码器会构建其压扩表,而压扩表会撞上无限递归的指数辅助函数
  • 32 位构建下的 SGILog(LogLuv)TIFF 图像走同样的修正后数学辅助函数
  • TIFF 编解码器使用的 32 位向下取整辅助函数现在把负值向负无穷取整,且接受大数值而不报溢出错误,与 64 位构建一致

Version 2.770.2

Changed

  • 渲染时,按不超过自身像素尺寸一半的大小绘制的图像,会在解码后立即用面积平均收缩到实际绘制尺寸,而不是保留全尺寸、等到绘制时再拉伸
  • 缩小后的图像进得了已解码图像缓存:为求出 alpha 而在黑、白两个底上各画一遍的透明度组,这类图像现在只解码一次,不再每遍各解一次;重画同一页时同样受益
  • 带 soft mask 的图像在绘制尺寸上与掩码逐像素合成,掩码也一并缩小;这省掉了为大图像及其掩码各构建并预乘一份全尺寸副本的开销,掩码边缘也不再按最近邻取样
  • 在一个样例页上,4229 x 4629 的掩码图像于这类组内按约四分之一尺寸绘制,渲染耗时从 4.5 秒降到约 1.8 秒
  • stencil 型图像掩码保持全分辨率,公开的区域解码方法也照旧返回各自文档声明的尺寸

Version 2.770.1

Fixed

  • 64 位构建下,透明度组若没有设置自己的 soft mask,渲染其所在页就会报 list index 错误——这是 2.769.3 引入的回归;这类页面现在又能正常渲染

Version 2.770.0

Added

  • 新增 RenderColorimetricLuminosityMasks 属性,用于选择 luminosity soft mask 在其组使用 CIE 类混合色彩空间(CalGray、CalRGB、Lab 或 ICCBased)时,如何把颜色换算成掩码值
  • 设为 true 时按 ISO 32000-1 11.5.3 的方式取 CIE Y;两种设置下渲染出的位图分开缓存

Changed

  • 默认情况下,无论混合色彩空间是什么,luminosity 掩码都像常见 PDF 阅读器那样,按 DeviceRGB 的方式给组内解析出的颜色加权。CIE Y 是线性刻度,ICC 或校准组里的中灰此前只被掩掉约五分之一,投影和淡出因此比其他阅读器浅得多
  • 掩码的 /BC 背景色跟随与掩码组内部绘制相同的设置
  • 组使用设备色彩空间的掩码照旧渲染

Version 2.769.3

Fixed

  • 以 Normal 之外的混合模式绘制的透明度组——比如设计工具导出的 Multiply 投影——现在会让自身的颜色和 alpha 与背景正确合成(ISO 32000-1 11.3.6 和 11.4.8)。组半透明的区域,像素里本就含有背景色,此前再拿去与背景混合一次:Multiply 投影于是又暗又带着背景的色相
  • 透明度组的内容从 Normal 混合模式起步,因为混合模式作用于组整体(11.6.6)。此前内容会沿用组被绘制时的模式,隔离组的开局是一片空,Multiply 等于把内容乘进空底,画出来一抹黑
  • soft mask 与混合模式设在同一图形状态时,其掩码组按 Normal 方式绘制(11.6.5.2);此前混合模式会把白色的掩码组画黑,掩码本该露出的内容反而被藏住
  • 对非隔离组,若其内部图形状态都是正常混合,就在黑、白两个底上各画一遍来求出 alpha;这类页面的渲染会稍慢一些

Version 2.769.2

Changed

  • 带 soft mask 的图像现在按绘制尺寸解码(不带掩码的图像早已如此),掩码也按同一尺寸解码;JPEG 掩码走缩尺寸 JPEG 解码器,不再全尺寸解一遍
  • 图像和掩码始终整体解码,掩码因此不会相对图像错位,裁剪也依旧只保留画进可见区域的内容
  • 一页上有 4229 x 4629 的阴影图像和 2114 x 2314 的 JPEG 掩码、按约 1000 像素宽绘制时,72 dpi 渲染从 3.7 秒降到 1.6 秒
  • 对没有区域解码器的格式,DecodeLoadedImageRegionAtResolution 直接返回整图解码结果,不再多复制一次

Version 2.769.1

Changed

  • soft mask 构建提速:构建掩码不再为对比保留整页的第二份副本——掩码多的页面(比如设计工具导出的渐变和投影)过去每个掩码都要付一次这份代价
  • 校准或 ICC 混合空间上的 luminosity 掩码改为查 sRGB 曲线表,不再对每个像素的每个通道现算;灰度掩码内容这一最常见情形则经单一转换表完成
  • 一页带约二十个 soft mask 的 1125 x 1600 页面,渲染快了约五分之一;渲染出的像素不变

Version 2.769.0

Changed

  • 设置页面 Width 或 Height 不再吞错:失败会抛异常,而不是让尺寸默默不生效;对画布已经关闭的页面设置尺寸则抛出新的 EHPDFPageClosedError,消息里写明原因
  • 这类失败之后,页面不会再停留在后续改尺寸只更新 MediaBox、却不影响绘制所用页面尺寸的状态

Fixed

  • 调整已加载 PDF 的页面尺寸不再覆写其他对象:数字各自成对象的 MediaBox、或被多页共享的 MediaBox 数组,会为被调整的页面复制一份,其他页面的尺寸不受影响
  • 已加载页面的 MediaBox 数值不足四个时,调整尺寸现在会写出带新尺寸的完整 MediaBox;此前新尺寸会被无视

Version 2.768.20

Fixed

  • 文本提取不再进入会绘制自身的 Form XObject(直接自绘或经由其他 form);这种 form 过去在每层嵌套都会被重读一遍,文本最多重复十二次,自绘两次的 form 更要跑 4,096 遍
  • Form XObject 中落在自身包围盒(即其裁剪范围)之外的文本,不再计入页面文本

Version 2.768.19

Changed

  • 大文档的加载速度回来了:遍历页面树不再为每一页去搜全部已加载对象,LoadFromFile 带 AutoDecrypt 的加密检查也改用与加载相同的缓冲区读文件。56 MB 的 PDF Reference 1.7 现在约 8 秒加载完,此前要 22 秒

Version 2.768.18

Fixed

  • 页面渲染现在找得到 Windows 以本地化名称上报的已安装字体,比如中文 Windows 上的 Microsoft YaHei、日文 Windows 上的 Yu Mincho;PDF 未嵌入这类字体时,其文本过去会被画成替代字体
  • 不带空格书写的字体名现在能匹配 Windows 里单词相连的家族名,如 MicrosoftYaHei 对 Microsoft YaHei、MicrosoftJhengHei 对 Microsoft JhengHei、MSPGothic 对 MS PGothic;过去查找时会在每个大写字母前插一个空格,永远查不到
  • 渲染器会记住哪些字体名已安装,含大量未安装字体的文档不再每页逐名去问 Windows

Version 2.768.17

Changed

  • 大文档加载大幅提速:操作遥测在操作内最多每 10 ms 采样一次内存,而不是解析器每读一个对象采一次——每次采样都得把内存管理器的所有块走一遍。1,236 页的 PDF Reference 1.6 现在约 2.5 秒加载完(此前 30 秒),56 MB 的 PDF Reference 1.7 约 22 秒(此前超过四分钟)
  • 这项拖慢随应用自身堆的大小增长,握有大量内存的应用受益最大
  • UpdateOperationTelemetrySample 新增可选的 Force 参数,无视间隔强制采样;每个操作结束时依旧会采一次

Version 2.768.16

Fixed

  • 加载空文件不再卡死;LoadFromFile 过去会从文件开头不断向前回读,陷进死循环
  • 找不到任何页面的文件——空文件、纯文本、随机字节——不再按文件大小猜成一页或三页空白页加载;LoadFromFile 现在返回 0 或抛异常,与其他读不了的文件一致
  • 页面藏在加密对象流里的加密文件,不带密码加载时现在会抛异常说明需要密码,而不是加载成一页空白;请改用带密码的重载

Version 2.768.15

Fixed

  • 页面文本不再重复那些在原位上重复绘制的字符——叠印的 logo、靠微移重画一遍伪造的粗体都是这种;这类文本过去被提取两次,比如 "Bold wordsBold words",按它搜索还可能搜不到
  • plain、column、layout、semantic 四种文本提取都只读这样的字符一次;字形列表仍会报告每一个绘制过的字形

Version 2.768.14

Fixed

  • 完整 Adobe Glyph List 的字形名现在在文本提取和渲染中都能解析,包括 fi、fl、ff、ffi、ffl 这类连字,以及老式西里尔、希伯来、阿拉伯字体使用的 afii 名;字体编码指到这些字形名时过去会给出错误字符,比如 "defined" 被提取成 "deÞned"

Version 2.768.13

Changed

  • 低于 LocalFileMappingThreshold(默认 8 MB)的文件、以及映射关闭或不可用时的所有文件,LoadFromFile 改经 64 KB 读缓冲读取;对象多、又带经典交叉引用表的文件加载快得多,例如 912 页的 PostScript Language Reference Manual 从近 3 分钟降到约 1 秒

Version 2.768.12

Fixed

  • 文本提取现在能摆正 /W 宽度数组不按 CID 排序的 CID 字体(Type 0)的字形;过去大多数字形拿到默认的整 em 宽度,行冲出页边,行尾内容从提取文本和搜索里消失

Version 2.768.11

Fixed

  • 由基本字母加重音符号组合而成的嵌入 CFF(Type 1C)字体字符(许多从 Type 1 转换来的字体都这样构造)现在能渲染了;ü、é 之类的字母过去一片空白,"München" 这样的词中间会断开
  • 嵌入字体的 SVG 导出里,这些字母现在也完整了

Version 2.768.10

Fixed

  • 嵌入 TrueType 字体的组合字形现在按各自偏移摆放每个部件:é、Å 这类带重音的字母过去会丢掉重音符,弯双引号则显示成一个单引号后跟一段空白
  • 嵌入字体的 SVG 导出里,这些字形现在也完整了

Version 2.768.9

Fixed

  • 标了 /Interpolate false 的图像在低于自身分辨率绘制时现在会做平均;过去按几像素取一像素的方式采样,以图像形式放置的图表坐标轴标签发暗带锯齿、细线断裂,而其他阅读器里都是平滑的
  • 放大绘制时,带 /Interpolate false 的图像照旧保留硬朗的像素边缘

Version 2.768.8

Fixed

  • 以不足一像素的描边绘制的文本(文档常用这招伪造粗体)现在按该宽度渲染;过去描边至少整一像素,这类标题显得又糊又比其他阅读器重得多
  • 文本渲染模式 1 和 2 下,嵌入与已安装字体的小字形在填充之后按描边色做抗锯齿描边

Version 2.768.7

Fixed

  • 对已加载文档调用 ProcessObjectStreamsForDecompression 不再丢弃加载时读过的对象流:之后 ExtractRawObjectFromStream 和 ExtractObjectFromStream 照样能读到压缩对象,此前则一个都读不到
  • 方法自行扫描文件时(比如文档带经典交叉引用表的情形),现在能找到紧跟在另一个流后面的对象流,并从其自身字典读出对象数和偏移
  • 对象流缓存已释放时,ExtractRawObjectFromStream 会重新解码该对象流,而不是返回空结果

Version 2.768.6

Fixed

  • Stamp demo 现在能成功构建 Win64 版本

Version 2.768.5

Fixed

  • 在中日韩版 Windows 上,交叉引用流字典里带二进制字符串(比如附件文件校验和)的文档现在不到一秒就能加载;一个带九个 PDF 附件的 4 MB portfolio 过去要开两分钟
  • 解析器现在直接在文件原始字节里找关键字,而不是在经 Windows 代码页转换的文本里找,关键字旁边的二进制数据再也藏不住它、也挪不动它的位置

Version 2.768.4

Fixed

  • Form XObject 内部内容现在按其自身设置的不透明度、soft mask 和混合模式渲染;过去 form 里一切都按完全不透明绘制,半透明的水印和图章都成了实心的
  • 自带不透明度的 form 仍像过去那样整体只合成一次

Version 2.768.3

Fixed

  • 页面文本现在包含页面经由 Form XObject 绘制的文本,比如页眉页脚、水印和图章;过去只返回页面自身内容里的文本
  • form 文本出现在 form 绘制的位置,经 form 矩阵摆放、按 form 自己的字体读取,form 里再嵌 form 也会跟进
  • plain、layout、column、semantic 四种页面文本都适用;字形级提取仍只返回页面自身内容的字形,其位置也指向那份内容

Version 2.768.2

Fixed

  • AES-256 的 EncryptFile 和 DecryptFile 不再损坏字典里 /Length1 写在 /Length 之前的嵌入字体文件(Ghostscript 等工具就这么写);这类字体过去按单字节加密,输出直接没法读
  • 长度存在压缩对象流里的流,经 AES-256 加解密后数据完整;过去这种流的最后一个字节可能丢失

Version 2.768.1

Fixed

  • 流长度存在压缩对象流里的文档(Ghostscript 的写法)现在能完整加载;过去这种文件的每个页面内容流都会被丢弃,页面渲染成空白、也提不出文本
  • 长度指向不存在对象的流、或压根没有长度的流,现在会读到自己的 end 标记为止,不再被丢弃

Version 2.768.0

Added

  • BuildLoadedPageSVG 和 SaveLoadedPageAsSVG 新增可选的 EmbedFonts 参数;默认关闭,既有调用的导出结果与过去完全一致
  • EmbedFonts 设为 True 时,TrueType 或 CFF 程序已嵌入 PDF 的字体,其文本直接按字体自身的字形轮廓绘制,在没有安装这些字体的系统上 SVG 看起来也一样
  • 每个字形轮廓只写一次,字符在哪里出现就在哪里复用,文本密集的页面文件体积也压得住
  • 文本仍以透明文本的形式留在轮廓之上,照样可选、可搜、可被屏幕阅读器朗读
  • 填充、描边、填充加描边的文本,线宽,旋转或缩放的文本,以及用作裁剪路径的文本,输出效果都与渲染页面一致
  • 未嵌入的字体、Type 1 字体程序和竖排 CJK 文本仍按普通 SVG 文本输出

Version 2.767.4

Fixed

  • 未嵌入字体的描边文本和填充加描边文本(文本渲染模式 1 和 2)渲染时现在遵守线宽;过去无论线宽多少,轮廓一律一像素
  • 这类轮廓现在按已安装字体的精确字形、在精确位置绘制,与填充文本早已一致
  • 已安装字体没有、由 Windows 从回退字体取来的字符,描边时同样保持线宽

Version 2.767.3

Fixed

  • 未嵌入字体的文本现在按其编码所命名的字符绘制。过去字符码原样交给已安装字体、由后者按自己的字符集解读,于是每一条 /Differences、以及 StandardEncoding 或 MacRomanEncoding 与 Windows 字符集不一致的码,全都画错字符——比如无编码的 Type 1 字体把弯引号画成直引号
  • 在中日韩版 Windows 上,未嵌入字体里 127 以上的码——重音字母、弯引号、版权符号等——自 2.766.83 起一直画成问号;现在重新按已安装字体的字符集解读
  • Symbol 字体保留自己的码位映射

Version 2.767.2

Fixed

  • 嵌入字体的大字形现在也带抗锯齿渲染。超过 64 像素的字形——打印分辨率下的大标题之类——过去填充时不做抗锯齿,边缘全是锯齿;现在到 256 像素都做抗锯齿,已安装字体的更大文本则继续走系统的抗锯齿文本输出

Version 2.767.1

Fixed

  • layout 文本、column 文本和 semantic 文本提取现在按页面单位度量页面。过去它们拿 Tf 给的字号和文本空间步进来比位置——在大量经由文本矩阵定字号的文档里这只是真实距离的零头——于是 layout 文本把每个字母摊到好几栏、column 文本丢光词间空格、semantic 文本几乎一词一行
  • 三者现在都只返回可见框内的文本,并且像 plain 页面文本那样,把靠移动文本位置隔开的词分开
  • layout 文本会把一个词的字母聚在一起,m、W 这类宽字母过去会在词中间挤进一个空格
  • 单栏页面的 semantic 文本不再每行后面都跟一个空行:连续的整宽行算一个 zone,只有行与行的间隔超过一个行距时,zone 变化才分行
  • 这些方法的帮助页写明了各自的返回内容,column 方法还给出了完整语法

Version 2.767.0

Added

  • LoadFromFile 和 LoadFromStream 新增带 AutoDecrypt 参数的重载。AutoDecrypt 为 True 时,用户密码为空的加密文档(只限制打印、复制或编辑的文档都属于这类)会像阅读器那样以解密状态在内存中打开,不用提供密码就能提取文本、渲染和导出页面
  • 需要密码的文档和未加密文档的加载行为与普通重载完全一致;空密码能否打开文档,会在加载前先从文件的几个小区段判断
  • 与带密码的重载一样,这样打开的文档在内存中不再加密,保存时写出的是未加密副本

Version 2.766.83

Changed

  • 未嵌入字体的小号文本(标准 14 字体、已安装的 Office 和中文字体等)现在从无 hint 的字形轮廓、在精确位置渲染,抗锯齿与嵌入字体一致。过去走的系统文本输出会把每个字形落到整像素上、按像素网格修形,小字间距不匀、看着发糊;渲染出的页面现在与其他阅读器的形状和间距接近多了
  • 已安装字体缺少的字形和大字形仍走系统文本输出,缺字可以由关联字体补上

Fixed

  • 嵌入字体的小字形画得更快:抗锯齿背后的位图现在复用,不再每个字形现建一份

Version 2.766.82

Fixed

  • 渲染页面里以已安装字体绘制的文本现在用灰度抗锯齿。过去跟随系统 ClearType 设置,渲染位图里的黑字带着红蓝彩边,随机器而异,保存、打印或缩放后的图像里也留着

Version 2.766.81

Fixed

  • 嵌入 CFF 和 OpenType CFF 字体的小号文本现在带抗锯齿渲染,TrueType 文本早已如此。这些字形过去填充时不做抗锯齿,小字号加普通屏幕分辨率下,不足一像素的笔画直接消失、正文碎成片段;用 Helvetica Neue 这类字体排的表单和文档在 72 DPI 下终于能看清了

Version 2.766.80

Changed

  • 页面文本提取只返回页面上看得到的文本。落在可见区域——media box 之内的 crop box——之外的字形不再计入,裁切成品之外的印刷标记、slug 行等内容不会再混进提取文本。字形级提取仍返回每个字形及其位置

Version 2.766.79

Fixed

  • 经文本矩阵定字号的文本里,上标抬高或基线微移不再导致页面文本提取断行。过去文本上下移动达到 Tf 字号的一半就另起一行——这类文档的 Tf 常常是 1——挪半个点就够了
  • 旋转文本(沿页面侧边向上的标签、对角线水印等)不再一个字符一行。现在按文本行进方向上的位移、对照页面上文本高度的一半来区分行

Version 2.766.78

Fixed

  • SVG 导出为未安装字体回退到泛型字体族时,现在会先写出该类的常见具体字体:serif 之前是 Times New Roman、sans-serif 之前是 Arial、monospace 之前是 Courier New。浏览器面对光杆泛型族会按自己的语言设置挑字体,中文或日文浏览器挑中的 CJK 字体拉丁字母偏宽,在按 PDF 取来的位置上互相叠字

Version 2.766.77

Fixed

  • SVG 导出现在能为按老 GB2312 名(如 KaiTi_GB2312 或其中文写法)知名的字体写出已安装的中文字体族名。Windows 应用经系统字体替换表找到这些字体,浏览器不会,这类文本过去只能显示成浏览器默认字体
  • 只以单一语言命名的字体也会补上已安装字族的另一语言名(例如 SimHei 连同其中文名),并附一个风格匹配的泛型族

Version 2.766.76

Added

  • THPDFGlyphRecord 新增 GlyphEndX 和 GlyphEndY:字形自身宽度沿基线在页面空间中的终点,不含字符间距和词间距

Fixed

  • 页面文本提取现在能把靠移动文本位置(而不是输出空格字符)隔开的词分开。很多生产器写成 [(PDF)-240(Reference)],或每个词单独用定位操作符摆放,这些词过去会连成 PDFReference
  • 字形自身宽度之后的空隙超过文本高度 0.15 倍时补一个空格;以页面单位度量,经文本矩阵定字号的文本与经字号定尺寸的文本一视同仁
  • 字距微调、略微放松的间距、位置调整找回来的紧凑字符间距、叠印文本和真正的空格字符都保持原样;两个中日韩字符之间,无论两端对齐拉开多远都不补空格

Version 2.766.75

Fixed

  • 文本提取、SVG 导出和渲染现在能识别 Symbol 字体的字形名,如 copyrightsans、registerserif、trademarksans,以及大括号、方括号、积分号等大符号的部件名(parenlefttp、braceex、integralex 等)。子集化的 Symbol 字体常把这些名字重新编码,字符过去直接输出成原始控制码
  • ITC Zapf Dingbats 的全部字形名(a1 到 a206)同样能识别,表单域和项目符号列表常经这些名字挑选的对勾、叉、箭头和带圈数字,现在都能提取成对应的 Unicode 字符
  • 反查字符的字形名时仍然优先常见名(如 arrowright、spade),而不是 ZapfDingbats 名

Version 2.766.74

Fixed

  • HPDFExtractGlyphsViaDevice 不再因无效指针操作而失败。它创建的文本提取设备是引用计数的,函数却又显式释放了一次,于是每次调用都以二次释放收场

Version 2.766.73

Fixed

  • 文本提取现在按规范要求在 Q 处恢复文本状态(ISO 32000-1 9.3.1)。过去只恢复变换,q ... Q 里设的字体、字符间距或行距会一路作用到其后的文本
  • 若 q ... Q 里选的字体用两字节码、外面的一字节码,Q 之后的文本就会被按两字节解读而丢失。Word 及同类生产器写出的页面就是这样,典型症状是目录引导点和中文段落之间的拉丁词消失
  • 页面文本 API 和基于设备的文本提取接口都涵盖了这一修复

Version 2.766.72

Fixed

  • RestoreState 之后绘制的文本现在总会带上字体选择。页面会跳过与上一条重复的字体选择,却没考虑 RestoreState(Q 操作符)会把阅读方带回到 SaveState 之前生效的字体。于是在 RestoreState 之后以配对内所选字体显示的文本,可能没字体或字体错误,阅读器可能直接丢弃,文本提取也读不出来
  • 字符间距、词间距、水平缩放和行距同样跟随 SaveState 与 RestoreState:RestoreState 之后重新设置的值会写出来,而不是一边被跳过、一边阅读方早已回到旧值
  • 选了 Type 3 字体后,下一次再选回先前的字体不再被跳过
  • 转成 PDF 的 XPS 文档正受此影响——每段字形都画在自己的保存图形状态里

Version 2.766.71

Fixed

  • 简单字体(Type 1、TrueType 或 Type 3)的 /ToUnicode CMap 若声明了两字节 codespace——有些生产器对每个字体都这么写——文本提取和 SVG 导出就会把码按两字节读。简单字体的码永远是一字节(ISO 32000-1 9.6.6),于是每两个字符被并成一个未知码,大部分文本就此消失,只剩下零星的单字符

Version 2.766.70

Fixed

  • SVG 导出把 Td、TD、T*、' 和 " 的操作数按页面单位而不是文本空间位移(ISO 32000-1 9.4.2)。字号来自文本矩阵的文本——字处理软件常写的 1 Tf 加缩放的 Tm——所有行都叠在第一条基线附近;现在按 PDF 里的样子排布
  • 内容设备文本提取器 THPDFTextExtractDevice 一并做了同样的修正

Version 2.766.69

Fixed

  • 页面渲染器把带 #xx 转义的字体名原样递给了 Windows,这类名字的未嵌入字体——CJK 字体常见,比如写作汉字的 KaiTi_GB2312——一个已安装字体都匹配不上,只能画成替代字体。转义现在会先解码;合法 UTF-8 的名字保留原字符,其余字节按系统代码页解读

Version 2.766.68

Fixed

  • SVG 导出把带 #xx 转义的字体名原样写进输出,以 UTF-8 字节存放的 CJK 字体名(比如汉字写法的 KaiTi_GB2312)到 font-family 里成了 #e6#a5#b7...,永远匹配不到已安装字体。转义现在会解码;合法 UTF-8 的名字保留,其他编码的字节照旧丢弃

Version 2.766.67

Fixed

  • SVG 导出在 Q 处不恢复文本状态:q ... Q 里设的字体、字号、间距、缩放、行距、rise 和渲染模式会带进其后的文本。靠保存状态里的 2 Tr 加粗标题的页面,后面整段正文都被描得又粗又重。文本状态现在随图形状态一起保存和恢复(ISO 32000-1 9.3.1)

Version 2.766.66

Fixed

  • SVG 导出对描边类渲染模式(1、2、5、6)的文本描边时不带线宽,落到 SVG 默认的一个文本空间单位上;生产器靠细描边加粗的文本(如 2 Tr 0.25 w)出来粗了一大圈。线宽现在从用户空间换算进文本元素的空间,零宽度给一像素线,line join 也保留

Version 2.766.65

Fixed

  • trailer 把 /Encrypt 写成直接字典而非引用的文档(某些 PDF 生成器的产物)会被当成未加密加载:密码给对也一样,页面渲染成空白,文本提取和 SVG 导出两手空空,SaveLoadedDocument 存出的文件更是坏的——丢了 /Encrypt 却留着加密的流。现在这类文档的打开、解密、保存与带间接加密字典的文档一致
  • 交叉引用加载器过去在第一个 >> 处截断 trailer,trailer 里嵌套字典之后的条目就丢了;现在会读到与开头定界符匹配的收尾为止

Version 2.766.64

Fixed

  • 渲染、SVG 导出、查看器和打印都会带上已加载页面整个 /MediaBox。页面的显示和打印应走 /CropBox、再裁到 /MediaBox(ISO 32000-1 14.11.2),带 crop box 的页面于是偏大、偏移,还带着本该藏起来的内容
  • RenderLoadedPageToBitmap、tile/band/metafile/设备上下文各渲染器、BuildLoadedPageSVG、查看器的页面几何/高亮/区域快照以及打印,现在都只覆盖可见框;没有 /CropBox 的页面不受影响

Added

  • THotPDF.GetLoadedPageVisibleBox 返回已加载页面的可见框,即 /CropBox 裁到 /MediaBox 的结果
  • THPDFPageDisplayList.CropBox 对编译好的显示列表给出同样的框

Version 2.766.63

Fixed

  • 内置字形列表的查找上限比整表少了 13 项,排在末尾的字形名(y、z、zero、zeta、yen、ydieresis、zcaron 等)永远查不到。文本提取会无视指到这些名字的 /Differences 条目,页面渲染器则把带 WinAnsiEncoding 或 MacRomanEncoding 的嵌入 CFF 字体里的 y、z、0 画成替代系统字体
  • 反查 U+0060 这类重音符的字形名时,返回的是 MacExpertEncoding 的小型大写名(Gravesmall)而不是 grave,嵌入 CFF 字体里的这些重音符也因此丢失

Version 2.766.62

Fixed

  • 页面渲染器把线宽和虚线长度当成设备像素而不是用户空间单位(ISO 32000-1 8.4.3.2 和 8.4.3.6);线在任何分辨率下都是同样的像素宽,cm 的缩放也被无视。经 macOS Quartz 导出的幻灯片以 EMU 宽度、在 1/12700 的缩放下给形状描边,整个图形被描边色糊满
  • 描边宽度和虚线现在跟随描边路径时 CTM 的缩放,描边类渲染模式的文本也不例外

Version 2.766.61

Fixed

  • SVG 导出过去会漏掉 Type 1 基于函数的渐变(ISO 32000-1 8.7.4.5.2),无论用 sh 画还是用在 shading pattern 里;现在沿 /Domain 对渐变函数采样成一张嵌入 PNG,经渐变的 /Matrix 摆放、裁到 /BBox,底下垫着 pattern 的背景色

Version 2.766.60

Fixed

  • 页面渲染器会把 sh 操作符展示的 mesh 渐变的 /Background 颜色画出来——PDF 规范规定此时应忽略它(ISO 32000-1 8.7.4.5.1)——mesh 周围整个裁剪区都被染成该色
  • 基于函数、轴向、径向 shading pattern 的背景色页面渲染器过去不画;现在先填 pattern 区域再画渐变,渐变没铺到的地方露出的就是背景色
  • SVG 导出如今以同样方式画 shading pattern 的背景色,并且像渲染器一样在 sh 时忽略它

Version 2.766.59

Fixed

  • 页面渲染器过去无视基于函数、轴向、径向渐变的 /BBox(ISO 32000-1 8.7.4.5.1);带延伸的渐变经 sh 绘制或用于 shading pattern 时铺满整个裁剪区,不在自己的框边停下。mesh 渐变早已遵守该框

Version 2.766.58

Fixed

  • SVG 导出过去把 Type 3 字体的文本写成已安装字体的 SVG 文本,用字形过程画文本或符号的页面形状全错;现在会绘制每个字形的 procedure,经字体的 /FontMatrix、字号和文本矩阵摆放(ISO 32000-1 9.6.5)
  • 以 d1 开头的 Type 3 字形按当前填充色绘制,自带颜色的字形保留自己的颜色

Version 2.766.57

Fixed

  • 文本提取和 SVG 导出把 Type 3 字体的 /Widths 当成千分之一 em,但它其实在字形空间里、要按字体的 /FontMatrix 缩放(ISO 32000-1 9.6.5);矩阵为 [0.01 0 0 0.01 0 0] 的字体,字形间距只有应有步进的十分之一,提取文本里的词也因此粘连

Version 2.766.56

Fixed

  • 渲染已加载页面时,所有 Type 0 字体都按 Identity-H 读:每码两字节、一码一个 CID。用中日韩 character collection 预定义的 UCS2/UTF16 CMap(如 UniGB-UCS2-H)或嵌入 CMap 编码的字体,现在会把码映射到 CID,/W 宽度和嵌入字形都按正确的 CID 查找;过去比如 STSong-Light 文本里的小写拉丁字母一个字隔一个全角
  • 码按 CMap 的 codespace 范围读取,一字节和四字节(代理对)码都能完整读出,名字以 -V 结尾的选用竖排

Version 2.766.55

Fixed

  • 渲染已加载页面时,名字带样式段或 PostScript 拼写的未嵌入字体——如 TimesNewRoman,Bold、TimesNewRomanPS-BoldMT、Arial,BoldItalic、SegoeUI-Semibold——会被画成替代字体;现在会拿名字里的家族段去匹配已安装字体(也试词间带空格的形式:Times New Roman、Segoe UI),样式取自名字和字体描述符

Version 2.766.54

Fixed

  • 不带 /Widths 数组的标准字体(ISO 32000-1 9.6.2.2 允许标准 14 字体省略它)在渲染已加载页面、导出 SVG 或提取文本时按固定的半个 em 步进排版,字母挤成一团;Helvetica、Times、Courier 三族——包括写作 Arial、TimesNewRoman、CourierNew 的——现在直接从已安装的 Arial、Times New Roman、Courier New 取宽度,它们的度量本就一致
  • 无 /Encoding 的标准 Type 1 字体现在按其隐含的 StandardEncoding 解码,比如码 39 读作右单引号

Version 2.766.53

Fixed

  • 字体的 /Widths 数组若是间接对象(很多生产器就这么写),渲染已加载页面时会被无视,文本按固定的半个 em 步进排版;现在这类文本按自身宽度排布
  • 以间接对象给出的字体描述符现在渲染时也会读取,未嵌入字体的 ForceBold、Italic 标志和 italic angle 得以生效
  • SmallCap 标志不再把文本加粗:粗体只看 ForceBold 标志(ISO 32000-1 Table 123)

Version 2.766.52

Fixed

  • 渲染已加载页面现在会按渲染模式 4 到 7 的文本建立裁剪(ISO 32000-1 9.3.6):文本对象结束时字形并入裁剪路径,直到图形状态被恢复。过去模式 7 的文本被无视,本该只从字母里透出来的渐变或图像盖满整个区域,模式 4 到 6 则画出文本却不裁剪
  • 裁剪文本与绘制文本取自同一批字形轮廓,嵌入字体和 Type 3 字形都包括

Version 2.766.51

Fixed

  • SVG 导出现在会按渲染模式 4 到 7 的文本建立裁剪(ISO 32000-1 9.3.6):字形从文本对象结束起成为 SVG 裁剪路径,直到图形状态结束,经文本绘制的渐变或图像只在字母内部出现
  • 模式 7 的文本不再消失且什么都不裁;模式 4 到 6 也照旧像模式 0 到 2 那样填充或描边文本

Version 2.766.50

Fixed

  • /Function 是单输出函数数组(每个颜色分量一个)的轴向、径向和基于函数的渐变(ISO 32000-1 8.7.4.5.1),渲染已加载页面时过去画不出来;现在能画了,数组里的函数直接给出或间接引用都行
  • SVG 导出把这类轴向、径向渐变写成 gradient,经 shading pattern 填充路径的情形也包括

Version 2.766.49

Fixed

  • SVG 导出过去把粗体、斜体文本写成常规样式:现在会从字体名的样式段(如 Arial-BoldMT、Helvetica-Oblique、MinionPro-It)以及字体描述符的 weight、flags 和 italic angle 得出 font-weight="bold" 和 font-style="italic"
  • 标准 14 族之外的字体过去把样式段一并写进族名(SegoeUI-Semibold),没有任何已安装字体匹配得上;现在族名单独写出、词间带空格(SegoeUI, Segoe UI),后面跟一个按描述符 flags 或名字选的泛型族

Version 2.766.48

Fixed

  • SVG 导出把 form XObject 的内容画成黑色,而不是 form 绘制处生效的填充色和描边色(ISO 32000-1 8.10.1);form 内部的 Q 现在也会恢复这些颜色
  • 内容设备可通过新增的 IHPDFContentInheritedColorDevice 接口,从调用方的颜色出发绘制嵌套内容

Version 2.766.47

Added

  • SVG 导出对使用平铺 pattern 的路径,现在以 SVG <pattern> 填充:pattern 单元按 XStep 和 YStep 间距重复平铺,裁到单元的 /BBox;过去这类路径被填成黑色或沿用之前的颜色
  • 无色平铺 pattern(PaintType 2)按随 pattern 给出的颜色绘制单元,比如 /CS0 cs 0 0 1 /P1 scn 里的分量
  • 以 shading pattern 填充的路径取 pattern 的轴向、径向或 mesh 渐变,裁剪到路径
  • pattern 矩阵在使用它的页面或 form 的空间里施加(ISO 32000-1 8.7.2),pattern 不会再随当前变换矩阵缩放或移动,q 保存的 pattern 也能被 Q 找回来
  • 内容设备可通过新增的 IHPDFContentPatternDevice 接口接收 pattern 选择

Version 2.766.46

Added

  • 渲染已加载页面时,带色键 /Mask 数组的图像(ISO 32000-1 8.9.6.4)现在会被掩掉:各分量全部落在键范围内的像素不上色,页面从这些位置透出来
  • SVG 导出应用同样的色键掩码,并把这类图像写成带 alpha 通道的 PNG
  • 键与采样值按存储原样比较,Indexed 图像按调色板索引掩——哪怕两个条目同色也分得开——每分量 1、2、4 位的图像也在覆盖范围内
  • 新增 DecodeLoadedImageColorKeyMask 方法,把已加载图像的掩码返回为黑白位图;覆盖 Flate、LZW 和未过滤图像——有损编解码器保不住精确采样值

Version 2.766.45

Changed

  • CompressDocument 和 CompressLoadedDocument 的每个对象流最多装 250 个对象,不再是 100 个;容器更少更大,压缩率更高,字典也更省
  • 已经用对象流紧凑写出的已加载 PDF,再处理一次的产物大小回到与原文件相当,多数还略小一点,不再是略大一点
  • 经 ConfigureAdaptiveObjectStreamPacking 设置的上限保持有效,CompressDocument 会在 EndDoc 时恢复该上限,普通对象流保存仍维持每容器 100 个对象

Version 2.766.44

Changed

  • 带对象流写出的文件,其交叉引用流每一列都采用各自所需的最小字段宽度,16 MB 以下文件里的偏移因此只占 3 字节而不是 4 字节(ISO 32000-1 7.5.8.2),字典本身也写得更紧凑
  • 带交叉引用流但不带对象流的文件保持不变

Version 2.766.43

Changed

  • 带对象流写出的未加密文件,现在把文档 catalog 和文档信息字典也一并打包进对象流,让它们得到压缩;ISO 32000-1 7.5.7 只要求把加密字典排除在外
  • 加密文件照旧把这两个字典放在顶层

Version 2.766.42

Changed

  • 带对象流写出的文件(包括 CompressDocument 和 CompressLoadedDocument 的产物),字典和数组的书写变得紧凑,省去了 PDF 语法不需要的空格和换行(ISO 32000-1 7.2.2);流字典进不了对象流、保持未压缩,从这条改动里获益最大
  • 签名字典和加密字典保留带空格的排版,因此给带对象流写出的文档签名照常工作
  • 不带对象流写出的文件逐字节保持不变

Version 2.766.41

Fixed

  • 带对象流写出的 PDF 文件不再以重复的 %PDF- 头和二进制注释行开头;凡是用 UseObjectStreams、CompressDocument 或 CompressLoadedDocument 保存的文件都曾受影响
  • 查看器容忍重复的头,但严格的校验器可能把它挑出来,而且每个文件还多花 15 字节

Version 2.766.40

Fixed

  • 已加载 PDF 的对象流里若存有裸数字——不少生产器就这样存流长度——现在可以编辑并保存了;此前任何改动都会让保存中止,报 "Cannot rewrite compressed object N: the source member could not be loaded"
  • 这种数字现在按数字读取;此前解析器会越过成员末尾去找间接引用,找不到便放弃,整个成员根本无法加载
  • 不做改动直接保存这类文件不受影响,因为未改动的文件是按原样复制的

Version 2.766.39

Fixed

  • PDF/A-2 及更高版本和 PDF/X-6 文档里的图章注释此前只显示边框,看不到 APPROVED、CONFIDENTIAL 之类的图章名称
  • 名称现在用页面的当前字体绘制(该字体与页面文本一起嵌入),全大写、取注释颜色,在矩形内居中
  • NOTFORPUBLICRELEASE 这类长名称会缩小字号,以适应矩形宽度
  • 这些文档依然能通过 PDF/A 校验;其他文档里的图章照旧写出

Version 2.766.38

Added

  • CompressLoadedDocument 新增带选项的重载,把已加载的 PDF 压到尽可能小而外观不变:丢弃未使用的页面资源、合并相同的字体和表单、对嵌入字体做子集化、用 Flate 重压缩流,并让下一次保存启用对象流
  • 每一步都是无损的,图像不会被重采样或重压缩;一个嵌入了完整 Arial 和 SimSun 字体的三页文档从约 10 MB 降到约 20 KB,另外三个样例 PDF 也缩小了 15-50%
  • 含签名字段的文档默认拒绝压缩且保持原样,因为每一步都会重写已签名的字节;设 AllowSignatureInvalidation 则照样压缩
  • SubsetLoadedFonts 新增 CompactTrueTypeSubsets 选项,默认关闭,为经 identity CID 映射的 CIDFontType2 字体所用到的 TrueType 字体构建紧凑子集;彩色字体和带 /CIDSet 的字体仍走普通子集
  • 无参数的 CompressLoadedDocument 保持原行为,仍只重压缩未过滤的流

Version 2.766.37

Added

  • 新增 CompressDocument 属性,默认关闭:一个开关就让下一个文档以尽可能小的体积写出且外观不变
  • 对该文档,它会打开最高级别的 Flate 压缩、带对象流的交叉引用流(ISO 32000-1 7.5.7 和 7.5.8)、字体子集化和紧凑字体子集;一份中英文混排的三页文档从约 10 MB 降到约 20 KB
  • 对象流需要 PDF 1.5,因此较旧的 Version 会被提升到 1.5,除非版本已锁定;PDF/A-1 输出保留经典交叉引用表
  • 你自己的设置不受影响:EndDoc 之后,Compression、CompressionLevel、UseXRefStream、UseObjectStreams、字体子集化各选项和版本号读回来仍是你设置的值
  • 图像不会被重采样或重压缩

Version 2.766.36

Added

  • 新增 CompactFontSubsetting 属性,默认关闭:字体子集会给保留的字形重新编号,嵌入字体不再为源字体的每个字形都带一个条目;一个显式的 /CIDToGIDMap 流把页面的 glyph 代码映射到重新编号后的字形(ISO 32000-1 9.7.4.2)
  • CJK 字体缩得最狠:SimSun 里两个汉字的字体数据从约 25 KB 降到约 3 KB,一份 Microsoft YaHei 文档从 114 KB 降到 6 KB
  • 适用于开启 EnableFontSubsetting 时按 Type 0 字体写出的 TrueType 字体,也适用于经 RegisterUnicodeTTF 注册的字体——后者此前只有在 PDF/A 下才用紧凑子集
  • 页面内容、字形宽度和文本提取都不变;OpenType-CFF 字体保持普通子集,无法紧凑化的字体同样回退到普通子集

Version 2.766.35

Fixed

  • 注册的 Unicode 字体覆盖到基本多文种平面之外的字符(比如音乐符号或 emoji)时,逐字符显式步进绘制的文本在此类字符之后不再错位。此前每个后续字符都会取前一个字符的步进;现在这个字符按它自己的两条条目之和前进
  • 含这类字符的两端对齐 Unicode 文本框能对齐到框边,该文本的下划线或删除线长度也和文本本身一样长

Version 2.766.34

Added

  • SVG 导出现在把图像掩码(/ImageMask,包括内联的)按当前填充色画成镂空模板:未着色的部分变成透明,而不是画成一张黑白图片
  • 带 /SMask soft mask 或显式 /Mask 镂空的图像导出成带 alpha 通道的 PNG,被遮掉的部分不再盖住背后的内容
  • 掩码或图像掩码上的 /Decode [1 0] 现在会被遵守,比图像更精细的掩码也不再丢细节

Version 2.766.33

Fixed

  • 页面渲染现在遵守图像的显式 /Mask 镂空:掩码覆盖的部分不再着色,而不是整张图都画出来,图像被旋转或镜像时也不例外
  • 掩码上的 /Decode [1 0] 数组会反转哪些部分被保留
  • soft mask 和比图像更精细的掩码按掩码自身的分辨率施加,低分辨率照片上精细的 1 位掩码边缘因此得以保留

Version 2.766.32

Fixed

  • 页面渲染现在按完整的变换矩阵绘制图像:转了 90 度或任意其他角度的图像、镜像图像,以及带 /Rotate 页面上的所有图像,不再被摆正、去镜像后塞进各自的包围盒
  • 图像掩码(/ImageMask true)现在按当前填充色作为镂空模板绘制,缩小时边缘带抗锯齿,不再画成灰度图片
  • 带 /Decode [1 0] 的图像掩码现在按 PDF 规定绘制取值为 1 的采样点
  • 内联图像掩码(BI /IM true)重新能画出来了,其 /D 数组也会被遵守
  • 带 soft mask 的图像在旋转或镜像时保留自己的掩码

Version 2.766.31

Added

  • SVG 导出现在能转换 k/K(DeviceCMYK)以及任意命名颜色空间下 cs/sc/scn 设置的颜色:ICCBased、calibrated、Lab、Indexed、Separation 和 DeviceN 颜色按页面渲染器呈现的样子输出,不再一律变黑
  • 用 cs/CS 选择颜色空间现在会同时设置其初始颜色(比如专色取全 tint),用 Q 恢复图形状态也能带回这样设置的颜色
  • 以引用方式指向 ICC profile、查找表或 tint 函数的颜色空间,SVG 导出期间会经由被导出的文档解析
  • 路径枚举现在报告 CMYK 填充和描边颜色,不再沿用上一个颜色

Version 2.766.30

Fixed

  • THPDFEmfPatcher.RenderEmfDirect 在任意分辨率下都以相同的尺寸和位置绘制增强图元文件的位图。分辨率不是 72 时,位图此前会被额外缩放 72 / 分辨率倍

Version 2.766.29

Added

  • SVG 导出现在应用 W 和 W* 裁剪路径:每条都变成一个 SVG clip path,覆盖其后绘制的内容直到图形状态被恢复,被 PDF 裁剪的图像、渐变和路径不再全量画出
  • SVG 导出中 Form XObject 会被裁剪到其 /BBox,轴向和径向渐变同样裁剪到各自的 /BBox
  • 奇偶裁剪(W*)保留自己的填充规则,与 W 一起绘制的路径按 PDF 规定在新裁剪生效前画出

Version 2.766.28

Fixed

  • DrawChart 画的图表在任意分辨率下都保持版式不变。图表的边距、标题、坐标轴标签和线宽都是点值,此前却随分辨率一起缩水
  • 新建页面以及重新成为当前页的页面,其默认字号在任意分辨率下都是 12 点,而不是 12 个绘图单位
  • 版式诊断叠加层在任意分辨率下保持线宽和标签尺寸

Version 2.766.27

Fixed

  • DrawInlineImage 和 DrawFormXObject 的图像或 Form 尺寸与位置一样按绘图单位解释。分辨率不是 72 时,宽高此前被当成点处理,对象因此画得过大

Version 2.766.26

Fixed

  • 经 CurrentPageNumber 重新成为当前页的页面,继续用它当初排版时的单位绘制。分辨率不是 72 时它会切到点单位,此后画在它上面的东西尺寸和位置全都不对
  • 页面被再次访问时也保留自己固有的页面分辨率

Version 2.766.25

Fixed

  • 文档分辨率不是 72 时,ShowImage 放置的图像在通过 Width 和 Height 定尺寸的页面上保持原大小。144 的分辨率下它们此前只有一半大小,还会偏移
  • 在这类页面上,ExtTextOut 按给定的步进摆放每个字符,而不是只走一半步进
  • 嵌入字形串在这类页面上保留各自的字形偏移和步进

Version 2.766.24

Added

  • SVG 导出现在遵守轴向和径向渐变的 /Extend 条目:不延伸的一端(默认行为)按 PDF 的样子留白,不再把端点颜色铺满整个裁剪区
  • 对径向渐变,只要起点圆不延伸,其内部同样留空

Version 2.766.23

Fixed

  • 压平页面旋转时,注释外观流现在会随页面一起旋转,烘焙或压平后的注释与旋转页面上的样子一致,不再被横向挤进旋转后的矩形里
  • widget 的旋转(/MK /R)会按页面转向调整,压平后重新生成的表单字段外观保持朝向不变
  • 带 NoRotate 标志的注释压平后依然保持直立和原尺寸,钉在左上角,与查看器在旋转页面上的表现一致

Version 2.766.22

Fixed

  • 标记 PDF 上压平页面旋转时,若先遍历到结构树再遍历页面树,注释矩形不再被旋转两次
  • 压平页面旋转不再旋转页面上 Form XObject 的包围盒;它们的几何处在 form 空间里,页面转向已经通过内容变换作用于它们
  • 压平某一页时,属于其他页面的结构元素的版式包围盒不再被改动

Version 2.766.21

Fixed

  • 读取已加载页面的出血框、裁切框或作品框时,不再误取挂在父级 /Pages 节点上的 /BleedBox、/TrimBox 或 /ArtBox;这几类框在 PDF 里不可继承,页面自己没有条目时现在按规范要求报告其裁剪框
  • 压平页面旋转也不再把这个层级的出血框、裁切框或作品框复制到页面上

Version 2.766.20

Fixed

  • 文档分辨率不是 72 时,画在页面 Canvas 上的文本和用 ShowMetafile 放置的图元文件里的文本保持原大小。144 的分辨率下文本此前只有一半大小,而绘制的其余部分却是正确的
  • 在通过 Width 和 Height 定尺寸(以点为单位绘制)的页面上,页面 Canvas 和 ShowMetafile 现在按正确尺寸绘制。144 的分辨率下绘制结果此前会大一倍
  • 页面 Canvas 和 ShowMetafile 也会遵循页面自身设置的页面分辨率,而不是按它把绘制缩小

Version 2.766.19

Fixed

  • 设置了字符间距时,两端对齐的 Unicode 文本框现在能收在框边。此前每个字符都在两端对齐位置之上再加间距,每行都会超出右边缘:超出的量等于间距乘以字符数
  • 带水平缩放的两端对齐 Unicode 文本框重新铺满整个框宽,不再按缩放系数提前收住
  • 词间距现在计入两端对齐行的自然宽度,也就是折行时所依据的那个宽度
  • 逐字符显式步进绘制的文本,无论字符间距或水平缩放如何设置,都落在指定位置上

Version 2.766.18

Fixed

  • 压平页面旋转现在把 /Rotate 90 和 /Rotate 270 的页面按顺时针旋转,压平后的页面与旋转过的原页面看起来完全一致,不再相对它倒置
  • 注释、链接目标和结构几何以同样的方式随页面移动
  • 压平没有 CropBox 的页面不再额外添加一个把页面裁成正方形的 CropBox;只有页面实际拥有的页面框才会被旋转

Version 2.766.17

Fixed

  • 在按本地化名称上报字体的 Windows 系统上,字体回退链现在能找到 SimSun、Microsoft YaHei 这类字体,WideTextOutBox、WideTextOutBoxEx 和 TextOutWithFallback 里的 CJK 混排文本因此用回退字体绘制,不再显示空白方框
  • 自身字体就是其中之一的文本不再被拆成回退串,也不会被未解析字形诊断报为未解析
  • 字体可以用它携带的任意族名(任何语言)列进回退链;Windows 只是用别的字体顶替的那种字体仍会被跳过

Version 2.766.16

Fixed

  • N-up 拼版现在把 /Rotate 90 和 /Rotate 270 的页面顺时针旋转后放进各自单元格;此前转向相反,页面被挤出单元格,经常跑出版面
  • /Rotate 180 的页面现在会在版面上翻转到位,而不是直立拼上去
  • N-up 拼版现在遵循从页面树继承的页面框和 /Rotate,这类页面不再被跳过或按未旋转状态拼版
  • 插入已加载文档的空白页(包括拼出来的 N-up 版面)不再被从页面树继承的 /Rotate 或 /CropBox 旋转或裁剪

Version 2.766.15

Fixed

  • HPDFTokenizeContentStreamAppend 现在能在计数归零后复用 token 数组:上一轮残留的 token 会先被释放,其字符串不再泄漏,其数组项或内联图像数据也不再出现在新 token 上
  • 向同一个 token 数组追加大量小内容流时,数组现在按至少两倍扩容,不再每次追加都重新分配并搬移——此前由成千上万个小流组成的页面因此编译缓慢

Version 2.766.14

Fixed

  • /Rotate 90 和 /Rotate 270 的页面现在按 PDF 规范的定义顺时针旋转渲染,不再沿对角线镜像;此前 90 度页面的左上角会落到右下角
  • 修复覆盖页面和区域渲染、位图、图元文件以及分带 PNG / TIFF 导出,还有 SIMD 渲染后端
  • 查看器的页面到视图、视图到页面坐标换算以及搜索和高亮叠加层遵循同样的顺时针旋转,命中结果和命中测试与渲染出的页面对得上

Version 2.766.13

Fixed

  • SVG 页面导出现在按文档声明的编码把文本写成 UTF-8,带重音字符和 CJK 字符得以幸存,不再变成问号或让文件无法读取的字节;XML 不允许的控制码变成 U+FFFD
  • 当文本矩阵对文本做缩放或旋转时(不少 PDF 生产器就用这种方式设字号),一行中首段之后的文本以及 TJ 字距调整之后的文本现在能放对位置
  • 文字提升和水平缩放现在跟随缩放或旋转后的文本矩阵,TJ 调整也会考虑水平缩放
  • 渲染模式 4 到 6(填充加裁剪)的文本现在会导出而不是被丢弃,不可见文本照样推进文本位置,描边文本保留描边不透明度
  • 词间距不再作用于碰巧等于 32 的双字节编码,连续空格也得以保留,每个字符都待在自己的位置上
  • 连字字形导出其所代表的全部字符,一、双字节编码混用的字体按编码逐个读取
  • /MediaBox 不从原点开始的页面现在能落在 SVG 画布上,不再被移出画布

Version 2.766.12

Fixed

  • 在 THPDFPage.Canvas 上绘图,以及用 ShowMetafile 按位置和缩放把图元文件作为矢量图形回放时,设置裁剪区域不再吃掉左边和上边的一部分。此前每个裁剪区域在这两条边上都会向内挪一个单位,沿左边缘或上边缘的边框或填充因此比右边、底边的同类内容更细
  • 裁剪区域与其填充时的区域现在完全重合,在任意 THotPDF.Resolution 下覆盖同样的面积

Version 2.766.11

Fixed

  • 用 TextOut、UnicodeTextOut、RtLTextOut 和 ExtTextOut 绘制的 Unicode 文本,其下划线和删除线现在恰好与文本等长。此前线宽按转换到系统代码页之后的文本量取,含西里尔、希伯来、希腊、CJK 或其他该代码页之外字母的文本,线不是没画够长就是画过了头
  • 这些线还会跟随字符间距、词间距、水平缩放以及传给 ExtTextOut 的位移

Version 2.766.10

Fixed

  • 报表和网格导出插件(FastReport、QuickReport、ReportBuilder、DevExpress 和 DBGrid)在多个导出同时运行时(比如在服务器上)不再互相覆盖输出。临时文件名此前取自一个最快 10 到 16 ms 才走一格的计时器,同时启动的导出写的是同一个文件

Version 2.766.9

Fixed

  • 设置了字符间距、词间距或水平缩放时,TextWidth 现在按文本实际绘制的方式量取。此前间距不随水平缩放缩放、负的词间距被忽略、行尾空格拿不到词间距,段落接续、链接矩形和居中、右对齐文本因此都放不到画出来的文本上
  • 同一段文本,TextWidth 和 GetWideTextWidth 返回相同的宽度

Version 2.766.8

Fixed

  • ReportBuilder 设备(TppHotPDFDevice)的原生文本现在画在自己的文本框之内。此前文本的位置被当成基线来摆,每个文本对象都低了一行,最后一行跑出了框
  • 居中和右对齐的原生文本按绘制时所用 Unicode 宽度量取,系统代码页之外的字母(比如西方系统上的中文)因此也能正确对齐

Version 2.766.7

Fixed

  • FastReport 导出现在把 memo 文本放进 memo 之内。此前文本位置被当成基线来摆,每个 memo 的文本都低了一个字高,底部对齐的文本干脆画到了 memo 下方,被裁剪藏掉了
  • 顶部、居中和底部三种垂直对齐都从第一行的顶部量起,纯文本和带 HTML 标签的 memo 一视同仁

Version 2.766.6

Fixed

  • FastReport 导出过滤器(TfrxHotPDFExport)重新能编译了。NotEmbeddedFonts 属性读取了类型不符的字段,原生图片导出用到了 TfrxPictureView 并不存在的 Clipped 属性
  • 原生图片导出现在像 FastReport 那样把每张图片裁剪到其视图之内,大于视图的图片不再漫到相邻对象上
  • 居中图片的边框和裁剪保持在视图边界上,只有图像本身居中。此前边框会跟着图像一起跑

Version 2.766.5

Fixed

  • DBGrid 插件现在先按绘制所用的 Unicode 文本宽度量取单元格文本,再裁短以适应列宽。系统代码页之外的字母(比如西方系统上的中文)此前被当成问号来量,文本漫出了单元格;中文、日文、韩文系统上的双字节文本则在单元格远未填满时就被裁短
  • 裁短后不会在 ... 之前留下半个代理对

Version 2.766.4

Fixed

  • DBGrid 插件(TDBGridHotPDFExport 以及 DBGridHotPDFExportToFile/ToStream)现在把单元格文本画在单元格之内。此前文本位置被当成基线来摆,每行文本都坐在单元格下边框上,被下一行的网格线切掉
  • 表头文本在表头行内居中,标题也不再贴着表格顶端

Version 2.766.3

Fixed

  • 在小数点写作逗号的区域设置下,GetLoadedPDFVersionString 现在返回 %PDF-1.7 之类;此前返回的是 %PDF-1,7
  • GetLoadedDocumentReport 的 pdfVersion 字段以同样的方式修复

Version 2.766.2

Fixed

  • HTML 导入(RenderHTML 和 RenderHTML5)在任意 THotPDF.Resolution 下产出相同的页面。CSS 长度和导入器的 Margin、BaseFontSize、ListIndent、BlockSpacing 都是点值,但 144 的分辨率下文本、边距、列表和表格此前只有一半大小
  • 导入前后你自己绘制的文本和图形仍按 1/分辨率 英寸计
  • 默认 72 分辨率下构建的文档输出与从前完全一致

Version 2.766.1

Fixed

  • 用 ApplyXFAAsAcroForm 或 FlattenLoadedXFA 压平的 XFA 表单,在任意 THotPDF.Resolution 下都保留模板给定的位置、尺寸和字号。144 的分辨率下整个表单此前只有一半大小,还缩在页面左上角
  • 压平前后你自己绘制的文本和图形仍按 1/分辨率 英寸计
  • 默认 72 分辨率下构建的文档输出与从前完全一致

Version 2.766.0

Added

  • THPDFPage.UserWidth 和 THPDFPage.UserHeight 以你绘制时所用的单位(1/Resolution 英寸)返回页面尺寸,版式代码因此在任意 THotPDF.Resolution 下都能拿它与坐标、边距和 TextWidth 直接比较。Width 和 Height 仍返回点,既有代码读到的值和从前一样

Fixed

  • THotPDF.Resolution 设为 72 以外的值时,段落现在按边距之间的真实空间换行,到下边距处翻页。此前段落按点量页面,144 下宽边距的段落可能每个字符后都断行,摊到多得离谱的页数上
  • 跨页续排的段落,在任意分辨率下保持相同的页面尺寸、坐标系和字号。144 下续页此前切到点坐标,其上的文本只有一半大小
  • THPDFTable 只有在行到达下边距时才开新页;144 下放在页面下半区的表格此前每一行都独占一页
  • HTML 导入在任意分辨率下按整页宽排布文本,而不是只用左半页
  • 居中绘制的图元文件,以及覆盖整页的图元文件裁剪区域,在任意分辨率下都用满整页
  • 页面图层和已落盘页面的版式诊断按绘图单位报告页面尺寸
  • 默认 72 分辨率下构建的文档输出与从前完全一致

Version 2.765.52

Fixed

  • 含非 ASCII 字符的 AES-256 密码现在能在其他 PDF 阅读器里用了。HotPDF 此前按系统代码页散列密码,而 ISO 32000-2 规定按 UTF-8,中文或带重音的密码因此被其他阅读器拒绝;revision 5 和 revision 6 都已修复
  • 超过 127 字节的 AES-256 密码现在按标准规定截到 127 字节,遵循标准的阅读器因此接受它们
  • 其他生产器生成的、密码含非 ASCII 字符的 AES-256 文件,HotPDF 现在也能打开
  • 早期版本用这类密码加密的文件,在 HotPDF 里仍可用同一密码打开

Version 2.765.51

Fixed

  • 同一字体下、写在 Unicode 文本之后的 ANSI 文本不再显示为空白方框。页面先用 TextOut 画 Unicode 文本、再用同一字型(比如另一字号的 Arial)调 TextBox 或 TextOutBoxEx 时,ANSI 文本此前被写进 Unicode 字体,查看器找不到它的字形;现在它会拿到自己的字体资源,显示和提取都正常
  • 只用 ANSI 文本或只用 Unicode 文本的页面输出与从前一致

Version 2.765.50

Fixed

  • 用 AES-256 revision 6(UseAES256R6,即 PDF 2.0 AES-256)加密的文档现在能在其他 PDF 阅读器里打开。此前每一轮散列都重复使用盐值,owner 侧又漏了 user 条目,qpdf、MuPDF 等阅读器于是两个密码都不认;HotPDF 只认自己写的文件
  • 其他生产器生成的 revision 6 文件,HotPDF 现在能用其 user 或 owner 密码打开,不再报密码错误
  • Security demo 的 AES-256 R6 样例在其他阅读器里也能打开

Version 2.765.49

Fixed

  • 两端对齐的 Unicode 文本框不再把字母撑开、冲出右边缘。按名称选字体(比如 Arial)时,每行两端对齐的文本此前约有框宽的两倍,压住旁边的一切内容;现在每行都收在框边
  • 同样情形下,逐字符显式步进绘制的文本现在落在要求的位置上,不再每个字符都向右多挪一个字符宽

Version 2.765.48

Changed

  • Delphi 和 C++Builder 的 HelloWorld、CJKAnnotations、TextOut 和 RtLTextOut demo 现在只嵌入用到的字形。此前它们嵌入整个系统字体(比如 Arial Unicode MS),一页 hello world 出来约 15 MB,从右到左的样例约 30 MB;同样的页面现在落在 80 KB 到 650 KB 之间,外观不变

Version 2.765.47

Fixed

  • 某些字体下从右到左的文本不再出现字母顺序错乱。Arial Unicode MS 的希伯来文许多单词里相邻字母被对调,Microsoft Sans Serif 的阿拉伯文则完全不做反转,原因是把行排成视觉顺序时,这些字体的字形编号被误认成了变音符号
  • RtLTextOut demo 的希伯来文行现在读起来是对的

Version 2.765.46

Fixed

  • GetWideTextWidth 现在像 TextWidth 一样,把文本绘制时所带的字符间距和词间距计入。设置了间距的自动换行和居中 Unicode 文本此前量出来偏窄
  • TextOutHTML 现在能体现 SetWordSpacing 设置的词间距:它此前按量得的宽度摆放每个 run,把间距漏掉了。HTML 导入的 CSS word-spacing 和 letter-spacing 走同一条排版路径

Version 2.765.45

Fixed

  • SetWordSpacing 现在对嵌入字体也生效。嵌入字体的文本用双字节字符编码写出,而 PDF 只对单字节的空格编码应用词间距,于是只要 FontEmbedding 开着或文本需要 Unicode 字体,间距就被悄悄忽略
  • 间距现在作为文本定位调整加在每个空格之后,所有 PDF 查看器都认;不带词间距的文本写出结果与从前一致
  • TextOut demo 的词间距一行现在能看到多出来的空隙

Version 2.765.44

Fixed

  • Delphi 和 C++Builder 的 AnnotationInteraction demo 现在把每条链接标题放进各自的链接矩形之内。此前文本起点太低,矩形边框从文本中间穿过,文本也比矩形宽

Version 2.765.43

Fixed

  • 删除线文本(fsStrikeOut)的线现在穿过小写字母的中部。此前这条线画在基线之下半行处、压在下划线底下,被删的文本看起来像加了两条下划线;TextOutHTML 里的 <s> 同样受影响
  • 旋转文本的下划线现在落在基线之下,不再贴着字母顶部,删除线也穿过字母本身
  • 在所有文本路径上删除线都与下划线一样粗;Unicode 和纯拉丁路径此前画的线细得多

Version 2.765.42

Fixed

  • HTMLText demo 现在产出单页,五个样例都在上面。此前它会在文档已有的第一页之后又加一页,第一页空着,然后从接近页底的位置开写,实体样例和自动换行段落因此掉出了页面

Version 2.765.41

Fixed

  • Delphi 和 C++Builder 的 Layer demo 现在能看到图层文本了。可见图层的文本此前画成了背后矩形的颜色,根本看不见,隐藏图层的文本则接近白色
  • Patterns demo 的标题现在用黑色绘制,不再拿平铺图案填充——那会把标题撕成一块块图案碎片
  • AlphaTransparency demo 的标题不再用 Multiply 混合模式画成半透明绿色;透明图形现在把透明度留给自己

Version 2.765.40

Fixed

  • Delphi 和 C++Builder 的 GraphicDraw demo 现在能正确画出曲线示例的切线。左曲线的第一条控制点线此前画不到标注点,右曲线则只剩一短横,看不出从起点经控制点到终点的连线
  • 矩形页和椭圆页的小节标题重新变回黑色,不再继承最后画的那个图形的颜色

Version 2.765.39

Fixed

  • PrintHyperlink 之后绘制的文本和图形保留了它之前设置的颜色。此前灰色会变成别的颜色(白变蓝),CMYK 或经颜色空间设置的颜色则回退成更早的 RGB 颜色
  • 超链接颜色现在只作用于链接文本,无论页面当时用的是哪种颜色空间

Version 2.765.38

Fixed

  • 任意 Resolution 下,TextOutOutline 现在都按字号绘制字形轮廓。Resolution 不是 72 时轮廓此前会被再缩一次,比如 144 下缩到一半
  • 每 em 不足 1000 单位的字体(比如 SimHei)的轮廓不再画成好几倍大

Version 2.765.37

Fixed

  • 系统里没有 Arial Unicode MS 时,Delphi 和 C++Builder 的 CJKUnicode demo 现在也能显示朝鲜文行。此前它用找到的第一个中文字体绘制,那种字体没有 Hangul,这一行就一直空着;所选字体显示不了朝鲜文时现在改用 Malgun Gothic

Version 2.765.36

Fixed

  • 用 SimHei 这类字体写中文和日文,字符不再叠成一团。同一字体用于第二段文本时,许多表意字符此前拿到的宽度只有几个单位,而不是整个 em
  • 受影响的字体存的步进宽度比字形少;最后一个存档宽度之后的字形现在沿用该宽度,这正是 TrueType 格式的要求

Version 2.765.35

Fixed

  • 设计网格每 em 不足 1000 单位的字体(比如只有 256 的 SimHei 和 SimSun),其 Unicode 文本间距现在是对的。写入 PDF 的字形宽度此前大约大了四倍,查看器在空格和其他新启用的字符之后留出大片空隙

Version 2.765.34

Fixed

  • PDFOptimize demo 的扫描图像场景现在压缩的是真实的文本页。此前它的 1 位测试图像整个是黑的,CCITT G4 和 JBIG2 是在一块纯色矩形上比较的
  • PDFOptimize demo 的图像场景现在只嵌入页面标签用到的字形,报告的尺寸因此能体现图像压缩方法之间的差距,而不是被整个嵌入字体占了大头

Version 2.765.33

Fixed

  • E-Invoice demo 现在把可见的发票页从上往下排:标题在页面顶部,发票、当事方和金额依次排在其下。此前这一页按倒序绘制,标题挤在底边附近,页脚说明反倒跑到顶上

Version 2.765.32

Fixed

  • 严格无损编码的 JBIG2 图像(Lossless 且 LossyLevel = 0)现在保留每一个像素。默认按扫描噪声剔除小黑点的逻辑此前无视这些设置,本该无损的图像里小号文本的句号和 i、j 的点就这样消失了
  • 面向扫描件的默认配置(LossyLevel = 5 加 RemoveIsolatedBlackPixels)照旧剔除斑点

Version 2.765.31

Fixed

  • 把已加载页面导出为 PNG 或 TIFF 时,在渲染带不是整数个点的分辨率下(比如 SaveLoadedPagesAsImages 对 Letter 页面默认的 150 DPI),不再报 "received too many rows" 失败。舍入让每条渲染带都比计划高出一个像素行,各带加起来因此超出了图像行数

Version 2.765.30

Fixed

  • TextWidth、TextHeight、GetWideTextWidth 和 GetWideCharAdvances 现在按 Resolution 的页面单位回答,也就是文本绘制时所用的单位。Resolution 不是 72 时它们此前按点回答,量出来的文本与放置它的坐标对不上
  • Resolution 不是 72 时,用 TextOut 绘制的文本现在从它的 Y 开始而不是偏高,下划线和删除线以正确的距离和粗度覆盖全部文本,不再只盖住一小段
  • 任意 Resolution 下,TextBox、TextOutBoxEx 和 WideTextOutBoxEx 按真实文本宽度居中和右对齐各行,表格单元格和段落按它换行,TextOutHTML 的带样式 run 也不再互相重叠
  • WideTextOutBoxEx 里的字体回退段在任意 Resolution 下保持字号,不再缩小
  • Resolution 为 72 的输出不变

Version 2.765.29

Fixed

  • Windows 自己算不动 EMF 图元文件的 world 变换时,HotPDF 会自行合并各变换。合并后变换的垂直偏移此前用错了项,这类图元文件里的内容可能上下漂移

Version 2.765.28

Fixed

  • 显示 EMF 图元文件不再往控制台应用的标准输出打印 [WMF_DEBUG] EMR_POLYGON16 record found 之类的诊断行。图元文件跟踪此前在 release 构建里忘了关

Version 2.765.27

Fixed

  • 用 ShowMetafile 显示的 EMF 图元文件里的文本,现在落在 Windows 绘制它的高度上。顶部对齐文本(TCanvas.TextOut 的默认对齐)此前画高了一行,底部对齐的文本也偏高
  • 基线对齐和旋转的图元文件文本不变

Version 2.765.26

Fixed

  • 带位置和缩放的 ShowMetafile 现在把图元文件的左上角画在给定点上,并按要求缩放。此前这两个参数被无视,图元文件总是按原始尺寸画在页面左上角
  • 不带位置的 ShowMetafile 不变

Version 2.765.25

Fixed

  • 用 ShowMetafile 显示的 EMF 图元文件里的 AngleArc 绘图,现在画出它所描述的弧(两个方向都支持),以及从弧的终点继续的连线。此前画出来的是一个整圆,而且只要图元文件带偏移,尺寸就是错的

Version 2.765.24

Fixed

  • PDF/A 和 PDF/X 下,纯 ASCII 内容的 FreeText 注释现在能显示文本了。此前它们的外观只画边框和填充,因为注释默认外观里点名的 Helvetica 在这些标准下不允许未嵌入就使用
  • 文本以 12 pt 用页面当前字体绘制(与页面文本一起嵌入),按注释框换行、按所选对齐方式对齐——非 ASCII 内容此前已经这么处理
  • PDF/A 和 PDF/X 之外,纯 ASCII 的 FreeText 注释写出结果与从前完全一致

Version 2.765.23

Fixed

  • 打开 AutoShapeArabic 后,TextOut 和 UnicodeTextOut 现在把阿拉伯、波斯和乌尔都字母连成首、中、尾形式和连字,与 RtLTextOut 此前已做到的一致。此前每个字母都按独立形式显示
  • AutoShapeSyriac、AutoShapeNko、AutoShapeAdlam、AutoShapeHanifiRohingya 以及希伯来点号重排(ShapingFeatures 里的 sfHebrewReorder)同样如此
  • 开着这些选项时,字形编号碰巧落进阿拉伯或希伯来字符区间的文本此前可能显示成错误字形;现在不会了
  • 用页面字体绘制的 FreeText 注释与页面文本以同样方式塑形
  • 这些选项关闭时的输出不变

Version 2.765.22

Fixed

  • 曲线图形现在尊重 72 以外的 Resolution。Ellipse、Circle、Arc、DrawArc、Pie、DrawPie、Chord 和 ArcTo 此前画的位置和尺寸都不对,直线、矩形和圆角矩形倒是没问题
  • 默认 72 分辨率下的输出不变

Version 2.765.21

Fixed

  • 用 Pie 或 DrawPie 画的扇形现在是单一闭合图形,描边时直边与弧交接处能得到规整的角,不再是两个散落的线头
  • 用 ShowMetafile 显示的 EMF 图元文件里的弓形,现在沿弧两端点之间的直线闭合。此前这条线跑到了离图形很远的一个点上

Version 2.765.20

Fixed

  • DrawArc 和 DrawPie 现在画出其文档描述的那段椭圆:从起点到终点逆时针,与 Windows GDI 的 Arc 和 Pie 调用一致。此前画的是另外半边,四分之一弧出来成了四分之三
  • 用 ShowMetafile 显示的 EMF 图元文件里的扇形、弓形和 ArcTo 弧,两种弧向下都与 Windows 画出的图一致。此前显示的是椭圆的另一段;普通弧本来就没问题
  • 基于角度的 Arc、Pie、Chord 和 ArcTo 方法不变

Version 2.765.19

Fixed

  • 用 RectangleRotate 画的旋转矩形现在是闭合图形,与 Rectangle 画的一样。此前描边时第四条边会漏掉,只描边的旋转矩形因此只显示三条边
  • 填充的旋转矩形,以及旋转文本的下划线和删除线,看起来与从前一致

Version 2.765.18

Fixed

  • 写进生成 PDF 的负数现在舍入正确。-50 这类值此前会写成 -49.99,页面内容、注释矩形等条目里的负坐标、偏移和位置因此可能偏差至多 0.01 单位
  • 负值现在按远离零的方向舍入半位,与正值完全对称;舍入到零的负值写成 0
  • 零和正数的输出不变

Version 2.765.17

Fixed

  • 含中文、日文、韩文、阿拉伯文、西里尔文或其他非 ASCII 内容的 FreeText 注释,现在在每个查看器里都能显示文本。此前它们指望查看器用 Helvetica 画文本,而 Helvetica 只能表示西方字符,Poppler 之类的查看器因此只显示出 ASCII 标点
  • 这些注释现在带自己的外观(ISO 32000-1 12.5.5):文本用页面当前字体绘制,与页面文本一起嵌入并做子集化,按注释框换行(在词之间,无空格文本则在字符之间),按所选对齐方式对齐,并叠在原来的边框和填充之上
  • PDF/A 下同样写出该外观,嵌入字体保证文档合规,注释文本可见而不再是一个空框
  • 纯 ASCII 内容的 FreeText 注释写出结果与从前完全一致

Version 2.765.16

Fixed

  • 用 InsertLoadedBlankPage 插入已加载文档的空白页,现在带上了每个页面都必需的资源字典(ISO 32000-1 Table 30),qpdf 之类的校验器不再把页面树报成损坏,后续也能继续往这页添加内容

Version 2.765.15

Fixed

  • Table demo 里的小计金额现在按预期横跨 Qty 和 Price 两列;此前用错了单元格索引,Qty 列落成了空单元格

Version 2.765.14

Fixed

  • THPDFTable 单元格里的图片现在画在单元格之内并遵循垂直对齐;此前位置低了整整一个图片高度,落到了单元格下方、表格之外

Version 2.765.13

Fixed

  • Unicode 文本宽度(GetWideTextWidth 和两端对齐的量测)现在与字体一致;Arial 之类字体此前量出来大约偏大一倍
  • 建立在这套宽度上的表格、自动换行文本和右对齐、居中、两端对齐文本重新排布正确:短的单元格文本不再换行,右对齐的数值能贴到单元格边缘,表格单元格里的 HTML 文本也不再出现夸张的词间距

Version 2.765.12

Fixed

  • 带复选框或单选按钮的表单,现在会在表单默认资源里列出 ZapfDingbats 字体(/ZaDb)。自己动手绘制这些字段的查看器(AutoFormAppearances 关闭时的默认行为)会到这里查找字体来画勾选标记;此前基于 Poppler 的查看器报未知字体,勾选标记什么都不画

Version 2.765.11

Fixed

  • CJKAnnotations demo 里每种语言那一行的第一个便签图标,现在与本行其余图标对齐;此前放高了 5 个点

Version 2.765.10

Fixed

  • 按英文名请求的字体,现在在其他语言的 Windows 系统上也能找到。此前在中文、日文或韩文 Windows 上请求 SimSun、Microsoft YaHei 或 MS Gothic 会被当成字体缺失,因为 Windows 用系统语言上报字体名,文本被悄悄改用 Arial Unicode MS 排版

Version 2.765.9

Fixed

  • Windows 存放在 TrueType collection(.ttc)里的字体,比如 SimSun、Microsoft YaHei 和 MS Gothic,现在能作为有效的独立字体嵌入。此前嵌入字体的每张表都指向错误的数据,查看器会拒绝并回退到某个系统字体;机器上没有那个字体时,文本显示的就是错误字形
  • 请求的字体缺失、被 Windows 映射到某个 collection 字体的文档同样受影响,比如系统里只有 SimSun 时用 Arial Unicode MS 排版的 Unicode 文本

Version 2.765.8

Fixed

  • 含非 ASCII 文本的源码文件重新保存为带字节顺序标记(BOM)的 UTF-8。没有 BOM 时,Delphi 按编译机器的代码页读取源码,于是在中文、日文、韩文等非西方 Windows 系统上,demo 里的 CJK、阿拉伯文、希伯来文和带重音的文本生成到 PDF 里就成了乱码,库的错误消息也会显示错误字符
  • CJKAnnotations、Annotations、HelloWorld、RtLTextOut、PageSizes、TextOut、Showcase 和 ViewerPref 这些 demo 无论在哪台机器上编译,都能产出预期的文本

Version 2.765.7

Fixed

  • 以 UTF-8 提供的文档信息(Title、Author、Subject、Keywords、文章线索标题,以及搭配 SetLoadedTitle 系列的 SetLoadedDocumentInfo)现在按 Unicode 存储,查看器能正确显示带重音和 CJK 的文本,文档信息也与 XMP 元数据一致
  • 系统代码页编码的文本(比如中文 Windows 上的中文标题)同样能正确存储,因为不是合法 UTF-8 的字节会按该代码页解读

Version 2.765.6

Fixed

  • 新文档的初始视图(InitialZoom)现在写出完整的适宽、适高目标;此前缺少 ISO 32000-1 Table 151 要求的操作数,Poppler 之类的查看器对每个按默认设置创建的文档都报目标数组过短

Version 2.765.5

Fixed

  • 不从第一页开始的页标签区间,现在也会覆盖第一个区间之前的页面,这些页面保留纯数字编号;页标签树必须包含第一页(ISO 32000-1 12.4.2),缺了它查看器可能显示错误的标签
  • SetLoadedPageLabel 现在按页面顺序安放区间,起始于同一页的区间会被替换,查看器因此显示预期的标签;此前新区间乱序追加,还可能重复
  • SetLoadedPageLabel 不再丢弃把标签存放在独立对象里的文档的既有标签,同时也能更新拆分成多个节点的标签树
  • 以 UTF-8 给出的页标签前缀现在按 Unicode 存储

Version 2.765.4

Fixed

  • 以 UTF-8 给出的链接描述(AddURILink、AddGoToLink、AddGoToRLink、AddLaunchLink、AddNamedDestinationLink 以及结构目标链接)现在写成 Unicode,读屏软件和查看器显示的是带重音和 CJK 的文本,不再是乱码
  • 用 AddLoaded...Annotation 方法添加进已加载文档的注释,其文本和作者同样如此,与新文档里创建的注释保持一致

Version 2.765.3

Fixed

  • AddGoToLink 现在能在新文档里链接到之后才添加的页面,第一页上的目录因此可以前向链接;这类链接此前会被无声丢弃,没有任何报错
  • 目标页始终没有添加的链接会保留热区但没有动作,而不是指向一个不存在的页面

Version 2.765.2

Fixed

  • SetLoadedOutlineOpen 现在真能开合已加载文档里的书签;此前它写出的键查看器会直接忽略,书签保持原状态
  • AddLoadedOutline、SetLoadedOutlineURI 和 SetLoadedOutlineDestination 现在作用于请求的那个书签;此前索引一旦大于 0,就会改错书签或者什么都不做
  • 往已加载文档添加书签时,现在会更新其父项、各级祖先和大纲的可见条目计数,查看器不再显示错误的展开状态或条目总数
  • 给已加载书签设置网页链接现在会移除它的页面目标,设置目标则会移除它的动作,因为书签只能二选一
  • 以 UTF-8 传给 AddLoadedOutline 和 SetLoadedOutlineTitle 的书签标题现在按 Unicode 存储,不再是一串乱码字节

Version 2.765.1

Fixed

  • 新文档里的书签现在会记录有多少条目可见,符合 ISO 32000-1 12.3.3 的要求:此前大纲和每个打开的书签把所有嵌套条目都计入,连闭合书签内部的也不例外
  • 子项添加完之后再设置书签的 Opened,查看器里现在会真正打开它;此前这个改动根本写不进文件
  • 给既有书签赋 Title,现在会改变文档里显示的标题
  • 含非 ASCII 文本、以 UTF-8 给出的书签标题现在写成 Unicode,带重音和 CJK 的标题能正确显示,不再是乱码
  • 书签现在带有规范要求的父引用

Version 2.765.0

Added

  • HPDFTokenizeContentStreamAppend 把内容流直接 tokenize 进既有的 token 数组,合并多个流的调用方从此不必为每个流建一个临时数组

Changed

  • 为渲染而编译页面时,不再为内容流里的每个数字和操作符分配内存;页面内容直接 tokenize 进页面的 display list,而不是先整理好再拷贝过去
  • 并行页面渲染在冷文档上的扩展性好得多:在一个 128 页的矢量测试文档上,4 个 worker 现在比 1 个 worker 快约 3 到 3.5 倍(此前 32 位构建约 1.4 倍、64 位构建约 1.7 倍)
  • 单线程的页面编译和渲染在同一文档上也快了约 35%;token、display list 和渲染输出均保持不变

Version 2.764.7

Changed

  • 频繁保存和恢复 graphics state(q/Q)的内容在渲染时不再为每次保存分配内存;正是这些分配让并行页面渲染的 worker 线程在内存管理器里互相等待
  • 128 页矢量测试文档的冷并行渲染,4 个 worker 时快约 7–10%,单 worker 也快约 5%;渲染输出不变

Version 2.764.6

Fixed

  • 页面之前渲染过、display list 还留在缓存里时,并行页面渲染不再退化成一次只渲染一页
  • 此前每一页等待绘制时都握着自己的内存预留,而实际一次只画一页,其余 worker 全部卡在共享内存预算上;现在等待绘制的页面数达到 worker 数之后就会并行绘制
  • 第一页仍然早早出图,一批请求预留的内存现在与 worker 数成正比,不再吃满整个预算

Version 2.764.5

Fixed

  • SetStructureClassMapEntry 现在能把同一个属性字典注册到多个类名之下,或再次注册到同名之下,而不会释放它
  • 此前移除或替换其中一个条目会释放共享的字典,其余 /ClassMap 条目因此指向已释放的内存,保存文档可能写出垃圾数据或抛 access violation
  • 直接创建的属性字典在注册时会变成间接对象,每个 /ClassMap 条目都引用它;字典归文档所有,调用方不得释放

Version 2.764.4

Fixed

  • 当页面的 /Font、/XObject 或其他资源表直接写在 /Resources 之内且其中每个条目都未被使用时,RemoveUnusedLoadedPageResources 不再在移除该表之后还往里写
  • 此前那次写落在已释放的内存上,通常无人察觉,但可能在会话稍后损坏内存或抛 access violation
  • 清空的资源表仍会从 /Resources 中移除,保存输出不变

Version 2.764.3

Fixed

  • 用 PubSecKeyMaterial 经 LoadFromFile 或 BeginIncrementalUpdate 打开公钥(证书)加密的 PDF 时,恢复文件密钥的过程中不再从已释放的内存读取接收方信封
  • 这个故障取决于内存碰巧怎么复用:文档通常能打开,但可能被当成没有分配过密钥材料而拒绝,也可能解开出错误的字节
  • 多接收方文档、接收方选择 callback 和用 AddPubSecKeyMaterial 注册的额外密钥材料,用的都是同一份修正后的信封列表

Version 2.764.2

Fixed

  • 为已加载表单生成的字段外观(出自 AddLoadedTextField 和其他 AddLoaded* 字段方法、EnsureLoadedFieldAppearanceStream 或 FlattenFormFields)现在各自持有 AcroForm /DR 字体的引用,而不是共享 /DR 条目
  • 替换或删除 AcroForm /DR 字典,或移除最后一个表单字段(这也会移除 AcroForm),都不再让这些外观指向已释放的字体对象
  • 此前,事后释放文档可能触发一个隐蔽的 access violation,导致文档剩余部分得不到释放或内存损坏,64 位构建下最常见
  • 直接写在 /DR 里的字体在外观首次使用它时会变成间接对象,于是保存出的文件里字段外观与 /DR 引用的是同一个字体对象

Version 2.764.1

Fixed

  • 在 LoadFromFile 之后调用 ProcessObjectStreamsForDecompression 不再读取加载时已经关闭的文件流,而是改为重新扫描已加载的文件,对象流成员因此仍可供 ExtractObjectFromStream 使用
  • 这个故障取决于内存碰巧怎么布局:通常无人察觉,但可能抛出 access violation 或扫描到无关内存,64 位构建下最常见
  • FindAllObjectStreams、ScanAndLoadReferencedObjects 和 ForceLoadMissingReferencedObjects 在加载之外被调用时现在什么都不做,不再碰那个已关闭的流

Version 2.764.0

Changed

  • 同一个 THotPDF 实例(比如拖到窗体上的一个组件)现在能连续写出任意多个文档:EndDoc 之后调用 BeginDoc 会开始一个全新的独立文档,而不是抛出异常
  • EndDoc 会丢弃已写文档注册过的一切:图片、字体、表单字段、书签、文档级 JavaScript、命名目标、页标签、ICC profile 和 output intent 都在其中;下一次 BeginDoc 释放它的页面和对象,这些内容都不会带进下一个文件。开启 ReproducibleOutput 时,复用实例产出的第二个文档与新实例产出的同一文档逐字节相同
  • 在 EndDoc 与下一次 BeginDoc 之间做的注册,比如 AddPDFAOutputIntent 或通过 Names 添加的脚本,归属下一个文档,不再被 BeginDoc 清除
  • FileName、Compression、PDFACompliance、Author、Title 之类的属性设置,连同页图层和字体回退链,都会延续到下一个文档;为某个文档自动抬高的 PDF 版本会回落到 Version 属性值
  • 写出的文档在 EndDoc 之后到下一次 BeginDoc 之前仍然可用,因此 ValidatePDFUA2Structure、CurrentPageNumber、PagesCount 和布局诊断都能继续在它上面工作
  • 受保护文档一经加密密码就会被清空,所以当 ActivateProtection 仍处于开启状态且没有设置新密码时,BeginDoc 会抛出异常,而不是用空密码去保护下一个文件
  • 在同一实例上改写一个加载进来的文档之后再开新文档,产出的同样是干净的文件

Version 2.763.1

Fixed

  • 转换 EPUB 或用 HTML5 profile 导入 HTML 时,段落排不进当前页面不再有触发 access violation 的风险;段落现在总是绘制到新页面上
  • HPDFRenderHTMLDocument 所用紧凑块渲染器里的段落、列表项和水平分隔线也由同一修复覆盖
  • 这个故障取决于内存碰巧怎么布局,因此只是偶发,64 位构建下最常见,可能让一次转换没有任何输出,或者损坏其内容

Version 2.762.1

Fixed

  • 在已经写出过新文档的 THotPDF 实例上再次调用 BeginDoc 不再以 access violation 收场;它会抛出一个要求换用新实例的异常,因为实例仍然持有已完成文档的对象、图片、字体和表单字段
  • 就算不崩溃,第二个文档也会带上第一个文档的对象,包括它的内容和表单字段;一个新文档配一个实例,才能保证每个文件只装自己的内容
  • 用 LoadFromFile 加载既有文档再改写的做法不受影响

Version 2.762.0

Fixed

  • 文本、自由文本、直线、方框、圆、图章和文件附件注释在 PDF/A-2、PDF/A-3、PDF/A-4 和 PDF/X-6 文档中可见了;此前它们带的是一个只为通过校验器的空外观流,而查看器绘制的正是外观流,结果什么都显示不出来
  • 这些外观现在会真正绘出注释:方框和圆的边框、直线、以注释颜色着色的便签图标和附件图标、图章边框,以及填上背景色的自由文本框
  • PDF 2.0 输出会按 ISO 32000-2 Table 166 的要求,给上述每一种注释、扩展标记注释和新建表单字段都写一个外观流,并写入 /NeedAppearances false;在 PDF/A 与 PDF/X 之外,自由文本和图章名用 Helvetica 绘制
  • 在 PDF/A 和 PDF/X 中,自由文本和图章的外观不绘制文字,因为那里用到的每个字体都必须嵌入;文字仍保留在注释里,由查看器负责显示

Version 2.761.6

Fixed

  • 文件附件注释(AddFileAttachmentAnnotation)现在能在查看器中重新打开和保存:此前文件规范把嵌入文件流本身写成了 /EF 的值,而 ISO 32000-1 Table 44 要求 /EF 是一个字典、把流放在 /F 键之下,于是阅读器报告缺少文件条目
  • 这类附件的嵌入文件流类型标记为 /EmbeddedFile,注释文本同时作为文件的 description 保存

Version 2.761.5

Fixed

  • 命名目标、文档级 JavaScript 和文档附件现在按名称树键的排序顺序写入,符合 ISO 32000-1 7.9.6 的要求;此前按注册顺序写入,在树里检索的查看器可能漏掉条目(qpdf 会报告树未排序)
  • 附加两个同名文件不再生成共用一个键的两条条目而只剩一个附件可达;第二个文件会拿到形如 a (2).txt 的带编号键,并保留原始文件名
  • AddLoadedDocumentJavaScript 和 AddLoadedNamedDestination 的修改现在会保存;此前名称树以直接字典形式存在时编辑结果不会写回,新条目随之丢失。两者都插入排序位置,在拆分成 /Kids 节点的树里也是如此,并且会替换同名既有条目
  • AddLoadedDocumentJavaScript 存入名称树的是 JavaScript action 而非裸脚本流,AddLoadedNamedDestination 会写出其 /XYZ 目标的 zoom 操作数
  • RemoveLoadedJavaScript 和 RemoveLoadedJavaScriptAll 现在把脚本从文档本身移除;此前只有 getter 返回的列表变化,脚本仍留在保存出的文件里
  • SetDocumentAttachmentMetadata 重命名的是传入的那个附件;此前重命名的是树里最后一个附件的键,重命名后的条目现在会移动到排序位置

Version 2.761.4

Fixed

  • 新建 AcroForm 总是在表单默认资源(/DR)里定义字段默认外观字符串点名的 Helvetica 字体,符合 ISO 32000-1 12.7.3.3 的要求;此前未启用 AutoFormAppearances 时缺这个字体,自行构建字段外观的查看器无字体可用
  • AddLoadedComboBox 现在创建真正的组合框;此前设的是 Edit 标志而非 Combo 标志,字段成了列表框,查看器把它显示成所有选项的清单
  • 向已加载文档添加的字段把 /NeedAppearances 写成布尔值 true 而不是名字 /true;为它们创建的 AcroForm 也会带上 /DA 字符串引用的默认外观字符串和默认资源
  • AddLoadedTextField、AddLoadedCheckBox、AddLoadedComboBox、AddLoadedListBox 和 AddLoadedPushButton 为新字段生成外观流,在不构建外观的查看器和表单设 /NeedAppearances false 的文档里字段也能显示
  • 为已加载按钮生成的外观(添加、重绘或扁平化时)现在会绘制标题文字,此前是空白

Version 2.761.3

Fixed

  • 修改已加载表单中文本或选择字段的值现在会重绘字段:SetFormFieldValue、ResetLoadedFormField 和多选列表框的更新都会重新生成外观流;此前保存出的文件在任何查看器里和打印时都显示旧文本,因为查看器画的是外观而不是存储值
  • 密码文本字段生成的外观对每个字符显示一个星号,而不是可读形式的密码(ISO 32000-1 Table 228);启用 AutoFormAppearances 的新字段和被重绘或扁平化的已加载字段都如此
  • AnalyzeLoadedSignatureRevisions 把签名后填写表单新增的外观字典、外观流及其资源归类为表单填写,与字段本身的既有处理一致;在增量更新里填写已认证表单不再被报告为识别结构之外的变更

Version 2.761.2

Fixed

  • 以 Flate 压缩添加的 1 位和 4 位调色板位图保留自身颜色;此前会被重映射到 256 色系统调色板,凡调色板里没有的颜色都会偏移。现在按各自的位深与调色板嵌入,图像数据也更小
  • 调色板把白色排在黑色前面的 1 位位图,在 CCITT Group 3、CCITT Group 4 或 JBIG2 压缩下不再输出成反相,批量和跨页 JBIG2 路径也包括在内;较深的调色板颜色始终编码为黑色
  • icAutoMono 和 AddMonochromeImageAuto 遇到带彩色调色板的 1 位位图时保留在 Flate 上,不再用 CCITT 或 JBIG2 把它变成黑白
  • CCITT Group 3 二维图像(icCCITT32)现在遵循各自的 /K 参数:首行和每隔一行的行按一维编码,/K 写 2;此前每行都按二维编码,而 /K 1 本应完全不允许二维行(ISO 32000-1 Table 11、ITU-T T.4)

Version 2.761.1

Fixed

  • 以 DCT 压缩添加的 JPEG 图像保留自身色彩模型:灰度 JPEG 写成 DeviceGray,CMYK JPEG 写成 DeviceCMYK;此前所有 JPEG 都被声明为 DeviceRGB,灰度文件在查看器里显示错乱或被截断,CMYK 文件颜色不对
  • 带 Adobe 标记的 CMYK JPEG(常见的 Photoshop 输出)会得到采样值所需的反转 /Decode 数组(ISO 32000-1 8.9.5.2 和 7.4.8)
  • PDF/A 色彩空间检查现在把灰度和 CMYK JPEG 图像看作 DeviceGray 与 DeviceCMYK 的使用,而不再是 DeviceRGB
  • StampLoadedPageImage 把 JPEG 盖印到已加载页面上时采用同样的色彩模型
  • PHOTO.JPG、scan.jpeg 这类文件名现在在任何压缩类型下都按 JPEG 加载;AddImage 的文件重载按文件签名识别 JPEG 数据,不再依赖区分大小写的 .jpg 扩展名,也不会再试图把这类文件当位图读取

Version 2.761.0

Added

  • 新增 AddLoadedSignedSignatureField,向已加载文档添加随时可签的签名字段,已签名的 PDF 因此能在增量更新里获得第二个签名(会签或批准)
  • 字段预留的签名空间由 SignPDFWithPFX、PreparePDFForSigning 和 InsertSignatureHex 填入;走完 BeginIncrementalUpdate 和 SaveIncrementalUpdate 后新签名覆盖整个文件,先前的签名仍然有效
  • 可选的原因、位置和联系信息、SubFilter 以及预留签名大小都可以按字段设置;AcroForm 被标记为已签名且只追加,已签文档不会加外观重新生成标志

Fixed

  • BeginIncrementalUpdate 文档里的多签名工作流给出的步骤现在切实可行;旧描述依赖加载后不存在的当前页面,而且签名字段没有预留签名空间,签名因此失败

Version 2.760.1

Fixed

  • DrawQRCode、DrawDataMatrix、DrawPDF417 和 DrawAztec 绘制后按文档说明恢复页面填充色;此前随后填充的图形会带上条码的颜色
  • 这些条码以单条路径绘制,每行内连续的暗模块合并成一个矩形,页面内容因此更小,查看器也不会再在相邻模块之间显出细微接缝

Version 2.760.0

Changed

  • 把 CryptKeyLength 设为 aes256 时,输出版本较低就提升到 PDF 1.7,与其他依赖版本的功能做法一致,文档因此真正用 AES-256 保护。此前默认输出 PDF 1.6 时会无声地改用 AES-128;设置了 StrictVersionLock 时,低版本仍回退到 AES-128

Fixed

  • 保护属性的帮助页此前列出并不存在的权限名;prPrint 和 prPrint12bit 的示例与描述现在与实际选项一致,公钥加密说明也列出受支持的密钥类型

Version 2.759.0

Fixed

  • 签名后的 PDF 现在把整个 /Contents 字符串连同 < 和 > 分隔符一起排除在签名字节范围之外,符合 ISO/IEC 32000-1 12.8.3.3 的要求;此前分隔符被签进去,拿签名值核对字节范围的验证器会报字节范围无效
  • 对携带附带 MAC 的签名做 PDF MAC 校验时,标准字节范围和旧版本写出的字节范围都接受

Security

  • 签名验证会拒绝两个字节范围之间的未签名间隙里除签名自身 /Contents 字符串外还塞了别的内容的文档,堵住 signature-wrapping 缺口——此前签名字节之外的内容会被报告为已覆盖;旧版本生成的签名仍能通过验证

Version 2.758.1

Fixed

  • AttachSignatureFieldAppearance 给未签名签名字段的默认外观重新画出浅灰背景:此前填充矩形缺两个操作数,还在路径内部才设颜色,查看器会拒绝
  • 在新建页面上创建的自由文本注释带上 ISO 32000-1 要求的默认外观字符串,查看器得以排版其文本,而不是显示一个空框

Version 2.758.0

Fixed

  • 内置 JBIG2 解码器现在把文本条里首个之后的每个符号放到 ISO/IEC 14492 规定的位置;此前每个后续符号都往右多偏一个像素,其他编码器产出的 JBIG2 扫描件文字会逐渐散开
  • 由原生算术编码器写出、符号字典只含单个字形的 JBIG2 图像现在能被其他 PDF 查看器读取;此前符号标识符多用 1 位编码(本应不用),那些查看器在第一个字形处就失败
  • 通过 refinement 和 aggregation 组合字形的符号字典按标准间距解码,与其他 JBIG2 解码器一致
  • 共享全局符号字典的 JBIG2 图像把 /DecodeParms 写成与 /Filter 数组对应的数组;此前其他查看器会忽略单个字典、找不到共享字形,这类图像因此无法显示

Version 2.757.0

Fixed

  • DirectDrawBarcode 和 Simple* 系列条形函数现在为每种 symbology 都画出真正的条码;此前大多数只会返回不带数据的均匀交替条纹。GS1-128 code set C(type 22)按其本编码绘制而不再回退到 Code 39,POSTNET 短条按高度的 40 % 绘制
  • DirectDrawBarcode 按页面坐标系缩放条的宽度与高度,文档比例不是每单位 1 point 时条码依然可读
  • 无论 Ratio 设成多少,Code 128、Code 93 和 EAN / UPC 家族都保持 1 到 4 模块的精确元素宽度;此前比例不是 2 就会变得不可读
  • EAN-8、EAN-13、UPC-A 和 UPC-E 只给数据位时自动补上校验位;此前最后一位数据会被当成校验位。启用 Checksum 后 UPC-A 不再丢掉最后一位数据,UPC-E 校验位(同时决定条的奇偶)由展开后的 UPC-A 号码算出
  • MSI 对奇数位数的号码校验位现在正确,POSTNET 编码补上校正位,Interleaved 2 of 5 对奇数长度号码加前导零以保留末位
  • Code 128 A 通过 SHIFT 编码小写字母,不再把它们变成空格或控制字符;Code 39 把小写折叠成大写;Codabar 保留传入的起始和停止字符
  • symbology 无法表示的字符现在会抛出异常;此前 Code 39 和 Code 128 会丢弃或替换它们,Codabar 则会读到字符表之外
  • 启用 Checksum 的 GS1-128 不再在每次测量或绘制条码时往 Text 后再追加一个校验位

Version 2.756.0

Fixed

  • 用 DrawQRCode 绘制或用 THPDFQRCode 构建的 QR 码现在用标准扫码工具就能扫出:格式信息按 ISO/IEC 18004 规定的位置放置,纠错块结构对 10 到 40 的每个版本(以及 7-Q 版本)都正确
  • 自动模式选择把小写文本留在 byte mode,https://example.com 这样的 URL 不会再被编码成大写、读回来也是大写
  • 长度以一两位数字或一个字母数字字符结尾的文本现在能拿到足够容纳它的符号;此前末尾字符会被丢掉
  • 同一个 THPDFQRCode 实例编码两次不再把上一次的符号混进新符号
  • 显式请求的版本太小、或请求的 numeric / alphanumeric 模式装不下数据时,Encode 返回 False,而不是产出被截断的符号
  • 掩码选择采用 ISO/IEC 18004 7.8.3 的类定位图形与暗模块均衡惩罚项
  • 内置条码解码器能读标准 QR 码:带 Reed-Solomon 校验的多块符号、numeric、alphanumeric、byte 和 ECI 分段、UTF-8 载荷,以及带多个对齐图案的版本

Added

  • HPDFQRFunctionMap 和 HPDFQRExtractDataWords 暴露模块布局和带错误检测的块解交织,供读取 QR 符号的代码使用

Version 2.755.9

Changed

  • 影像 soft mask 渲染复用精确的水平采样索引,并在受支持的 Delphi x86 和 x64 目标上使用 SSE2 alpha 预乘,凭借有界的临时存储和标量回退保持像素舍入与取消行为

Version 2.755.8

Fixed

  • 被取消的页面预取释放文档资源后,前台渲染即可恢复,无需等待 worker 线程完成退出;显式取消、替换、重新加载和销毁仍会 join 该线程,无效页面范围也不再泄漏挂起中的 worker

Version 2.755.7

Fixed

  • 页面渲染在图形状态恢复时保留当前路径,并隔离 Form XObject 与 Type3 字形的路径、裁剪和已保存状态,包括畸形的额外恢复操作和取消

Version 2.755.6

Fixed

  • SIMD 矩形渲染器现在遵循复合的 even-odd 与 nonzero 填充规则,保留孔洞、反射子路径方向与小数边缘定位;光栅化期间取消时会丢弃部分位图并正确传播

Version 2.755.5

Fixed

  • 多选表单导入现在会先保留精确的选项值,再解释 XFDF 中的十六进制兼容拼写,防止字面值选中另一个选项,并让存储值与选择索引保持一致

Version 2.755.4

Fixed

  • 从竖排(WMode 1)CID 文本提取文本时,现在按 ISO 32000-1 9.4.4 的位移量移动画笔,字距按规范缩短沿列下行的步长,而不是拉长
  • 竖排文本中的 TJ 位置调整现在沿列上下移动画笔而不是横向移动,提取出的列不再被拆开,阅读顺序保持自上而下
  • 提取期间 CIDFont /DW2 数组按规定的 [v1y w1y] 顺序读取,依赖默认值的字体现在前进一个完整 em 而不是 0.88 em
  • 提取出的竖排字形原点保持在列中心线上,字形框放在竖排原点减去位置向量处,水平分量默认取字形宽度的一半
  • 描述多个连续 CID 的 /W2 列表条目在提取时会把度量应用到该段中的每个 CID,而不是只作用于第一个
  • 页面渲染器和文本提取解释器现在共享同一份字形与 TJ 位移规则实现,渲染位置与提取位置不会再漂移

Version 2.755.3

Added

  • THPDFQCStatementInfo 新增 HasPSD2Statement、PSD2RolesOfPSP、PSD2NCAName 和 PSD2NCAId;CMS 层描述子携带相同字段
  • HPDFParsePSD2QcStatement 解析你手头已持有的 DER 形式 PSD2 statement,并拒绝任何畸形输入

Deprecated

  • PSD2RolesPayer 和 PSD2RolesPayee 为源码兼容保留,但始终为空——规范并未定义付款方/收款方角色列表;请改用 PSD2RolesOfPSP

Fixed

  • PSD2 合格证书 statement 现在按 ETSI TS 119 495 结构读取,报告支付服务商的每个角色及其角色 OID 与角色名称,以及国家主管机构名称和机构标识符;此前真实的 PSD2 证书完全报告不出角色
  • 畸形的 PSD2 statement——包括超长或非最短长度编码、缺失或多余组件、错误的字符串类型以及非法 UTF-8 名称——现在整体忽略,不再部分上报

Version 2.755.2

Fixed

  • 竖排(WMode 1)文本的页面渲染现在按 ISO 32000-1 9.4.4 的文本空间位移前进每个字形:word spacing 不再按字号缩放,也不再加到双字节 CID 码上,因为它只适用于单字节空格码
  • 竖排文本的字距严格按照规范定义沿书写方向应用,设置非零 Tc 的列渲染高度与其他合规查看器一致
  • 不可见文本(渲染模式 3 和隐藏的可选内容)按与可见文本相同的规则推进竖排列,后续可见字形位置保持正确
  • CIDFont /DW2 数组按规定的 [v1y w1y] 顺序读取,依赖默认值的字体现在前进一个完整 em 而不是 0.88 em
  • 竖排字形绘制在竖排原点减去位置向量处,水平分量默认取字形宽度的一半,使列居中于画笔位置
  • 描述多个连续 CID 的 /W2 列表条目现在把度量应用到该段中的每个 CID,而不是只作用于第一个

Version 2.755.1

Fixed

  • ExportLoadedFormToFDF 现在先生成完整的 FDF 主体再创建目标文件,导出中途失败不会再把目标文件替换成残缺文档
  • FDF 流交换扫描器会跟踪十六进制字符串,十六进制值紧贴字典结束符时字段字典保持完整
  • 选择项索引协调用同一个匹配器解码混用的 PDFDocEncoding、UTF-16 和十六进制拼写,等价的导出值能一致地重建 /I
  • XFDF 导入接受以纯字面文本给出的十六进制形式选项导出值,第三方工具写的往返流程恢复可用
  • FDF 导出跳过没有字段名的纯 widget 字段,与 XFDF 导出器及所有导入器的行为一致
  • Delphi Stamp 示例把水印和橡皮图章注释锚定到实际页面尺寸,横向和非 A4 输入上也能正常显示
  • C++Builder DigiPrint 示例会释放图像和每页行列表,初始化表头行距系数,缺少 demo.xml 时给出报告而不是崩溃
  • Win64 ABI DLL 与 codec worker 构建脚本在 RAD Studio 12 及以后版本的 bin64 中定位 dcc64,完整 C++Builder 库构建会检测并清理共享输出目录中的试用残留

Version 2.755.0

Added

  • 已加载的多选 choice 字段现在可以通过 FDF 文件与流 API 以及感知数组的 XFDF 回调交换单个选中值,保留选项边界并在导入时同步选择索引

Version 2.754.6

Fixed

  • SetLoadedFormFieldExportValue 现在走常规的字段值更新路径,保留按钮值类型、选择索引、外观状态、编码字符串和计算变更跟踪

Version 2.754.5

Fixed

  • XFDF 表单值与注释文本元素现在原样保留内容,不再插入格式化空白,包括首尾空格、制表符和换行

Version 2.754.4

Fixed

  • 已加载表单的取值、默认值和最大长度辅助方法现在遵循继承与间接条目;字段重置会保留默认值类型、同步选择项与按钮状态且不改动同级字段;重建的按钮外观保留选中状态和有效渲染边界

Version 2.754.3

Fixed

  • 字段类型为继承时,已加载的命名子字段仍可单独寻址,字段辅助方法能读到继承的类型、标志和选项,移除字段也不会影响同级字段及其 widget

Version 2.754.2

Fixed

  • 重建的已加载 choice 字段外观现在显示 Unicode 选项标签并保留导出值,能渲染未选中的列表项,并按字段值和索引一致地高亮单选或多选

Version 2.754.1

Fixed

  • 更新已加载 choice 字段时,选中项索引现在会与新值保持一致,包括选项导出值和选项列表之外的可编辑条目,且不修改共享的选择数组

Version 2.754.0

Added

  • 新增可选的 HPDFCreateTesseractOCREngine 与 HPDFCreateRapidOCREngine,通过本地识别程序和调用者提供的语言模型处理扫描页,支持 Unicode 文本、单词坐标、超时、取消与输出预算,并接入原有 OCR 文本层事务

Fixed

  • 修复文本矩阵缩放与位移、间接 CID 字体宽度、q/Q 和 Form 裁剪恢复、缩减 JPEG 方向、图像软遮罩与 Indexed 流调色板,恢复相关真实页面的文字布局和图像内容
  • 小型嵌入式 TrueType 填充字形采用局部覆盖率抗锯齿,改善低 DPI 细笔画;OCR 引擎返回失败时优先检查取消,避免把用户取消误报为引擎错误
  • 修复 RenderOutputDither 未实际应用的问题,二值输出现覆盖各渲染后端与并行多页,缓存切换和取消均保持一致

Version 2.753.0

Added

  • SetLoadedFreeTextPlainText 可把受支持的已加载 FreeText 注释显式转换为 ASCII Helvetica 纯文本,并重建其可见外观,完整重写和增量保存都适用

Fixed

  • 已加载页面的转换与保存校验现在会解析间接和继承的页面框,保留共享的页面尺寸,不再把它们替换成 A4

Version 2.752.5

Fixed

  • 页面软件渲染改为分块初始化白底位图并响应取消,避免后台预取收到取消后仍完成整张位图填充;取消的部分位图不会进入栅格缓存

Version 2.752.4

Fixed

  • 修复关闭或重新加载文档时未释放 PDF 对象与内容流造成的持续内存增长,重复引用和共享内容流在关闭时只释放一次,重载前先停止后台预取

Version 2.752.3

Fixed

  • 修复只有一个正常外观状态的复选框在选中或取消后显示状态未随字段值更新的问题,完整重写和增量保存均保持数字及名称导出值对应的外观

Version 2.752.2

Fixed

  • 修复在创建组件后开启可重复输出时,新建文档仍使用当前时间的问题;跨秒保存的明文、AES-128 和 AES-256 输出现在保持逐字节一致

Version 2.752.1

Fixed

  • 修复以十六进制或 UTF-16BE 保存的表单字段名无法按名称查找和修改的问题,分层字段名在解码后正确拼接,完整重写与增量保存均保留修改后的值

Version 2.752.0

Fixed

  • 移动已加载的非 widget 注释现在会保持注释对象身份不变,并把可选的页面引用更新为目标页面

Version 2.751.0

Fixed

  • 删除已加载页面现在会维护命名目标、大纲目标、结构树、父树和注释对象引用,完整重写与增量保存都不再留下可达的空引用

Version 2.750.0

Fixed

  • 完整 PDF 重写会在替换对象流容器之前展开未读取过的压缩对象,保留字体、色彩空间和 ActualText,修复中文乱码、页面外观变化和提取文本变化的问题
  • 用户密码为空的加密文档现在可以直接加载并开始重写;对象流被锁定时则明确报错,不再产出不完整的文档
  • 未修改的数字对象保留源精度,避免重写后出现细微的颜色和透明度漂移
  • 复制的页面保留已校验的资源名和引用,修复间接资源字典错误和错误绑定的图像

Version 2.748.6

Fixed

  • 修复了交叉引用子节声明的条目数超过表里实际数量时,会按声明数带着无数据可读的状态空转一遍的问题——一个 40 字节的畸形文件要花几十秒才能被拒绝
  • 修复了某个操作抛异常时作业运行器丢掉已产出的全部结果,以及 HTML 导入在图片所在的流创建失败时连图片对象一起丢掉的问题

Version 2.748.5

Fixed

  • 修复了 PKCS#12 文件带非 ASCII 口令时打不开的问题:口令本是 UTF-8 字节串,之前却被逐字节加宽而不是先解码,结果每个 ASCII 之外的字符派生出的密钥都是错的;用现代 PBES2 方案保护的文件不受影响,这也是两种文件表现不同的原因
  • 修复了签名批量校验器和吊销证据缓存用无效选项构造时不报自身错误、直接触发访问违例的问题:析构跑在了它要释放的成员创建之前
  • 修复了证据下载任务在参数被拒绝时于析构里出错的问题:检查跑在了线程本身创建之前
  • 修复了云签名提供方编码第二个 arc 超过 39 的算法标识符的问题;畸形标识符现在会抛出提供方自己的错误,而不是转换错误
  • 证书和签名容器现在会拒绝声明长度越过所属元素边界的嵌套元素,被校验的内容和签名实际覆盖的内容不会再各说各话
  • RSA 签名完成后,私钥值会从内存里擦除,不再留在堆上等下一次分配来捡

Version 2.748.4

Fixed

  • 修复了 Type 1 字体加载从字体程序第一行读取所有属性的问题:token 列表没清空就继续填装,版本、字族和字重字符串、stem hints、charstring 密钥长度全都取自过期 token;Type 1 字体现在会报告自己的元数据
  • 修复了 charstring 密钥长度被存成指向已释放字符串的指针、使用时又不做范围检查的问题;现在按值保存,并钳制到格式允许的范围内
  • 修复了非内嵌字体总是退回系统默认字型的问题:请求的字型名被逐字节拷进宽字符字体记录,装好的字族没有一个能匹配上
  • 修复了内嵌 TrueType 和 OpenType 在解码字形轮廓、复合字形参数和 OpenType 容器的 CFF 表时读过截断字体程序末尾的问题;畸形的字符映射也不再申请负长度的字形数组
  • 修复了交叉引用表和流声明对象号溢出的问题:声称接近整数上限的条目会回绕成负索引、写到表外,而声明的对象数或 /Size 远超文件实际容量时,加载器会仅凭这个声明给数组定尺寸

Version 2.748.3

Fixed

  • 修复了 Data Matrix 拒绝合法输入的问题:符号尺寸按数字个数减半来估算,但只有相邻数字才共享码字,像 1a2a3a 这样的文本会选中一个装不下自己数据的符号,然后编码失败
  • 修复了 XFDF 里四字节 UTF-8 字符(比如 emoji)解码成错误代理对的问题;无法识别的字节也不会再吞掉紧随其后的三个字符
  • 增强图元文件的区域记录现在按记录大小约束矩形数量,不再轻信区域头里的计数——那个计数可能引着读取远远越过记录边界
  • 声明的宽乘高超出可寻址范围的 PNG 图像会在文件头阶段就被拒绝,不再分配负长度的像素缓冲
  • 高质量图像重采样遇到超出范围的请求现在会直接报错,不再让中间缓冲的尺寸计算溢出
  • 声称的熵组数超过自身像素数的 WebP meta 前缀图像会被拒绝,不再从几百字节的输入里分配出几百 MB 的前缀表
  • 修复了 Aztec 编码、WebP 位图解码和对象流解码线程池失败路径上的泄漏:后续步骤抛异常时,建到一半的对象会被整个丢下

Version 2.748.2

Fixed

  • 修复了 QR Code 符号丢掉最后几个码字位的问题:模块布置的走格逻辑跳过了最左一列,最后一个纠错块的尾部从来没被写进符号
  • 修复了 QR 终止符用零位填满数据块剩余空间的问题——这会让 ISO/IEC 18004 要求的 0xEC / 0x11 填充码字无处可放;此前版本 1 符号里装的是六个全零码字
  • 新增一个测试把生成的符号从模块里读回来,数据块、填充码字、纠错块、掩码和布置方式全部对照标准本身校验,而不是对照编码器自己的输出

Version 2.748.1

Fixed

  • 修复了三个解析器遇到畸形输入挂死而不报错的问题:对象解析器卡在数组里的 >> 或字典里的 ],CMap 读取器卡在游离的括号或花括号,XFDF 读取器卡在没有标签名的构造(文档类型声明就是一例)或属性之间的游离字节。它们的共同点是光标不再前进,一个意外字节就能把解析变成死循环
  • 修复了 XFDF 里的 CDATA 段被当成标记读取的问题:其内容现在按元素文本处理,段结束标记也量对了,不再吞掉第一个字符
  • 修复了接近 2 GB 的 WebP chunk 长度让大小检查溢出、负载拷贝读过文件缓冲末尾的问题;chunk 长度现在用 64 位算术做范围检查
  • 修复了长度为 0xFFFFFFFF 的 PNG chunk 在缓冲被提前释放后仍按声明长度上报、让后续读取指向已释放内存的问题;超长 chunk 会被拒绝
  • 修复了 CCITT 传真解码在声明页面几何尺寸特别大时行缓冲大小计算溢出、可能写到缓冲外的问题;行存储现在有上界,到界限解码会干净地停下
  • 修复了 CCITT 编码器对 8 的倍数宽度在扫描行末尾多读一个字节的问题
  • 修复了增强图元文件注释记录在 64 位构建下经 32 位截断指针读取的问题:每个带 GDI 注释的 EMF 都会读到一段不相干的地址
  • 修复了调色板条目不足 256 的 8 位图像把未初始化内存当颜色表尾部发布的问题;颜色表现在会声明真实的条目数
  • 修复了深度嵌套的不定长 BER 结构在解析签名或证书容器时耗尽栈的问题;嵌套超过 128 层会被拒绝

Version 2.748.0

Fixed

  • 修复了本库绘制的所有二维条码的纠错:QR Code、Data Matrix、PDF417 和 Aztec 构建生成多项式从常数项往上、除法却按首项在前来做,每个符号带出去的校验字任何合规阅读器都不认。校验字现在与 ISO/IEC 18004、ISO/IEC 16022 和 ISO/IEC 15438 的算例一致
  • 修复了 Aztec 符号丢载荷的问题:编码器原地划分码字数组,调用方发出的也是同一个数组,消息字被除法过程覆盖,符号上既没有数据也没有有效的模式消息
  • 修复了 Data Matrix 生成多项式的根从一个过低的幂次开始的问题,产生的多项式与 ISO/IEC 16022 附录 E 规定的不一致
  • 修复了 Data Matrix finder 图案的问题:实心 L 现在是左列加底行,交替的时钟轨道是顶行加右列,各自在与 L 共享的角落从深色起步;此前两者互换,阅读器无法确定符号朝向

Version 2.747.4

Fixed

  • 修复了已加载文档编辑按系统小数分隔符写 PDF 数字的问题:页面拼接、矩形涂黑、文本和图像 stamp、组合水印形状与椭圆外观现在一律输出小数点,在用逗号当小数点的 locale(比如德语或法语 Windows)下编辑过的文档不再含有会被查看器拒绝的内容流
  • 修复了 Type 1 字体加载依赖系统 locale 的问题:FontMatrix、BlueValues、stem hints 和 charstring 实数现在按带小数点的 PostScript 数字解析,PFB 字体在逗号小数点的系统上也能保住自己的度量和轮廓,不会再悄悄坏掉
  • 修复了默认外观(/DA)字号和颜色解析、HTML width 与 size 属性、FormCalc 结果和 job JSON 数字跟随进程 locale 的问题;现在读和写两个方向都统一用 invariant 格式
  • 修复了内置条码绘制经依赖 locale 的格式写条形矩形的问题,在逗号小数点的系统上会产出无效内容流
  • Free Pascal 构建现在也用 invariant 格式解析和格式化内容流操作数、文本提取度量和 JavaScript 数字,与 Delphi 构建保持一致,不再退回依赖 locale 的转换
  • 数字写出器不再在每次调用时改写宿主应用程序全局格式设置的小数分隔符——那会改变程序其余部分格式化自己数字的方式,而且在多线程同时产出文档时不安全

Version 2.747.3

Fixed

  • 修复了压缩页面上的编辑凭空消失的问题:矩形涂黑、页面拼接、组合水印形状和注释扁平化把操作符追加到了仍处于压缩状态的页面内容流上,涂黑条、拼进来的页面、水印形状或烘焙后的注释在保存出来的文件里悄然缺席。现在追加任何内容之前都会先展开页面内容
  • 修复了页面不以空白结尾时,追加内容与页面上最后一个操作符粘连的问题——会产生 Q0.5 这类读不出来的 token,查看器可能因此拒绝整页;现在需要的地方会插入行结束符

Version 2.747.2

Added

  • 新增 Free Pascal 的 Win32 架构支持:Lazarus 软件包现在经专用构建入口可同时构建 i386-win32 与 x86_64-win64 两个目标,冒烟套件接受架构参数;修复 32 位编译及 C 符号链接兼容性,支持 PDF 创建、加载、Flate 压缩、AES 加密和 CBZ 文档处理

Version 2.747.1

Fixed

  • 修复了内置条形码解码器旋转掩码重试的一个缺陷:旋转掩码里未被触及的单元格会残留旧字节,凭空画出幽灵墨点,旋转 90° 拍摄的 Code 39 符号因此读不出来;现在旋转缓冲区会显式清零,转了向的 Code 39 照片和扫描件都能走旋转重试正常解码

Version 2.747.0

Added

  • 新增 WebP 图像导入:AddImageFromFile 现在通过内置的无损(VP8L)解码器接受 .webp 文件,完整实现 RFC 9649——规范前缀码、空间元前缀码、带邻域距离映射的 LZ77 后向引用、color cache,以及全部四种逆变换(predictor、color、subtract-green、带像素打包的 color indexing);有损 VP8 帧会被明确拒绝并给出清晰提示

Version 2.746.0

Added

  • 内置条形码解码器现在能读任意八个朝向的 QR 符号,照片或扫描进来的页面怎么摆都能处理:finder 图案定位缺失的角,采样的模块矩阵在解码前先旋转或镜像到预期布局,旋转 90° 和镜像的拍摄件不用预处理就能读出

Version 2.745.0

Added

  • 为已加载签名新增 eIDAS 合格证书评估:GetLoadedSignatureQCStatements 报告签名者证书的 ETSI EN 319 412-5 QCStatements——QcCompliance、QcSSCD、QcType 值、QcLimitValue 的货币/金额/指数和 PDS 位置,外加 TS 119 495 的 PSD2 付款人与收款人角色;当 QcCompliance 和 QcSSCD 同时声明时会给出合格签名启发式判定(是否信任该 QTSP 仍由调用方决定)

Version 2.744.0

Added

  • 为已加载文档新增 N-up 拼版:ComposeLoadedPagesNUp 把每一页重排到按源纸张尺寸网格拼合的版面上(2-up、4-up、6-up,最多 16x16),输出可直接送印,会把每页的 /Rotate 吸收进放置矩阵,与拼合后的 Form 共享页面资源,并可选绘制细线单元格边框,网格间距可调

Version 2.743.0

Added

  • FlattenLoadedAnnotations 现在会烘焙没有 appearance stream 的注释,而不是悄悄跳过:widget 先从字段值生成字段外观(浏览器打印表单里常见的 /NeedAppearances 情况),用户输入的值因此能保留到页面内容里
  • 没有 /AP 的标记类注释会按自身属性合成外观——FreeText 和 Stamp 文本带 /DA 样式与 /Q 对齐方式,Square 和 Circle 形状带 /C / /IC 颜色与 /BS 线宽,Line 和 Ink 笔迹,以及遵循 /QuadPoints 和 /CA 不透明度的 Highlight / Underline / StrikeOut / Squiggly 四边形标记
  • 隐藏注释(/F hidden 标志)没有外观时保持注释原样不动——把不可见的备注烘焙进页面反而会让它显形

Version 2.742.0

Fixed

  • 修复了 Free Pascal 包自 2.738.0 起编译失败的问题:LTV evidence 和 seed value 的成员声明放在了仅 Delphi 的条件编译块里,实现却是无条件的,Free Pascal 包因此编译不过;现在实现也带上同样的条件编译,包恢复可构建

Added

  • HTML 导入现在在完整的占位网格上解析表格,rowspan 和 colspan 单元格能正确占住各自的列,后续行跳过被占的槽位而不是整体左移
  • 表格行高改为用单元格自己的字体对文本排版来测量,不再按字符数估算,宽窄混排的内容不会再撑出溢出或虚高的单元格
  • 列宽遵循 <col> 宽度提示和逐单元格的宽度属性;用 <thead> 标记的表头行(或开头的全 <th> 行)在表格跨页时会在每个续页顶部重复
  • rowspan 组跨页时保持完整:被跨行单元格串起来的各行会一起移到下一页,跨行单元格不会被拦腰切断

Version 2.741.0

Fixed

  • 修复了 Free Pascal 构建在文档用到未链接 codec 时直接终止进程而不报错的问题:打开 TIFF、解码 JPEG 2000 或 JBIG2 图像、读取渐进式或缩尺 JPEG、应用 ICC 色彩变换、请求 Zopfli 重压缩,任何一种都会直接把进程干掉
  • 这些操作现在都按调用方本就预期的失败方式返回,用到其中某个特性的文档会跳过该特性继续加载,而不是把整个应用带崩

Added

  • 新增结构顺序文本提取:ExtractLoadedPageStructureText 按创作顺序(ISO 32000-1 14.8.4)遍历文档结构树,按 MCID 串接页面的 marked-content 序列,政府表单、无障碍出版物这类 tagged 文档由此提取出权威阅读顺序,而不是靠几何位置猜;结构树没认领的字形落到几何尾部,并计入未标记报告

Version 2.740.0

Fixed

  • 修复了 Free Pascal 构建下彩色字形丢失透明度的问题:内嵌彩色位图走的读取路径会丢弃 alpha 通道,每个 emoji 或彩色字体字形都被画成不透明矩形;位图现在保留逐像素 alpha

Fixed

  • P-384 ECDH 密钥协商可用了:CIOS Montgomery 乘法最后的条件减法拿 P limb 加 borrow 来比较,在 P-384 / P-521 素数全 1 的高位 limb 上会回绕成零并悄悄借错位;现在比较逻辑不靠溢出加法也能检测借位,P-384 共享密钥与 OpenSSL 参考向量逐字节一致

Version 2.739.0

Added

  • Free Pascal 构建现在能加解密文档:AES 入口改由库自己的 FIPS-197 实现承担,不再报不支持操作,AES-128 和 AES-256 保护的文件在那里都能创建和打开
  • AES-GCM 加解密(包括大载荷用的流式上下文)在 Free Pascal 构建中也可用
  • Free Pascal 冒烟测试现在会用 FIPS-197 已知答案校验密码算法,跑 PKCS#7 和 GCM 往返,并创建再重新加载一份 AES-256 保护的文档,同时验证错误密码会被拒绝

Added

  • HTML5 导入引擎新增 CSS2.1 段落排版:text-align(含旧式 align 属性和 center 标签映射)、经 PDF Tc / word-space 操作符实现的 letter-spacing 和 word-spacing、首行缩进的 text-indent,以及 text-decoration 的 underline / line-through 规则,网页和邮件 HTML 导入的居中标题、缩进和下划线都能保留
  • 内置 QR 解码器扩展到版本 1 以上:符号版本现在通过网格整除性从 finder 几何推导(模块网格规整的版本 2-40 可解码),byte 模式长度上限遵循 ISO/IEC 18004 表 7 的逐版本容量,function-module 映射覆盖了高版本符号的 alignment pattern 和版本信息块

Version 2.738.0

Added

  • Free Pascal 构建现在原生支持文档压缩和解压:deflate codec 由内置后端基于 Free Pascal 自带的 Pascal zlib 实现提供,FlateDecode 内容不再报不支持操作
  • 在 Free Pascal 下用默认压缩设置即可创建压缩文档并重新加载,交叉引用流、对象流、嵌入文件和压缩页面内容在那里都能解码
  • 该后端覆盖 zlib 和裸 deflate 封装、gzip 封装及自动头部检测,SVG 导入和多窗口尺寸解压 fallback 的行为与 Delphi 下一致
  • Free Pascal 冒烟测试现在通过封装与校验和自测加一次压缩文档往返来验证 codec

Added

  • 新增 AIA caIssuers 证书链补全:HPDFFetchAIAIntermediates 通过调用方提供的传输访问 CMS 证书集的 access-method 1.3.6.1.5.5.7.48.2 端点(裸 DER 和 PEM 正文都能解码),FetchMissingIntermediates 验证选项把取回的中间证书喂给路径构建,只带一张终端实体证书的云端签名由此能通过验证,不再卡死在路径构建上
  • 新增一次调用启用 LTV:PopulatePAdESLTVEvidence 遍历每个已加载签名,在线取回中间证书和 OCSP/CRL 证据并写入文档 DSS,把新签的 B-B 签名文档升级到 B-LT,不用再手工拼证据数组
  • 新增签名时的 seed value 强制检查:CheckLoadedSignatureSeedValue 读取签名字段的 /SV 字典,按 ISO 32000-1 12.7.5.5 的 force 位语义把候选 SubFilter、DigestMethod、Reason 和 DocMDP profile 逐项对照约束,表单作者设的约束在落签名之前就会被执行

Version 2.737.0

Added

  • 通过 VerifySavedOutput 属性新增严格保存校验:写完之后用一个禁用交叉引用恢复的全新 reader 实例重新加载文件,序列化损坏会在调用点当场抛出,而不是等到下一个消费方才暴露
  • ReproducibleOutput 扩展到加密文档:AES-CBC 流采用固定的 14*(1+i) IV 约定,密钥材料和盐值确定性派生,规范化的文档 ID 会归一化易变的 Info 时间戳,回归流水线拿到的加密保存结果逐字节一致

Version 2.736.0

Added

  • 通过新的 HPDFResample 单元新增高质量重采样和单色抖动:图像降采样改用可分离的 Catmull-Rom 双三次和 Lanczos3 核(经 ImageDownsampleKernel 属性选择),取代 GDI 拉伸语义;RenderOutputDither 在页面合成后应用 Floyd-Steinberg 误差扩散,打印预览输出在纯黑白下也能保住照片细节

Version 2.735.2

Fixed

  • 修复了 Flate 解压流从源流补数时传的是缓冲区变量的地址而不是缓冲区本身的问题,每次读取都会损坏内存,还可能把进程带崩;加载压缩文档、inflate 流类以及压缩/解压流辅助类都受影响

Version 2.735.1

Fixed

  • 修复了不挂数据源的可增长 XFA 字段在扁平化时被压成单行的问题:这类字段显示的就是模板自己声明的文本,高度现在按这段文本来量;绑定空数据的字段仍按空测量

Version 2.735.0

Added

  • Free Pascal 构建现在覆盖整个库:所有单元都能用 FPC 3.2.2 和 Lazarus 编译,此前只有核心的创建和加载路径可以
  • XPS、EPUB 和 CBZ 容器可在 Free Pascal 下导入,靠的是内置只读 ZIP reader,支持 ZIP64 尺寸、stored 和 deflate 条目、CRC 校验以及传统加密条目,密码回调与 Delphi 路径一致
  • XFA 表单扁平化、FormCalc 计算引擎、widget 运行时、文档查看器组件、Type 1 字体处理器、HTML 导入、签名验证和 job runner 都能在 Free Pascal 构建中编译;扁平化已加载文档的 XFA packet 还需要 deflate codec,这类构建没有链接它

Fixed

  • 修复了 PNG 辅助单元的 64 位字节序交换在 Win64 上返回错误值的问题,该单元此前也因此完全没进构建

Added

  • 新增绘制时的缺字检测:TrackUnresolvedGlyphs 属性记录所有会用当前 Unicode 字体画成 .notdef 豆腐块的字码点,每发现一处触发一次 OnUnresolvedGlyph 事件,未注册的纯 GDI 文档不受影响
  • 新增传统 kern 表支持:RegisterUnicodeTTF 会捕获 Apple/GDI 时代的 kern 表,字体没有 GPOS kern lookup 时字距输出回退到它的 format-0 二分对查找,原版 Arial 这类字体的经典字对间距得以恢复
  • 段落布局内部新增逐 run 字体 fallback:WideTextOutBox 现在会在当前字体映射不了的字码点处拆分每个换行行,各 run 用各自解析出的 fallback 字体绘制,注册了 fallback 链之后拉丁、emoji、CJK 混排段落不会再出豆腐块

Version 2.734.0

Added

  • 新增 RFC 3161 时间戳请求的配套管线:HPDFRFC3161BuildRequest 生成带新鲜正 INTEGER nonce、可选 policy OID 和 certReq 的 DER TimeStampReq,HPDFRFC3161ParseResponse 解码 PKIStatusInfo 头并取出 token,TSA 传输回调从此三行搞定,不用再啃 DER
  • 新增 ISO/TS 32002 开发者扩展声明(THotPDF.EnsureISO32002Extensions),覆盖 PDF 2.0 文档中的 EdDSA 签名算法和新增 ECDSA 曲线,与 32001 的 SHA-3 声明一样幂等且受版本门控

Version 2.733.0

Added

  • 新增可移植的 X25519 和 X448 Montgomery 阶梯密钥协商,以及基于 CIOS Montgomery 乘法的 P-256 / P-521 NIST 曲线 ECDH,key-agreement(KARI)公钥接收方的创建和解包全程在进程内完成;RFC 7748 和 OpenSSL 生成的参考向量把阶梯运算行为锁进了回归套件
  • 新增 HPDFUnwrapKeyAgreementRecipientEnvelope,以及 AddPubSecAgreementKeyMaterial 和 AddPubKeyAgreementRecipientWithSecret 入口,用 ECDH / X25519 / X448 接收方加密的文档可以拿接收方私钥标量打开,加密也不再依赖外部 ECDH 工具

Version 2.732.0

Changed

  • 保存现在把序列化输出改走 1 MiB 缓冲写流,对象头、字典键和 xref 行的逐 token Write 调用合并成文件目标上的批量推送
  • 交叉引用流载荷在 FlateDecode 前先应用 PNG Up 预测(/DecodeParms /Predictor 12),并通过 /Index 子节收敛空闲链表空洞,所有 PDF 1.5+ 文档和稀疏对象区间的 xref 容器都变小
  • CompressionLevel 属性现在也控制交叉引用流和对象流容器的 Flate 压缩力度,clMaximum 下保存时的结构性流更小

Fixed

  • 交叉引用流的 /W 字段宽度现在按实际偏移范围自适应,不再固定用 [1 4 2] 布局——那种布局的 Cardinal 强转会把超过 4 GiB 的偏移悄悄截断,产出损坏文件

Version 2.731.0

Changed

  • 重建了内置模板匹配 OCR:连通域字形提取、对照缓存多字体模板的灰度覆盖评分、带局部窗口回退的 Otsu 二值化、双峰间隙分词、逐词基线、斑点噪声剔除,字符表扩展到 62 个,通过行级高度聚类和大小写上下文偏好识别大小写混排的 ASCII 文本

Version 2.730.0

Added

  • 新增 Free Pascal 3.2.2 和 Lazarus 4.6 的 Win64 支持,包括运行时包、可复现构建脚本、兼容层和非 GUI 的创建-重载冒烟测试;原生静态 codec 集成仍仅限 Delphi,在 Free Pascal 构建中会明确报不支持操作

Version 2.729.0

Added

  • 新增宿主中立的动态 XFA widget 运行时,带 Unicode 编辑、焦点与命中测试、实例感知绑定、原子化的校验和计算、有界重排,以及保留源 XFA 的只读已加载文档工厂

Version 2.728.0

Fixed

  • 修正了 XFA 固有测量和文本续排:保留显式空值和计算值,使用各自字段或重复行的绑定上下文,保留 breakAfter 动作,避免合成名称冲突,并强制执行缓存的全局测量预算

Version 2.727.0

Changed

  • XFA 布局现在应用固有的最小和最大尺寸,从绑定文本测量可增长字段,并把符合条件的 textEdit 内容原子化拆分到多个内容区和页面,续排字段只读,文本、片段和测量的预算都有上限

Version 2.726.0

Added

  • 新增完整的 NChannel process 与 spot 属性、混色提示、有界的 PDF 2.0 CxF/X-4 光谱油墨流,以及针对 spot tint 定义和外部 output-intent 着色剂表的文档级一致性检查

Version 2.725.0

Added

  • 新增线程安全的确定性 SIMD 扫描线渲染后端:先对受支持的矩形 display list 做 preflight,再按向量块直接写最终位图表面、不做中间位图拷贝,拒绝时经现有软件 fallback 和遥测管线返回逐请求的精确原因

Version 2.724.0

Changed

  • 扩展了有界原生 FormCalc 求值器:支持通用 SOM 节点集聚合、标量与节点集混用参数、嵌套的数值和字符串调用,以及确定性的选择、字符串、三角、对数和转换函数,仍在既有操作数、数组、深度、时间和输出预算之内

Version 2.723.0

Changed

  • SubsetLoadedFonts 现在能安全子集化内嵌的 Type 1 PFB 以及拆分的二进制和十六进制 PFA 程序,保留递归 TrueType composite 依赖,并完整闭合 COLR v0/v1 的轮廓依赖,同时保留颜色、位图、变体和 shaping 表

Version 2.722.0

Added

  • 为传统 ZIP 加密的 XPS、EPUB 和 CBZ 条目新增有界密码回调,包括逐条目重试上限、取消检查、仅内存的凭据处理,以及对不可用、无效或不支持加密的 fail-closed 拒绝

Version 2.721.0

Changed

  • DownsampleLoadedImages 现在直接在分量空间缩放受支持的 8 位 Separation 和 DeviceN 图像采样,并在保存和重载之后保留原始色彩空间图、tint transform、着色剂、/Decode 范围和叠印语义

Version 2.720.0

Added

  • 新增有界的内置识别重载,覆盖高对比度大写 ASCII OCR、水平 Code 39 以及干净的轴对齐 QR 版本 1 byte 模式符号,无需调用方提供引擎即可生成可搜索文本层和解码已加载页面上的条形码;含糊或不支持的输入一律 fail-closed

Version 2.719.0

Added

  • 通过 THPDFJpeg2000Decoder.LoadProgressiveFromByteArray 新增按分辨率和质量层的有界 JPEG 2000 精化,另经 TJpeg2000Bitmap.QualityLayers 支持多层编码,LRCP、RLCP、RPCL、PCRL、CPRL 各种渐进顺序的最终像素完全一致

Version 2.718.0

Changed

  • 内嵌完整的 UniJIS、UniGB、UniCNS、UniKS 的 UCS2 和 UTF16 横竖排 CMap,含增补标量和标准竖排默认值,CJK 文本提取和几何度量不再依赖外部 Unicode 映射文件或半个 em 的瞎猜

Version 2.717.0

Added

  • 新增显式的 linearized 共享对象依赖区间和区间到达重绘调度器,页面可以在可选依赖到齐之前先绘制,新到的数据真正改变结果时才精确重绘

Version 2.716.0

Added

  • 针对 xref、trailer、catalog、页面树和名称树的可执行 preflight 发现,新增有界对象图修复:事务提交经过验证,输入不安全或含糊时完整回滚

Version 2.715.0

Added

  • 新增 PDF 2.0 encrypted payload 封装:认证之前可见的文档内容仍可读,而嵌入文件的名称、描述和字节保持受保护状态,直到显式输入密码解锁

Version 2.714.0

Changed

  • 已加载页面的 SVG 导出现在会输出轴向和径向渐变、Type 4 到 Type 7 mesh shading 的有界 PNG 表示以及解码后的内联图像,对应的跳过计数器不再增长

Version 2.713.0

Changed

  • OpenType SVG 彩色字形现在改走有界的 Form XObject 管线来处理圆弧、矢量渐变、不透明度、几何遮罩和本地 #id 复用,脚本、外部资源、图像和不受支持的活动内容依旧拒绝

Version 2.712.0

Changed

  • ReplaceLoadedPageText 现在能通过字形源跨度替换横跨 TJ 字符串项和数组的匹配,同时保留字距数字、未匹配的前后缀、无关操作数和原始内容流结构

Version 2.711.0

Added

  • 新增 CFF FontSet SyntheticBase 解析:继承 Top 和 Private DICT 值、CharStrings、charset、Encoding 和 Local Subrs,覆盖语义是确定性的,无效、成环或过深的继承会被有界拒绝

Version 2.710.0

Added

  • 通过 HPDFSelectFlatePredictor 新增确定性的有界 Flate predictor 选择:用分布式行采样、估算字节成本、可配置的 CPU 权重,以及显式的字节、行和工作量预算

Version 2.709.0

Added

  • 通过 THPDFJBIG2Options.UseHuffmanEncoding 新增可选的原生 JBIG2 Huffman 符号字典和文本区域输出,包括标准 DH、DW、BMSIZE、FS、DS、DT 表、原始集合位图、符号 ID 表、确定性的原生路由,解码往返逐像素一致;算术编码和 MMR 仍是默认

Version 2.708.0

Changed

  • 按注册字体代缓存阿拉伯文及组合 presentation form 的反向 cmap 映射,ApplyArabicGSUBRefinement、ApplyArabicGSUBContextualRefinement 和通用上下文 GSUB 路径不再反复扫描 U+FB00..U+FDFF 和 U+FE70..U+FEFF,字码点优先级和整形输出保持不变

Version 2.707.0

Added

  • 通过 THPDFPage.DrawAztec 和独立的 THPDFAztec 单元新增 Aztec 二维条形码编码器(ISO/IEC 24778):动态规划高层编码带模式锁存、移位和 binary-shift 连串、位填充、GF(16) 到 GF(4096) 的 Reed-Solomon 纠错、自动选择 compact 15x15..27x27 或 full 19x19..143x143 符号,固定符号尺寸时可用强制层数控制
  • 新增竖排页面文本组装:THotPDF.ExtractLoadedPageText 和 range/stream 聚合 API 现在把 WMode 1 字形按字形原点 X 聚成列,列按从右到左排序、列内从上到下走,竖排 CJK 文本不再被剁成逐字形碎行

Fixed

  • 修复了像素尺寸带小数的页面(96 DPI 的 A4)并行 band 导出因 PNG band 宽度不匹配而失败的问题:栅格尺寸现在与 band 写出器统一用 Ceil 取整,交付的分块总是与编码器宽度一致

Version 2.706.0

Added

  • 通过 THotPDF.SaveLoadedPageToPng、SaveLoadedPageToPngStream、SaveLoadedPagesToTiffBanded 和 SaveLoadedPagesToTiffStreamBanded 新增流式已加载页面 PNG 导出和分 band 多页 TIFF 导出:压缩图像数据经 band 编码器逐行写出,超大页面不再需要完整 framebuffer;THPDFBandImageExportInfo 报告页面、band、行、worker、内存、输出、耗时和取消遥测

Version 2.705.0

Added

  • 已加载保存路径新增 PDF/A 收尾处理:THotPDF.SaveLoadedDocument 和 SaveLoadedDocumentToStream 现在校验 GTS_PDFA1 OutputIntent(继承自源 catalog 或新注册),设置 PDFACompliance 时输出 pdfaid:part / pdfaid:conformance XMP 标识;重新保存时已有的 pdfaid packet 逐字节保留
  • 加载侧新增竖排(WMode 1)消费:CIDFont 的 /W2 和 /DW2 单元度量现在驱动文本提取和页面渲染,沿文本空间 y 轴用 v1x/v1y 定位向量逐列下行,不再用水平 /W 前进量

Version 2.704.0

Added

  • 通过 THotPDF.RenderLoadedPageTilesParallel 和 THotPDF.RenderLoadedPageBandsParallel 新增已加载页面的并行 tile 和 band 渲染:按行主序在调用线程回调、借出位图、协作式取消、调用方控制在途内存、峰值内存准入,以及跨隔离渲染上下文共享的有界不可变 Type 3 字形和半色调网屏缓存

Version 2.703.0

Added

  • 通过 THPDFCSCSignatureProvider.SignHashBatch 新增有界 CSC 多重签名摘要批次:对有序的同算法批次只用一个 hash 绑定的 SAD 和一次 signatures/signHash 请求,同时执行本地与凭据的 multisign 限额、严格响应基数、同步或异步结果排序、SHA-256 内容寻址幂等键和已完成批次重放

Version 2.702.0

Added

  • 扩展 THotPDF.RenewPAdESLTATimestamp:支持调用方提供的证书、OCSP 和 CRL 证据,在新的 RFC 3161 文档时间戳之前并入现有 DSS,更早的每个修订版逐字节保留,连续多次续期时验证流精确去重

Version 2.701.0

Added

  • 通过 THotPDF.PreflightLoadedPAdES 新增可按条款定位的 PAdES baseline 和 extended profile preflight:每条适用要求都带稳定规则 ID、profile、规范级别、标准条款、PDF 路径、对象编号、已签名或当前修订以及通过状态,同时校验 CMS 基数、签名者证书 ESS 引用、签名字典约束、byte-range 覆盖、可信时间、DSS 证据和文档时间戳覆盖

Version 2.700.0

Added

  • 新增端到端的 ECDSA、Ed25519、Ed448 PFX / PKCS#12 私钥加载和 CMS 文档签名,包括命名曲线 CNG ECDSA、可选的 OpenSSL 3 PureEdDSA、RFC 8410 密钥解码、RFC 8419 摘要和参数规则、Ed448 用的 512 位输出 SHAKE256、自动密钥算法选择,以及严格的证书-密钥配对

Version 2.699.0

Added

  • 通过 HPDFEnumeratePFXIdentities、HPDFParsePFXByLocalKeyID 和 THPDFCMSSignOptions.PFXLocalKeyID 新增多身份 PFX / PKCS#12 凭据的确定性选择,包括严格的单值 localKeyId 和 friendlyName bag 属性、公钥配对、递归 safe-content bag、有界的歧义与成环诊断,以及自动匹配嵌入中间和根证书链并精确去重 DER

Version 2.698.0

Added

  • 扩展进程内 PFX / PKCS#12 PBES2 解密:加入 AES-128-CBC 和 AES-192-CBC,以及 PBKDF2 的 HMAC-SHA-384 和 HMAC-SHA-512 PRF,包括按密码算法可选的 keyLength 校验和有界的盐值、迭代、IV、填充检查,AES-256-CBC 与 HMAC-SHA-1 / SHA-256 的兼容性保持不变

Version 2.697.0

Added

  • 新增符合规范的 XPS 和 OpenXPS Canvas FixedPage.NavigateUri 继承:后代 Path、Glyphs 和嵌套 Canvas 可视元素都会拿到作用域内的 URI,除非自己覆盖;外部、邮件、包内页面和百分号解码的 LinkTarget 动作在变换、嵌套裁剪、隔离不透明度组、可复用可视元素抑制、嵌套覆盖后恢复的过程中保持原样,既有的链接、URI、取消和不安全 scheme 限制照旧生效

Version 2.696.0

Added

  • 新增有界的原生 XPS 和 OpenXPS Canvas 透明度组:Opacity 以及纯色、渐变或图像的 Canvas.OpacityMask 值通过隔离的 DeviceRGB Form XObject 让重叠的子可视元素只合成一次,带折叠的均匀 alpha、共享的变 alpha soft mask、嵌套组、变换后裁剪、资源转移和保留链接;畸形、不支持、奇异或超大的内容一律 fail-closed

Version 2.695.0

Added

  • 新增有界的原生 XPS 和 OpenXPS Canvas.Clip 转换:支持缩写几何、本地或远程 StaticResource 的 PathGeometry 值、直接属性元素、结构化 line、Bézier、二次曲线和圆弧图形、几何变换、空裁剪,以及经 PDF W* 或 W 实现的嵌套 EvenOdd / NonZero 裁剪;导航边界随裁剪收窄,解析上限 100,000 个值,畸形或奇异变换 fail-closed

Version 2.694.0

Added

  • 为经变换的 Path 和 Glyphs 可视元素新增有界的原生 XPS 和 OpenXPS 导航:HTTP、HTTPS 和邮件链接保留为 PDF URI 注释,包相对页面和百分号解码的 LinkTarget 片段在所有页面就位后解析为前向或后向 PDF GoTo 动作;点击边界感知度量,链接上限 65,536 个、字符上限 8,192 个,抑制 VisualBrush 捕获,支持取消,不安全 scheme 给出 fail-closed 诊断

Version 2.693.0

Added

  • 新增有界的原生 XPS 和 OpenXPS VisualBrush 转换:支持内联或资源型 Canvas、Path、Glyphs 可视元素、层级和远程 ResourceDictionary 查找、绝对 Viewbox、绝对或相对 Viewport、None / Tile / 镜像平铺模式、变换、不透明度、可复用 Form XObject、共享平铺 pattern、token 感知的资源转移;成环、畸形输入、递归、内容、缓存和放置预算一律 fail-closed

Version 2.692.0

Added

  • 新增原生 XPS 和 OpenXPS 包字体嵌入:覆盖 TrueType 和 OpenType 程序、TTC 成员片段、GUID 混淆资源、直接或由 cmap 派生的字形 ID、一对多 Unicode 簇、显式前进量和偏移、宽度正确的 RTL 原点、共享字体资源、embedding 与 no-subsetting 权限、可选字形子集化、有界 ToUnicode 映射;定位 run 的输出为摊还线性复杂度,不再借 GDI 字体替身

Version 2.691.0

Added

  • 新增有界的 OpenXPS Glyphs Indices 布局:严格执行簇 code unit 数与字形数、以 em 百分之一计的显式前进量、水平和垂直偏移、奇数 BidiLevel 反向推进、纯色属性或属性元素填充、不透明度、原生 PDF TJ 批处理、定位 Unicode 簇回退、文本提取保留;畸形输入给 fail-closed 诊断,缓冲摊还线性且映射上限 65,536 个

Version 2.690.0

Added

  • 新增 OpenXPS Path.OpacityMask 支持:覆盖纯色、变 alpha 多站点线性和椭圆径向渐变,以及普通、平铺或镜像的 PNG ImageBrush 遮罩,通过折叠的均匀 alpha、有界原生 DeviceGray 透明度组、共享 shading pattern 和图像 soft-mask 流实现,不支持的内容 fail-closed 处理,另有可复用的 RegisterLuminositySoftMaskState 构建器带 alpha 图像资源绑定

Version 2.689.0

Added

  • 通过原生 PDF 平铺 pattern 新增 OpenXPS ImageBrush 的 Tile、FlipX、FlipY、FlipXY 模式:一到四个独立裁剪的放置、共享图像和 PNG soft-mask 资源、组合固定页面/路径/画刷矩阵,外加可复用图像 pattern 的有界 RegisterImageTilingPattern API

Version 2.688.0

Added

  • 新增 OpenXPS ImageBrush.Transform 支持:接受有限的六参数属性矩阵和 MatrixTransform 属性元素,串联在原生 Path 裁剪之后、viewport 裁剪和图像放置之前,画刷可以旋转、缩放、斜切或平移而不动所在矢量几何;非标准的 RelativeTransform 和解析不到的矩阵资源仍作为显式诊断

Version 2.687.0

Added

  • 通过 THPDFPage.ShowImageMatrix 新增矩阵控制的图像 XObject 放置,并扩展 XPS 固定页面导入:支持包内 JPEG、PNG、TIFF、JPEG XR 的 ImageBrush 填充、绝对或相对边界的 Viewbox / Viewport 映射、原生路径与单 viewport 裁剪、图像和路径不透明度、PNG soft-mask alpha、DPI 感知的 96-DPI 尺寸、共享解码资源缓存;不支持的平铺、变换、色彩转换和图像描边给 fail-safe 诊断

Version 2.686.0

Changed

  • 新增可复用的有界多站点径向渐变注册,并扩展原生矢量 XPS 路径导入:属性元素形式的椭圆 RadialGradientBrush 值、Pad 扩展模式、均匀站点 alpha、画刷不透明度、相对或绝对的中心/原点/半径映射、原生 PDF Type 3 shading,坐标恢复后路径几何保持不变

Version 2.685.0

Changed

  • 扩展有序原生矢量 XPS 路径导入:带引号感知的有界属性元素解析、纯色和多站点线性渐变画刷、原生 PDF shading pattern、画刷与站点 alpha、默认相对边界或显式绝对的渐变坐标、越界站点插值;不支持的变换、扩展模式、颜色插值、变 alpha 和退化轴线给 fail-safe 诊断

Version 2.684.0

Changed

  • 新增有序原生矢量 XPS 路径导入:有界缩写几何、填充规则、纯色 RGB 和 ARGB 填充与描边、路径不透明度、描边宽度、六参数变换,不支持的绘图特性给 fail-safe 诊断

Version 2.683.0

Changed

  • 强化了实际绘制内容的 PDF/X-6 校验:定义时 shading pattern 图形状态、非描边 pattern 的 ExtGState 语义、fail-closed 的 soft-mask 子类型与背景检查、精确的 Type 3 字形度量和继承颜色规则、严格的组合绘制 alpha 分类、有界 JPX 颜色推断,以及外观感知的注释合成

Version 2.682.0

Added

  • 新增 brainpoolP256r1、brainpoolP384r1、brainpoolP512r1 ECDSA 签名的生成方与验证方支持,包括按曲线的 SHA-2 和 SHA3 摘要矩阵、provider 之前的签名验证失败、严格的命名曲线证书参数、无参数 ECDSA 算法标识符、规范 DER 签名值、Windows CNG 命名曲线导入;显式、尾随、未知或不匹配的参数都有确定性诊断

Version 2.681.0

Changed

  • 通过 HPDFInterpretContentTokensDevice 和可选的完整 IHPDFContentOperatorDevice 扩展,统一了非渐进位图、direct-DC、Form 和 display list 内容执行:每个操作符一个取消检查点、编译期操作符索引缓存使 display list 重放无需扫描操作数、公开 OperatorCount 指标、保留语义设备兼容性、修正 "、v、y 操作符语义,合法 EI 终结符的处理不再误触发 fallback 诊断

Version 2.680.0

Added

  • 新增有界事务化的 RepairPDFA4 重载:类型化选项、详细修复报告、共享发现溯源、安全的 PDF 2.0 头部/trailer ID/元数据/Catalog/呈现规范化、命名空间感知的 PDF/A 标识修复、可配置的部分或完全合规提交策略、错误回归检测、逐字节的图与 XMP 回滚;严格边界保证页面内容、字体、颜色、透明度、图像、图形操作符和提取文本原样不动

Version 2.679.0

Added

  • 新增实际绘制内容的 PDF/X-6 校验:可选 ISO 15930-9:2020 或已合入勘误的 2025 规则、真实 ICC 头与通道检查、资源感知地遍历内容数组、Form XObject、平铺与 shading pattern、图像、Type 3 字形、soft mask 和注释外观,叠印模式与组合绘制透明度诊断、稳定的规则溯源,解码字节、token、对象、问题、递归和图形状态的工作量都有界

Version 2.678.0

Added

  • 深化有界 PDF/A-4 校验:缓存的 ICC 头与分量检查、文档与页面 output-intent 一致性,跨内容数组、嵌套 Form XObject、图像、图像掩膜、shading 和注释外观分析实际绘制的设备颜色与透明度,继承图形状态、渲染字体嵌入、CIDFont 与 CMap 关系、严格注释标志与外观状态、UTF-8 XMP packet 与命名空间校验、逻辑页面树位置、稳定的条款感知诊断,解码字节与内容 token 的上限可配置

Version 2.677.0

Added

  • 补全有界 PDF/UA-2 校验:文档、人类可读字符串、可选内容、注释、AcroForm、结构目的地、书签、嵌入文件和嵌套页标签,包括物理 ParentTree 归属、标量结构子节点、appearance stream 限制、基于命名空间 URI 的 XMP 属性、Unicode 私用区检测和条款感知诊断;结构化 HTML、XHTML、XML、JSON 导出现在共享同一 tag 优先的无障碍阅读模型,覆盖语言、标题、导航、页标签、安全链接、注释、非敏感表单控件、marked-content 替换、artifact、图像替代文本、几何回退、独立上限、取消和原子发布

Version 2.676.0

Added

  • 通过 PlanProgressiveLinearizedPageRanges 为 linearized PDF 的每一页新增有界的最小 byte range 规划:原始与 Flate 的主/溢出 hint 解码、可互操作的字节对齐合并与 Annex F 连续拆分 hint 布局、精确的 bootstrap、页面、共享组以及带 LF 或 CRLF 前缀的传统/流式交叉引用依赖、合法的短读累积、256 MiB 默认规划器内存上限与 fail-closed 编码消歧、重叠感知合并、严格结构交叉检查、类型化上限与可用性诊断,首页统一走 [0, /E) 路径

Version 2.675.0

Added

  • 通过 ConfigureCryptFilterDefaults 和 SetStreamCryptFilter 新增字符串、普通流和嵌入文件各自独立的合规 crypt filter 策略:口令与公钥保留 filter、/Identity、写出口径正确的口令安全 /EFF 与前置 /Crypt 管线、fail-closed 的公钥流专属接收方边界、大小写敏感的外部命名 filter 加载与检查、/CFM /None、V2 密钥长度报告、混合策略的 Direct File 回退、对象流容器与成员字符串策略分离,以及保留策略的加密增量更新

Version 2.674.0

Added

  • 通过口令感知的 BeginIncrementalUpdate 重载和分配的接收方密钥材料,新增保留凭据的 Standard 与公钥加密增量更新:安全留存文件密钥或 FEK,字符串、流、元数据和 Identity crypt filter 策略各自独立,带代次感知的旧式对象密钥派生、精确继承 /Encrypt 引用、逐字节一致的源修订、原 user/owner/recipient 访问权限;改动加密方式或不支持的异构 filter 一律 fail-closed 拒绝

Version 2.673.0

Security

  • 在全页、区域、原生或外部解码之前以及全局字典共享之前,新增有界的 JBIG2 segment 图校验:索引式重复与缺失引用检查、迭代式成环与依赖深度检测、强制嵌入流的页面关联、拒绝禁用 segment、长引用与聚合边预算、符号字典分配防护和精确的失败遥测

Version 2.672.0

Added

  • 新增 PAdES E-EPES signature-policy-identifier 生成与严格校验:显式 policy OID、已知或 ETSI unknown 摘要、SPuri、SPUserNotice、SPDocSpecification 限定符、有界 Unicode 与集合解析、策略文档哈希、主签名者 OID 与摘要在密码运算前先钉住、专用的不匹配状态和完整 JSON 报告

Version 2.671.0

Added

  • 通过 HPDFCMSBuildMultiSignedData 和 HPDFCMSMergeSignedData 新增确定性 RFC 5652 容器,最多 256 个独立主 SignerInfo 记录:签名者产生副作用之前整批预校验、逐签名者的属性/算法/证书/提供商、严格定长容器校验、DER 排序去重集合、独立验证结果、单签名者字节兼容,以及无副作用的聚合占位尺寸计算

Version 2.670.0

Added

  • 通过 THPDFCMSSignOptions.SignerIdentifier 新增可选的 RFC 5652 SubjectKeyIdentifier 签名者身份:紧凑 IMPLICIT SID 编码、自动 SignerInfo 与 SignedData 版本选择、严格 X.509 扩展提取、provider 与占位尺寸支持,验证时 SID、证书和版本匹配失败即 fail-closed

Version 2.669.0

Security

  • 新增 fail-fast 的 CMS 摘要算法一致性诊断,覆盖 SignedData.digestAlgorithms、SignerInfo、签名机制参数和 RFC 6211 CMSAlgorithmProtection:专用验证状态、校验失败码、时间戳传播、详细问题原因和 JSON 输出

Version 2.668.0

Added

  • 新增 SHA3-256、SHA3-384、SHA3-512 的生成与验证,覆盖 detached CMS、RSA PKCS#1 v1.5、RSA-PSS、ECDSA provider 契约、RFC 3161 内容与签名时间戳、PAdES-LTA 续期、Seed Value 字典和 ISO 32001 PDF 2.0 开发者扩展声明;单遍 byte range 哈希有界,并与对应的 PDF MAC 策略共享

Version 2.667.0

Added

  • 新增 THotPDF.ValidatePDFMACChain:从旧到新逐增量修订验证、累积的经典或 xref 流索引、精确到修订和 xref 的失败定位、历史 MAC 替换检测、稳定的 KDFSalt 强制、拒绝摘要强度降级、认证的 /P 与 /Perms 检查、preflight 报告,修订解析有界且不落临时 PDF 副本

Version 2.666.0

Added

  • 新增 THotPDF.SignPDFWithPFXAndAttachedPDFMAC 和签名附着验证:直接活动 trailer AuthCode、间接 SigObjRef、完整的已签名修订覆盖、原始签名值摘要绑定、SHA-2 或 SHA-3 PDF MAC 策略、单遍签名与 MAC 范围哈希、preflight 报告和原子输出替换

Version 2.665.0

Fixed

  • 修正 THotPDF.RegisterNChannelColorSpace:按 ISO 32000-2 输出五元素 DeviceN 形式并带 /Subtype /NChannel 与 process 分量元数据,最低 PDF 版本提升到 1.6,luminosity soft mask 经其 alternate space 解析 NChannel 绘制;读取仍兼容旧式 /NChannel 族 token

Version 2.664.0

Added

  • 补全 PDF 混合模式渲染:Hue、Saturation、Color、Luminosity 都有整数热点路径实现,并修正全不透明快速路径,所有生效的可分离或不可分离混合模式都会与背景正确合成

Version 2.663.0

Security

  • 在暴露加密 safe 内容之前先认证 PKCS#12 容器:校验可选的外层 MacData,PKCS#12 KDF 迭代有界,SHA-1 或 SHA-256 HMAC,常数时间摘要比较,密码错误与篡改一律 fail-closed 处理

Version 2.662.0

Added

  • 新增三个 HotPDFCLI 命令:render 经已加载页面位图管线把选中页面逐页栅格化成 <prefix>-page<N>.png(--pages 范围、--dpi 10..2400、默认 150);tables 经 ExportLoadedTypedTables 把类型化表格提取为 CSV 或 JSON(--json、-o 文件或控制台);compare 经 HPDFDocCompareDocuments 打印两份文档的 JSON 比对报告(--mode 0..5,覆盖页数、页面文本、对象数、渲染图像、完整和结构)

Fixed

  • 修复了 Win64 ICC 变换管线对 8 位批量变换(TransformBytes)输出全零的问题:Win64 lcms2 目标里的优化 1D-LUT 快速路径返回零值而通用重采样管线是对的,8 位变换现在只在 Win64 上以 cmsFLAGS_NOOPTIMIZE 构建;16 位单色路径和所有 Win32 变换保留优化快速路径(批量 sRGB 三原色现在两个平台都能正确往返)

Version 2.661.0

Added

  • 在既有四策略 zlib 基线之后新增真正有预算的 Zopfli 高压缩比 Flate 压缩:严格的无增长才采纳、输入/迭代/块/输出/耗时上限、详细的流与并行图像遥测,以及固定语料上的确定性收益门槛

Version 2.660.0

Added

  • 新增确定性 XML 机器可读 preflight 报告,以及带 ABI 版本的可信插件用于特征提取和自定义校验规则:稳定排序、policy bundle 集成、取消传播、fail-closed 能力检查,插件、发现、特征、字符串、输出和耗时的预算全部有限

Version 2.659.0

Added

  • 扩展有界 XFA FormCalc:条件逻辑、重复数值聚合、经验证的动态实例 callback;新增默认关闭的沙箱 QuickJS 表单脚本:完整控制流、原生类型化数组、隔离的数据访问,指令、时间、内存、栈、值和实例操作的预算全部有限,附执行遥测

Version 2.658.0

Added

  • 新增有界可编辑的 XFA packet DOM,覆盖完整 XDP 流和有序 packet 数组:local-name 路径查询、packet 与节点变更、未触及字节的精确保留、逐 packet 选择性重写、确定性的命名空间与属性输出、安全 CDATA 拆分、实体转义,输入/输出/packet/节点/深度/属性/文本/查询预算全部有限

Version 2.657.0

Added

  • 经既有 CMS provider 管线新增 CSC API v2 远程签名:传输由应用持有、OAuth token 刷新、有界凭据链发现、显式授权与 SAD 处理、同步或异步摘要签名、RSA-PSS 参数、轮询、RFC 3161 时间戳、取消、稳定幂等键和有限的已完成操作缓存

Version 2.656.0

Added

  • 新增可选内容评分的 XPS、EPUB、CBZ 文档处理器:可替换的线程安全注册、一次经过验证的压缩包扫描、固定页面/spine/自然图像排序、不可变 PDF 转换缓存、共享的压缩包/资源/重排/页面/像素/DPI/输出/取消预算,以及可安全回滚的 PDF 发布

Version 2.655.0

Added

  • 新增有界类型化表格提取与原子 CSV/JSON 导出:规范列、同页片段与连续页合并、合并单元格跨度、重复表头、页面几何、置信度、溯源,整数/数值/布尔/日期/日期时间/货币/百分比推断由 locale 控制

Version 2.654.0

Added

  • 新增已加载页面到 HTML、XHTML、XML、JSON 的原子结构化导出:统一阅读顺序模型,带块、带样式 span、检测到的表格、坐标、源顺序、可选的有界 PNG 图像、Unicode 安全转义、取消和有限资源预算

Version 2.653.0

Added

  • 新增已加载页面到 DeviceGray、DeviceRGB 或 DeviceCMYK 的原子颜色重写:保留可搜索矢量、对图像和复杂资源做无损色彩管理栅格转换、旋转安全的输出、显式渲染保真度与资源预算,spot 专色版的保留/处理转换/拒绝策略可选

Version 2.652.0

Added

  • 新增先审后涂的已加载页面涂黑(redaction)检测:感知校验和的 PII 模式、可插拔的实体与人脸检测器、带置信度评分的页面空间发现项、有界的工作遥测、强制的审核人身份、原子化的已批准注释暂存,以及一条独立且显式的烧录(burn-in)边界

Version 2.651.0

Added

  • 新增有界的已加载页面与区域条码解码:可插拔引擎、渐进式低分辨率渲染、fallback 的 90° 旋转扫描、经过校验的文本与原始载荷、PDF 空间边界与方向、置信度过滤、重叠去重、取消支持,以及资源遥测

Version 2.650.0

Added

  • 新增有界、可取消的可搜索 OCR 文本层:可插拔识别引擎、置信度与几何校验、与旋转对齐的隐形 Unicode 文本、可选内容分组、资源遥测,以及原子化的多页发布

Version 2.649.0

Added

  • 新增基于版本化 JSON 的完整对象图往返:流式快照与增量导出、原始或已解码的内嵌与原子 sidecar 载荷、有界且模式兼容的导入、结构与流长度校验,以及事务化发布

Version 2.648.0

Added

  • 新增针对手工编辑 QDF 诊断文档的有界修复:保留对象与流字节、修正直接/间接/缺失/过期的流长度、重建经典交叉引用偏移和 trailer、拒绝不安全结构,并通过常规加载器验证输出

Version 2.647.0

Added

  • 新增线程安全的自定义流过滤器注册表:有界的 push/pull 契约、共享解码预算、协作式取消、显式 seek 要求、隔离的自定义失败,以及执行遥测

Version 2.646.0

Added

  • 新增有界的内容操作符 visitor 与事件 API:只读操作数视图、确定性的状态 Callback、inspect、measure、replace、delete、stop、reject 动作、协作式取消、经过校验的输出,以及原子化的已加载页面更新

Version 2.645.0

Added

  • 新增可插拔的已加载页面渲染后端契约:对已编译 display list 的访问、原生 GDI 实现、线程安全的并行调度、确定性的 fallback 策略、缓存失效处理,以及执行遥测

Version 2.644.0

Added

  • 新增有界的布局重叠检测、元素路径、可选开启的源映射、原生矢量溢出与重叠叠加层、实时诊断 Callback,以及工作统计

Version 2.643.0

Added

  • 新增原生有界的矢量图表:折线、柱状、面积、饼图和散点系列、自动或手动坐标轴、主题、图例、标签、PDF/UA Figure 替代文本,以及渲染统计

Version 2.642.0

Added

  • 新增有界的 GUI 线程 RichEdit 与 RTF 分页:矢量 EMF 输出、图像、可选开启的受支持 OLE 呈现、取消支持、保留流位置,以及显式的输入、字符、页面和输出预算

Version 2.641.0

Added

  • 新增有界的 SVG 2 导入,产出可复用的 PDF Form XObject:原生几何与圆弧、CSS 级联、矢量渐变、clip 与 mask 支持、Base 14 文本、透明度资源、感知放置的链接注释,以及导入统计

Version 2.640.0

Added

  • 新增版本化的 HTML5 分页媒体导入配置:宽容的 DOM 解析、打印 CSS 级联、分页的块级与表格布局、可选的 AcroForm 控件、有界且由 Callback 驱动的资源加载,以及按操作统计

Version 2.639.0

Changed

  • 大型本地文件的内存映射现在会在较大的顺序窗口和至多 16 个较小的 MRU 随机访问窗口之间自适应调整配置的映射字节上限,保留显式的固定几何选项,并报告活动几何、切换次数、访问模式计数和峰值映射字节

Version 2.638.0

Added

  • 新增有界的跨页 JBIG2 符号训练:外部与原生后端、共享的全局字典、完全重复页的精确复用、直接的 PDF 图像批量插入、后端与尺寸遥测,在 100 页回归语料上实测压缩节省 78.8%

Version 2.637.0

Changed

  • 并行已加载页面渲染现在会按进程级内存预算削减请求的 worker 数量、为每个认领的页面保留配额、经 Callback 交付保持有序输出的预留、在取消或失败时唤醒预算等待者,并报告并发、预留、准入、延迟和等待遥测

Version 2.636.0

Changed

  • 已加载页面预取现在在缓存锁外完成编译和渲染、通过 tokenization 与 playback 协作式取消、让位于前台页面渲染,并暴露进度、失败、抢占和取消延迟遥测

Version 2.635.0

Added

  • 新增有序的流式并行页面渲染:调用线程 Callback、有界的已完成位图队列、生产者背压、协作式取消、借用式位图生命周期,以及队列、字节、等待、完成和交付遥测

Version 2.634.0

Added

  • 新增两阶段并行的已加载页面 Pipeline:在渲染缓存锁外编译 display list、在整组页面编译完成前就启动播放、动态均衡有界的 worker、保持输入顺序、减少内容 token 分配,并暴露阶段、缓存、完成和延迟遥测

Version 2.633.0

Added

  • 新增不可变的引用计数已解码位图句柄:免拷贝的缓存命中、线程安全的渲染器直接绘制、按需隔离的可变拷贝、与淘汰解耦的生命周期,以及累计的句柄与拷贝遥测

Version 2.632.0

Changed

  • QuickJS 执行现在在 Win32 和 Win64 上同时支持静态对象和 ABI 中立的桥接 DLL 两种方式,带 Unicode 安全的值、确定性的状态报告、可配置的内存、栈、脚本、时间和中断限制、安全的 DLL 发现、被拒脚本后的恢复,以及可复现的跨平台运行时构建

Version 2.631.0

Changed

  • Factur-X 和 ZUGFeRD 业务规则校验现在执行完整评审过的 XPath 2 Schematron 特性面:外部代码库、顺序绑定、量词、FLWOR 求和、稳定的 fallback 规则标识符、安全的有界 XML 解析、显式的求值错误发现项、零静默跳过,以及 fail-closed 的组合校验

Version 2.630.0

Added

  • 新增内置的 TrueType 可变字体实例化:已映射的轴、共享与私有 gvar 元组、IUP 插值、简单与复合轮廓更新、phantom point 度量、HVAR、VVAR 和 MVAR 烘焙、紧凑的静态字形重建、校验和正确的输出,以及无 Callback 的 Unicode 字体注册

Version 2.629.0

Added

  • 新增无副作用的 CMS 占位符估算:基于显式、provider 或 RSA 证书签名的尺寸做估算,精确的静态容器整形、保守的动态载荷预留、签名前重建、按能力门控的 provider 重试、严格的外部签名器单次调用保证、有界的尺寸计算,以及详细的尝试诊断

Version 2.628.0

Added

  • 新增基于可达性的已加载 PDF 内嵌字体子集化:覆盖页面内容、嵌套 Form XObject、注释外观状态、共享字体程序、TrueType 和 CFF 格式、按编码后尺寸选择、稳定的 CID 与 ToUnicode 映射、详细结果,以及存在签名时默认拒绝

Version 2.627.0

Added

  • 新增为声明式布局树自动生成 PDF/UA 结构:包括标题、列表、表格、图形、语言与替代文本元数据、分页 artifact、续排安全的 marked-content 引用、阅读顺序保留、语义校验,以及结构统计

Version 2.626.0

Added

  • 新增声明式文档 DOM:可继承样式、可复用组件工厂、文本、spacer、stack、容器、section、重复的页眉页脚、带重复表头行的加权表格、有界的续排深度、分页统计、免拷贝的文本与表格片段、线性顶层遍历、即时刷新页面,以及对齐的 Delphi 和 C++Builder API 面

Version 2.625.0

Added

  • 新增可重复的 Win32 与 Win64 统计性能门禁:隔离 load、save、render 和文本提取,记录预热与 30 个原始样本(含 p50、p95、样本方差、RSS、进程 I/O、环境和确定性 fixture 标识),然后评估稳定的 JSON 阈值,出现回归即返回失败退出码

Version 2.624.0

Changed

  • 围绕不可变源区间、直接数值转换、单遍嵌套容器和索引式字典插入重写了简单字典与数组的解析,并公开物化遥测;一个 30,000 对的 Win32 fixture 把五遍分配字节减少 64.7%,耗时从 3,656 ms 降到 46 ms

Version 2.623.0

Added

  • 新增可配置的解析器限制:单个 token 字节数、token 总量、数组或字典条目数、畸形 token,外加严格的不可信输入预设、带类型的限制异常和按加载遥测;回归门禁能在 250 ms 内、37 MiB 进程峰值以下拒绝一个 2 MiB 的 token 和一个百万 token 的容器

Version 2.622.0

Added

  • 新增显式的已加载页面对象图释放与遥测 API:丢弃干净的页面自有根和渲染缓存,同时保留间接共享资源和重载元数据;顺序处理 100,000 页时峰值稳定在 69.3 MiB,已释放的普通或压缩页面以原对象身份重新物化

Version 2.621.0

Changed

  • 已解码的对象流容器现在使用可配置的字节上限 LRU 缓存:按容器立即淘汰、淘汰后基于源重载、零保留模式,以及峰值字节、淘汰和重载遥测

Version 2.620.0

Changed

  • 大型普通页面树现在以紧凑占位符打开:通过 /Count 引导的遍历和间接对象 Hash 索引解析随机页面、缓存已解析页面、暴露物化遥测与控制项,并在结构变更或保存操作前自动展开

Version 2.619.0

Changed

  • 已加载的 AcroForm 字段、限定名、widget、注释和页面现在共享一个惰性双向关系缓存:反向注释查找、按 widget 的页面查找、活动遥测、针对原始对象图编辑的显式失效,以及变更安全的自动维护

Version 2.618.0

Changed

  • 页面对象查找现在使用惰性重建、感知变更的反向索引来映射对象编号与已解析页面指针,取代页面复制、书签、命名目的地、动作、表单、无障碍和页面树对账中反复的页表扫描,并暴露有效性与活动遥测

Version 2.617.0

Changed

  • 渲染文档比较现在支持调用方选择的 DPI、RGB 或亮度色彩容差、变更像素比与类 SSIM 相似度门限、确定性的连通变更区域、可选的 PNG 差异叠加图,以及带显式渲染诊断的 fail-closed 页面与整体像素预算

Version 2.616.0

Changed

  • 文档比较现在通过确定性的基于 Catalog 的路径遍历间接对象图、在显式资源限制内对值和流做 Hash、在分类插入/删除/移动/变更前先对齐页面、把移动对象与新增删除区分开,并在比较不完整时如实报告,而不是把受预算限制的结果当作相同

Version 2.615.0

Changed

  • 已加载图像解码现在使用 16 个缓存元数据分片和逐 key 精确的 singleflight 协调:相互独立的昂贵解码并发执行,重复请求仍只保留一个 owner 解码,配置的字节与条目预算在所有分片上生效,并暴露缓存解码入口和并发遥测;四个独立的 12,000 像素 JPEG 请求在四个 Win64 worker 上扩展到 3.72 倍,而八个同 key 请求只解码一次

Version 2.614.0

Changed

  • 低分辨率灰度与 RGB JPEG 渲染现在会选择有界的 1/2、1/4 或 1/8 逆 DCT 缩放,把缩放后的扫描线经定点重采样器直接流入精确的目标位图,保留解码预算、取消和 codec worker 隔离,并通过 GetLastJPEGReducedDecodeInfo 暴露源、缩放、目标、扫描线和内存遥测;12,000×12,000 缩到 300×300 的回归 fixture 比完整解码快 24.05 倍,且不再分配 432 MB 的源光栅

Version 2.613.0

Changed

  • 已加载页面的 /Contents 数组现在暴露惰性可 seek 的拼接流:未过滤的段保留在源支撑的存储里、每次至多解码一个已过滤的段、用摊销线性的 token 与字节累积,编辑时通过追加新段保留原始流,并把 1 GiB、10,000 段序列的额外工作内存压在 64 MiB 以下

Version 2.612.0

Changed

  • 增量更新现在保持源文件写锁定、以文件为后盾,而不再完整保留源字节:只在稀疏 xref 子节中访问并输出变更、新增和删除的对象,把原始前缀流式写入新目标,同目标保存时直接追加并支持回滚;一次 4 GiB 的单对象修订,额外工作内存控制在 128 MiB 以内

Version 2.611.0

Added

  • 新增有界的文档级已加载字体解码器缓存:32 MiB 与 128 条目的 LRU 上限、跨页面和已加载文本提取、SVG 导出、文本替换的 singleflight 解析复用、从 GetLoadedFontDecoder 返回独立的深拷贝结果、可配置的内存预算与遥测 API,以及覆盖对象图、页面、重载、JSON Patch 和 CMap 配置的自动失效;重复使用同一个共享间接字体时,其编码、宽度、ToUnicode、CIDToGIDMap 和后代映射只在保留期内解析一次

Version 2.610.0

Changed

  • 把线性、精确扩容的外部对象查找数组换成操作范围级的 2 的幂开放寻址映射,以源文档、对象编号和 generation 为键,加速了页面导入与对象嫁接;共享间接对象和循环图在批量导入间保持既有的身份语义,大型对象图的注册变成摊销常数时间、查找变成期望常数时间

Version 2.609.0

Changed

  • 提升了 SVG 页面导出保真度:直接的 w、J、j、M 和 d 图形状态操作符现在保留线宽、具名 cap 与 join 样式、miter 限制、虚线数组和虚线相位;q/Q 能在嵌套内容和 Form XObject 之间恢复这些属性;even-odd 的 f*、B* 和 b* 绘制操作符输出 fill-rule="evenodd";零宽度的 PDF 发丝线靠不缩放的 SVG stroke 保持可见

Version 2.608.0

Added

  • 新增 QuickJS 静态链接基础设施:Lib/HPDFQuickJSStatic.pas 通过 {'$L'} 指令链接五个 QuickJS OMF 对象(用 bcc32c 从补丁源码构建)——无 DLL 依赖——并声明完整的 C 运行时面(47 个符号:msvcrt C99 数学、Borland 64 位算术、尺寸中立的 atomic 桩、pthread 桩);thirdparty/QuickJS/build-static.bat 自动化补丁与编译流水线。已知限制:JS_NewRuntime 能成功,但 JS_NewContext 会触发 access violation,因为移除 _Atomic 改变了结构体初始化顺序;v2.607.0 的 DLL 构建仍是可用的评估路径

Version 2.607.0

Added

  • 新增 DataMatrix 二维条码生成(Lib/HPDFDataMatrix.pas):带数字对压缩的 ASCII 模式编码、使用 DataMatrix 本原多项式 $12D 在 GF(256) 上的 Reed-Solomon ECC、10x10 到 144x144 的方形尺寸、交替方向的码字放置和 L 形定位图案;THPDFPage.DrawDataMatrix 把编码后的矩阵渲染成填充模块方块网格
  • 新增 PDF417 堆叠式二维条码生成(Lib/HPDFPDF417.pas):带 base-30 字符配对的文本模式编码、本原元 3 在 GF(929) 上的 Reed-Solomon ECC、符号描述符编码、带起始/停止图案的行列布局;THPDFPage.DrawPDF417 渲染码字矩阵
  • 新增 QuickJS JavaScript 引擎绑定(Lib/HPDFQuickJS.pas 加上 thirdparty/QuickJS/bin/ 下预构建的 Win32/Win64 quickjs.dll):动态加载 DLL、runtime+context 生命周期和求值 API 面(Eval/EvalInt/EvalFloat);Eval 代码路径在链接进应用时有一个已知的 Win32 启动崩溃,已记录待后续调查
  • 新增 THPDFWriter 架构抽取目标(Lib/HPDFWriter.pas):xref 条目注册表(free/used/compressed)、经典 xref 表序列化器和 trailer 字典构建器,THotPDF 保存路径增量地委托给它

Version 2.606.0

Added

  • 新增两个 HotPDFCLI 命令:decrypt 用给定密码加载加密 PDF、经 DecryptLoadedDocument 解密并保存未加密副本(-o 输出路径,默认 <input>-decrypted.pdf);optimize 经 CompressLoadedDocument 用 FlateDecode 重压缩每个流(-o 输出路径,默认 <input>-optimized.pdf,拒绝加密输入)

Version 2.605.0

Added

  • 新增 QR Code 二维条码生成:新的 Lib/HPDFQRCode.pas 实现了完整的 QR 编码器(数字、字母数字和字节三种编码模式;GF(256) 上的 Reed-Solomon 纠错;版本 1-40 覆盖全部四种 EC 等级 L/M/Q/H;全部八种掩码图案带惩罚评估;正确的模块放置,包括 finder、timing、alignment、格式信息和版本信息图案)。THPDFPage.DrawQRCode 方法在任意书写页面上把编码矩阵渲染成填充模块方块网格(ModuleSize 单位为点,EC 等级与颜色可配置)

Version 2.604.0

Added

  • 新增完整的 MacExpertEncoding 解码表:128 字节的高半区现在把 expert 字形(小型大写字母、旧式数字、上标/下标数字、分数、排版符号)映射到最接近的 Unicode 码点或私用区替代,取代之前原始字节直通的 fallback——正是它让使用 expert 编码 Type 1 字体的文档输出乱码

Version 2.603.0

Fixed

  • 修复 ConcurrentObjStmDecryptionMatchesSerial 中长期存在的偶发失败:默认 PDF 1.6 版本下 aes256 降级为 aes128 后,全局 FRevision 是过期值,会把 CreateKeys 错误导进从不填写传统 /O 和 /U 口令 Hash 的 V5 分支——序列化出的加密字典于是带着空或过期的口令字符串,文件打不开。修复在 setter 和两处版本协商点都从降级后的 FCryptKeyType 重新推导 FRevision,且传统字典分支在口令字符串不是恰好 32 字节时会抛出清晰的诊断

Added

  • 新增 HotPDFCLI 的 html 命令:经 HPDFRenderHTMLDocument 把受限的 HTML 文件(h1-h6、p、ul、ol、hr、内联标记)渲染成 PDF

Version 2.602.0

Added

  • 新增块级 HTML 导入:THPDFHTMLImporter(以及 HPDFRenderHTMLDocument 便捷包装)把受限的 HTML 子集渲染到书写文档——h1-h6 标题带每级字号、p 段落(裸正文变成隐式段落)、ul/ol 列表带缩进的 li 项(圆点或 1. 编号)、hr 分隔线、底边距处自动分页,以及针对未闭合 p/li 块的浏览器式恢复;head/script/style 区域被跳过,容器标签透明穿透。内联标记(b/i/u/font/a/sub/sup、实体、自动换行)委托给现有的 TextOutHTML 渲染器,块在同一页内保持完整;表格、图像、CSS 和嵌套列表不在支持范围内

Version 2.601.0

Added

  • 新增三个 HotPDFCLI 命令:merge 把附加输入的每一页追加到第一个文档并保存合并文件(-o 输出路径,至少两个输入,防护输出/输入路径冲突);split 把文档的每个选中页写成独立的单页文件(<prefix>-page<N>.pdf,--pages 从 1 起的范围,默认前缀取自输入路径);export-svg 写出每个选中页的 SVG 导出(<prefix>-page<N>.svg,默认第 1 页)

Version 2.600.0

Added

  • 新增 SVG 页面导出:BuildLoadedPageSVG 为任意已加载页面返回独立的 SVG 1.1 文档,SaveLoadedPageAsSVG 把它写到磁盘;导出内容包括路径(fill/stroke/fill-and-stroke 绘制操作符,使用 DeviceRGB 颜色)、文本运行(逐字符定位的 <text> 元素,走与文本提取相同的字体解码 fallback 链,遵守 Tf/Tc/Tw/Tz/Ts 和含旋转与缩放的文本矩阵)、图像 XObject(解码并嵌入为 base64 PNG data URI,经 CTM 单位正方形映射)和 Form XObject(用 form 矩阵和自身 /Resources 递归解释);/Rotate 90/180/270 的页面按旋转后的画布几何导出
  • 沿袭共享 content-stream 设备分发器的已知限制:不支持 W/W* 裁剪、不支持 sh shading、不支持 Type 3 字体,内联图像只报告元数据;ExtGState 支持的 stroke 参数(LW/LC/LJ/ca/CA)会被遵守,而朴素的 w/J/j/d 操作符不会被分发

Version 2.599.0

Added

  • 新增 HotPDFCLI 命令行工具(tools/HotPDFCLI):控制台前端带三个命令——info(PDF 版本、页数与首页尺寸、加密方法、线性化与 xref 结构、注释/字体/图像/表单/签名计数器、Info 元数据)、extract-text(从 1 起的 --pages 范围、--out 文件输出、匹配视觉阅读顺序的 --layout 等宽网格模式)和 verify(每个签名字段的状态、签名者、原因、Hash、签名时间、全文覆盖与证书状态,任一签名失败即以非零码退出);Build-HotPDFCLI.bat 产出 Win32 和 Win64 二进制

Version 2.598.0

Added

  • 新增 SetRenditionMediaPlayParameters:为媒体 rendition 附加或更新 /P 媒体播放参数字典,带必须遵守的 /MH 或尽力而为的 /BE 目标,覆盖音量百分比、控制器可见性、自动播放标志、适配模式(meet/slice/fill/scroll/hidden)、重复次数,以及固有、无穷或显式时间跨度的时长
  • 新增 SetRenditionMediaScreenParameters:为媒体 rendition 附加或更新 /SP 媒体屏幕参数字典(窗口类型 floating/full-screen/hidden/screen-annotation 矩形、DeviceRGB 背景色、背景不透明度、显示器索引)
  • 新增 SetSoundAnnotationParameters:重写 Sound 注释 /Sound 流的采样格式(采样率、声道数、每样本位数、Raw/Signed/muLaw/ALaw 编码),不再局限于硬编码的 22050 Hz 立体声 16 位 Signed 默认值,并设置 /Name 图标(如 Speaker 或 Mic)

Version 2.597.0

Added

  • 新增 SetMovieAnnotationParameters:覆盖 AddMovieAnnotation 用硬编码默认值创建的电影注释的 /Movie 字典(宽高比对、0/90/180/270 旋转、以秒计的时长、海报可见性)
  • 新增 SetRichMediaPresentation:填充 RichMedia 注释 /RichMediaSettings 的激活、停用与呈现字典(条件名如 PO 页面打开,以及工具栏 / 导航 UI / 右键点击 / 透明度标志);条件名为空时省略对应字典
  • 在 THotPDF 上新增 ResolveIndirectObject:解析写入端存在已写出字典里的间接引用,调用方得以遍历刚构建的对象树;AddRichMediaAnnotation 现在也会把自己的注释注册到 LastAnnotation

Version 2.596.0

Added

  • 新增实时吊销证据发现:证书解析器现在读取 AIA OCSP responder 和 CRLDistributionPoints URI 扩展,HPDFExtractCertificateRevocationURLs 按证书暴露它们,HPDFCollectCMSRevocationRequests 把它们变成证据请求(对每个分发点 GET pkix-crl;POST ocsp-request,带由证书及其签发者构建的最小 RFC 6960 SHA-256 CertID 体,自签证书以自身作为签发者解析)
  • 新增 HPDFValidateCMSCertificatePathOnline:收集这些请求,经调用方提供的传输层在现有 retry/worker 机制上执行(库本身从不打开 socket),并把取回的每个 OCSP 响应和 CRL 喂给离线验证器;获取失败时退化为离线证据语义

Version 2.595.0

Added

  • 新增 JBIG2 半调区域解码(segment 类型 22/23):带 MMR 或算术集合位图的图案字典(type 16)、MMR(字节对齐的链式平面)与算术形式(共享一个 MQ 解码器)两种灰度位平面栈、带 8.8 定点向量的网格放置,以及可选的 HSKIP 空白映射
  • 新增 JBIG2 独立 generic-refinement 区域(types 42/43,带 TPGRON 的 GRTEMPLATE 0/1),对被引用区域段的存档位图或页面缓冲做精化
  • 新增 AddPubSecKeyMaterial / ClearPubSecKeyMaterials:主 PubSecKeyMaterial 不匹配时,用额外的接收方私钥逐一尝试每个 /Recipients 信封
  • 新增测试流构建器 HPDFJBIG2Codec_EncodeHalftoneRegionTestStream 和 HPDFJBIG2Codec_EncodeStandaloneRefinementTestStream,端到端覆盖新的 segment 类型

Fixed

  • 修复公钥 AES-128 文档加载:pubsec 拆分后,传统对象处理流程让 FileKey、StringKeyType 和 StreamKeyType 保持未初始化,每个对象都拿垃圾密钥去解密(Win64 加载直接失败;Win32 加载悄悄产出错误明文)
  • 修复加密字符串的往返:密文现在总是序列化为 hex 字符串,因为字面字符串会把 CR、LF 和 CRLF 归一成单个 LF,转义处理可能翻转任意密文字节

Version 2.594.0

Added

  • 新增预定义 CJK UCS2/UTF16 CMap(UniJIS-UCS2-H、UniGB-UTF16-V 等另外 15 个)的内置恒等近似:磁盘上没有随库发布 CMap 资源时,HPDFLoadStandardCMapFile 直接从内置表应答,Type0 文本提取不再把 2 字节编码逐字节解码
  • 新增用户提供的 JBIG2 Huffman 表(segment 类型 53,Annex B.2 描述符形式):原生解码器解析这些表段,符号字典的 SDHUFFDH/SDHUFFDW/SDHUFFBMSIZE/SDHUFFAGGINST 和文本区域的 SBHUFFFS/DS/DT/RDW/RDH/RDX/RDY/RDSIZE 在 selector 值为 3 时从被引用段解析它们
  • 新增 SetStructureClassMapEntry,把类名的共享属性字典注册进 StructTreeRoot 的 /ClassMap,补全 SetStructureElementClass 的 /C API

Fixed

  • 修复公钥多接收方密钥恢复:/Recipients 信封原先存放在一个未计数的列表里,多个条目别名共享同一个缓冲,两个及以上接收方的文档对每种密码算法都会推导出错误的文件密钥;信封现在持有独立拷贝,传统 SHA-1 路径与 AES-256 路径一样对原始信封字节做 Hash

Version 2.593.0

Added

  • 新增 Shading Type 1(基于函数)的渲染:域矩形的可见部分按颜色误差驱动的四叉树细分,每个叶子单元格画成两个渐变三角形、顶点颜色从双输入函数采样,取代之前“not sampled”的 fallback 诊断
  • 新增宽容的双输入函数求值:只声明一个输入的函数会退化为 f(x)(在第二个域坐标上取常数)而不是直接失败,Type 1 shading 背后的 sampled 和 exponential 函数仍能绘制

Version 2.592.0

Added

  • 新增对象流隔离:损坏的 /Type /ObjStm 容器会带原因记录在案(THPDFObjStmQuarantineReason:不是流、字典损坏、头损坏、流尺寸错误、解密失败、解压失败、/First 超出范围、头无法解析或容器异常),附带一行诊断和它遗留未解析的成员对象编号,独立容器照常加载
  • 新增成员级隔离(osqrMemberUnparsable):成功解码的容器里解析失败的成员体会被记录一次且不影响兄弟成员,GetLoadedQuarantinedObjStmCount / GetLoadedQuarantinedObjStmInfo 暴露全部记录;隔离记录在一次加载的恢复重试中保留、按容器去重,并在下次加载进入时清空