已加载 PDF 到 PDF/A-4 光栅转换

HPDFArchivalConversion 从已加载 THotPDF 文档的可见页面内容创建新的 PDF/A-4 文档,采用严格的原生渲染和调用方提供的 sRGB ICC profile

每个输出页面包含一幅按请求 DPI 无损压缩的 RGB 光栅图像,原始的可见尺寸、裁剪、旋转和 UserUnit 都会反映到输出页面几何中

入口

function HPDFConvertLoadedToPDFA4Raster(Source: THotPDF;
  Destination: TStream; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

function HPDFConvertLoadedToPDFA4RasterFile(Source: THotPDF;
  const TargetFileName: string; const SRGBProfile: TBytes;
  const Options: THPDFArchivalConversionOptions;
  out Report: THPDFArchivalConversionReport): Boolean;

先加载源文档,并在源文档销毁之前保持调用方自有的输入流存活

常规归档发布请使用文件入口:它会先探测既有目标是否与源文件互为别名,然后在目标目录以独占方式创建临时文件,校验完整的转换结果,flush 文件,最后用 MoveFileEx 配合 MOVEFILE_REPLACE_EXISTING 和 MOVEFILE_WRITE_THROUGH 替换目标

转换、渲染、校验、取消或发布失败时,既有的目标文件保持原样,临时输出会被删除

流入口要求目标为位于起始位置、可 seek 的空流,并通过 IsLoadedSourceStreamAlias 拒绝输入的已知别名;只有在完整的暂存输出通过原生校验之后,它才会写出字节

目标写入失败会触发尽力而为的空流重置,但任意设备或自定义流可能拒绝该重置并保留部分写入;要求文件发布必须原子化时请使用文件入口

选项与资源上限

选项默认值含义
DPI150请求的物理分辨率,接受 36 到 1200 的范围
MaxPages1000已加载源页面的最大数量
MaxPixelsPerPage40,000,000单页像素上限,也是单张源图像的像素上限
MaxTotalPixels500,000,000输出光栅像素的累计上限
MaxRasterBytes256 MiB单页或单张源图像的光栅内存分配上限,按每像素 4 字节保守核算
MaxOutputBytes256 MiB暂存 PDF 的大小上限,在流分配与写入之前强制执行
MaxDecodedStreamBytes64 MiB约束每条 filter chain、每页合并的内容预检、单次原生流读取 callback、单个已编码源图像流,以及原生输出校验器
MaxTotalDecodedBytes256 MiB约束整个转换过程中额外的原生滤波解码工作量、跨页面的合并内容预检,以及跨页面累计的原生流读取 callback
MaxInputObjects200,000已加载间接对象的最大数量
CancellationTokennil借用的取消令牌,在工作开始前、原生渲染和解码期间以及发布之前检查
Checkpointnil借用的同步 callback,在转换检查点和原生资源检查点以 nil sender 调用;不要重入源文档

解码限制统计的是解码器工作量,同一条已滤波的流可能在预检、display list 编译和渲染期间被重复计费;上调预算是调用方的显式决定

像素预检同时覆盖请求的物理分辨率和 UserUnit 缩放后原生渲染器的整数 DPI;极小的单位可能需要额外的光栅像素,而非整数页面尺寸在图像映射回物理页面时会引入亚像素重采样

转换的资源上限在源加载之后才生效;接受不受信任的输入时请先配置加载器自身的资源限制

源对象图保持不变,但读缓存和解码统计可能被填充;无论成功还是失败,渲染设置、取消令牌、后端和解码预算设置都会恢复

转换器临时套用这些设置期间,请让它独占访问源文档

渲染与色彩

每一页都必须在不产生原生 fallback 诊断、丢弃诊断或资源缺失失败的情况下完成渲染;不受支持的内容会让整个转换被拒绝,而不是发布不完整的页面

ICC 参数必须以可识别的 matrix/TRC 表示描述 sRGB,采用标准 D50 适配三原色和 IEC sRGB 传递函数;无关的 RGB profile、CMYK profile、畸形 profile 和基于 LUT 的 profile 都会被拒绝

输出声明 sRGB OutputIntent 和 PDF/A-4 XMP 元数据;源文档上已配置的自定义打样或输出 ICC 工作流会被拒绝,因为其图像解码器设置无法安全地重新解释为 sRGB

FPC 构建需要带 LittleCMS 的原生 codec 桥接,缺少该色彩管理后端时会拒绝转换

JPEG 和 JPX 图像流(包括已编码的内联图像)会在原生像素解码之前检查实际 codestream 尺寸,且必须与 PDF 图像字典一致

JPEG 接受有界的 8-bit baseline、extended sequential 和 progressive 头;JPX 接受有界的 J2K SIZ 头和普通长度的 JP2 box,至多 4 个分量、分量精度至多 16 位

已编码的 codec 另有每源像素 64 字节的保守工作预算;JPX tile 元数据同时受 MaxInputObjects 和 MaxRasterBytes 内每 tile 1024 字节的限制,因此默认 256 MiB 光栅预算最多容纳 4,194,304 个已编码源像素,图像更大时调用方可以显式上调

JBIG2 转换会被拒绝,因为其内部的区域和符号分配无法通过现有的头部 API 加以上界;非终结图像 codec、加长 JP2 box、不受支持的包装器,以及携带 DecodeParms 的包装 codec 流同样会被拒绝

CCITT fax 参数必须保持声明的正数图像尺寸;与字典不一致的 DecodeParms.Columns 和 Rows 覆盖(包括未知的 Rows=0)会在原生解码之前被拒绝

这些检查约束的是本转换器接受的已知头部与内存分配模式,并不承诺为每个原生解码器提供完整的进程内存沙箱

信息与质量损失

THPDFArchivalConversionReport 提供成功与取消状态、源页面数和已渲染页面数、光栅像素数、输出字节数、移除的注释/表单/附件计数、失败诊断以及原生校验发现

FailureKind 区分 afkNone、afkConversion、afkBudget 和 afkCancelled;类型化的转换器预算失败还会给出 BudgetMetric、BudgetObserved 和 BudgetLimit

检查点异常会中止转换并通过原生失败结果上报;如果包装层需要原始的 callback 异常类别,必须在转换器捕获之前先保留它

archive.pdfa4.raster JSON 与 C ABI 操作要求显式接受信息损失,保留源句柄,交付经校验的 PDF 和损失报告,并施加保守的任务预算上限

符合性验证

转换器会重新加载暂存输出,并在发布之前要求以基础 PDF/A-4 配置文件通过 ValidatePDFA4;原生校验器只覆盖其文档化的有限规则集,不能证明满足 ISO 19005-4 的每一项要求

独立验收可以用 veraPDF 配合 --flavour 4;包含未嵌入文本、透明度、RGB 图像、链接、签名 widget 和附件的回归夹具在 veraPDF 1.30.2 下通过,没有任何失败的规则或检查

运行 Tests/Delphi/Run-HotPDFArchivalTests.bat 执行对应的非 GUI 回归套件