自动 XFA 原生图形与图像

Unit: HPDFXFAHeadless

HPDFXFAWriteHeadlessPDF 直接从 XDP 消费 rectangle、line、arc 和 inline image draw 回调,与既有的文本和 widget 消费者并行

每次 draw 产生一个放置在实际布局页面上的原生 Form XObject;image draw 包含真实的 Image XObject,需要时还有 alpha 软掩模

矢量路径

矩形使用原生 PDF 矩形路径,line 保留斜杠或反斜杠斜率,椭圆弧使用至多 90 度的三次曲线段

第一个生效的 edge 提供 RGB 描边颜色和粗细,包括亚点宽度;描边外观边界包含一半粗细,因此 Form 不会裁掉自己的边框

arc 消费 startAngle 和带符号的 sweepAngle,默认整圈,最大绝对扫角 360 度

draw 的旋转、缩放和平移提示在围绕 draw 中心的有限仿射摆放中一次性应用,旋转以逆时针为正;左上角 XFA 坐标一次性转换为原生 PDF 原点

PNG 与 JPEG

格式实际原生消费
PNG 灰度1、2、4、8 和 16 位样本,打包样本扩展为 8 位,16 位精度保留
PNG RGB8 和 16 位彩色样本
PNG 索引色1、2、4 和 8 位索引经调色板扩展为 RGB 样本
PNG 透明灰度与 RGB 透明样本、调色板 alpha,以及 8 或 16 位灰度-alpha 与 RGBA;真实 /SMask 流保留 alpha 精度
PNG 滤波与隔行全部五种 PNG 行滤波器和 Adam7 遍次,经共享原生 zlib 与预测器实现验证
JPEG8 位 baseline 与 progressive 的灰度、RGB 和 CMYK 帧,先经共享原生 JPEG 解码器验证再保留原始 /DCTDecode 流

PNG chunk 校验和、顺序、尺寸、调色板索引、透明样本范围和精确解压长度在提交候选前全部检查;截断或多余的压缩数据使准备失败

JPEG 帧尺寸必须与真实原生解码一致,Adobe CMYK 反转在图像字典中显式声明

JPEG 需要既有的原生 TurboJPEG 运行时;HOTPDF_TURBOJPEG_LIBRARY 可指定绝对库路径,依赖库由操作系统查找

图像 aspect 支持 fit、none、width、height 和 actual;PNG pHYs 与 JPEG JFIF 密度决定物理像素尺寸,没有可用密度时按 96 dpi 处理

缩放后的图像居中并裁剪到 XFA draw 矩形;alpha 合成仍由原生 PDF 阅读器完成

边界与事务

编码图像字节、解码工作缓冲区和原始图像或 alpha 流在分配前施加边界;原生对象限制以及图像与字体流聚合限制保持生效

解析 chunk、解压数据、解码行和放置原生对象期间检查取消;既有原生 JPEG 解码器接收调用方令牌

准备失败保留目标位置、长度和字节;最终目标 WriteBuffer 遵循调用方流自身的 I/O 语义

当前边界

填充形状、corner 样式、按 edge 定制边框、虚线图案、条码、外部图像传输、imageEdit widget、替代图像格式、嵌入颜色配置文件和 Exif 方向仍需要更多消费者集成

动画 PNG 按其默认静态图像消费;外来 XML exData 仍是独立特性,此 draw 适配器不执行任意嵌入对象

验收

Tests/Linux/Build-XFAHeadlessGraphicFixtures.py 生成确定性的行滤波、Adam7、样本精度、透明、物理 aspect、JPEG 和畸形协议 fixture

Tests/Linux/XFAHeadlessGraphicsTests.pas 写入并重新打开真实原生 PDF,并验证失败时的调用方保护;Verify-XFAHeadlessGraphics.py 用 pypdf 与 MuPDF 独立检查解码图像样本、/SMask 精度、矢量算子、摆放和渲染像素

Automatic XFA native PDF creation 描述既有的字段与文本消费者以及公开的选项和结果 API