已加载 PDF 转 PDF/A-4 并保留文本与矢量
HPDFArchivalConversion 为已加载文档提供保真 profile:当可见字体、颜色空间与 Render 资源能够满足 PDF/A-4 时,不替换其页面内容
转换器保留原始文本操作符、矢量路径、图像、页面几何与既有 OCR 文本层,把可见的普通注释与控件外观展平为矢量 Form XObject,修复受支持的元数据与结构问题,并在发布前验证序列化结果
该 profile 从不把页面 raster 化:RasterizedPages 保持为零,包括 OCR 渲染临时识别位图并追加不可见可搜索文本的情形
运行时验收覆盖 Delphi Win32 与 Win64;Windows FPC 从全新源码编译实现,生成的公共头文件用 C++Builder Win32 与 Win64x 编译
入口点
function HPDFConvertLoadedToPDFA4Preserving(Source: THotPDF;
Destination: TStream; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
function HPDFConvertLoadedToPDFA4PreservingFile(Source: THotPDF;
const TargetFileName: string; const SRGBProfile: TBytes;
const Options: THPDFArchivalPreservationOptions;
out Report: THPDFArchivalPreservationReport): Boolean;
先加载源,保持调用方自有的输入流存活,并在操作期间让转换器独占访问文档
Options := THPDFArchivalPreservationOptions.Default;
if not HPDFConvertLoadedToPDFA4PreservingFile(Source, TargetFileName,
SRGBProfile, Options, Report) then
raise Exception.Create(Report.Conversion.Diagnostic);
保真证明
转换器在对象图事务下对当前已编辑的源对象图拍快照,序列化后回滚源,然后在独立的已加载克隆上执行全部转换工作
输出重新加载后,原始已解码页面内容流必须保持逐字节一致,并从其原始页面按原始顺序可达
页面资源树与保留的普通外观资源树在对象与递归限制内遍历;内嵌字体程序、ToUnicode 映射、图像、ICC profile 与嵌套 Form XObject 保留其原始编码负载,用流式 SHA-256 验证,并检查其从输出页面的持续可达性
独立内容流用图形状态护栏包住原始页面操作符并持有追加的外观操作符,避免会重写原始内容流的原生单流追加路径
TextAndVectorContentPreserved 只有在原生输出验证与保真检查通过后才变为 true;转换或文件发布失败时会被清除
外观处理
- 可见的普通
AP/N外观使用原生注释展平从其 Form BBox 与 Matrix 映射到注释 Rect,保留自有字体与资源 - Invisible、Hidden 与 NoView 标志即使在存在普通外观时也阻止绘制;Popup 注释被移除而不绘制
- 无普通外观的无边框链接只在显式零宽度边框确认其没有可见边框时才被移除而不绘制
SynthesizeMissingAppearances默认为 true,调用原生的标记或字段外观生成;不受支持的子类型、无效矩形或生成失败会拒绝转换- 缺失的文本外观支持带兼容原生字体 encoding 的 ASCII 值;十六进制、Unicode 或掩码文本值要求显式的普通外观
- 合成文本外观在空白规范化之后,对照重新加载的可搜索文本中的源值检查;不兼容的字体 encoding 拒绝发布
提供既有普通外观时支持任意已在那个外观中正确表达的内嵌字体文本,包括 Unicode;转换器保留该外观而不替换为系统字体
展平会移除注释交互、可编辑字段、计算、action 与签名字段,同时保留可见外观;每个受影响的注释与每个合成外观都产生一条损失记录,含其源页面、注释索引与对象号(如有)
颜色、字体与显式损失
必需的 ICC 参数是既有归档验证器接受的 sRGB matrix/TRC profile;每个既有输出 profile 的解码字节必须与提供的 profile 完全相同,否则拒绝转换,以避免重新解释既有输出条件
转换器只在需要时添加 sRGB PDF/A 输出意图,把实际序列化器同步到 PDF 2.0 头,并调用有界的基础 PDF/A-4 元数据与结构修复
它不内嵌缺失的可见字体程序、不重编码原始文本、不重新着色 DeviceCMYK 操作符、不替换既有输出条件,也不把页面透明度展平成位图;未解决的原生 preflight 发现会拒绝发布
加密源必须先解密再转换;签名字段要求显式 AllowSignatureInvalidation,既有内嵌文件要求显式 RemoveEmbeddedFiles,因为该 profile 面向基础 PDF/A-4
Losses 还报告签名失效、内嵌文件移除、旧式 Info 字典移除以及被禁止的目录或表现元数据移除
受支持时保留既有 XMP;生成元数据时转移受支持的标题、作者、主题与关键词信息,任意旧式 Info 字段不承诺保留
OCR 与预算
AddOCRToImagePages 默认为 false;启用后识别没有可提取文本的页面并追加不可见文本,不替换原始内容或既有 OCR 层
把 OCREngine 设为应用引擎,或留 nil 使用内建有界 ASCII OCR 引擎,其语言与排版覆盖范围即 内建识别能力范围
OCROptions 控制识别分辨率与单词预算,转换器则强制跳过含文本页面、保留既有 OCR 层并省略新的可选内容组
Limits 使用 THPDFArchivalConversionOptions.Default 约束页面数、对象数、暂存输出字节、单流工作量、累计流工作量、取消与同步检查点;raster 像素限制只在 OCR 渲染识别位图时生效
其他默认值为 1,024 条损失记录、1,048,576 个提取或预期文本码元,以及每轮原生验证 4,000,000 个内容 Token
资源负载哈希把编码字节计入相同的流工作预算;源与输出验证都消耗累计工作量,因此大型扫描集合可能需要显式调高 MaxTotalDecodedBytes,尽管资源验证使用固定的 64 KiB 哈希缓冲
预算在源加载之后生效,分别约束转换器自有的快照与暂存输出;接受不受信任输入时请配置加载器限制
发布与验证
流 API 要求目的地为位置零处的空可寻址流并拒绝源别名;只有在重新加载、原生验证、保真检查与取消检查全部成功后才复制暂存字节
目的地写失败会触发尽力而为的重置;任意自定义流可能拒绝该重置,因此原子文件发布请使用文件入口点
文件 API 探测源别名,在目标旁独占创建临时文件,刷新它,全部检查通过后才用 MoveFileEx 替换目标;更早的失败保留既有目标并移除临时文件
InitialValidationIssues、Repair、Conversion.ValidationIssues、OCR 细节、流计数、提取文本计数与显式损失仍可供检查
原生验证覆盖受支持的 HotPDF PDF/A-4 规则,不是对任意 PDF 的全面认证;回归验收另外使用独立 pypdf 与 MuPDF 检查,并对生成外观与原生 OCR 产物运行 veraPDF PDF/A-4 验证
真实语料回归包括内嵌字体的 Word 与图书馆指南,以及 380 页中文扫描集;未内嵌字体且含 DeviceCMYK 内容的贸易报告是显式拒绝用例
回归命令
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win32
powershell -File Tests/Delphi/Run-ArchivalPreservationTests.ps1 -Platform Win64
python Tests/Delphi/Fixtures/ArchivalPreservation/verify_preserving_output.py
verapdf --format xml --flavour 4 Tests/Delphi/generated/ArchivalPreservation/appearance.pdf Tests/Delphi/generated/ArchivalPreservation/ocr.pdf Tests/Delphi/generated/ArchivalPreservation/native-appearance.pdf
Delphi runner 抑制阅读器启动,并包含保真与既有 raster 回归 fixture;独立 veraPDF 验收使用真实的 PDF/A-4 验证 profile
相关主题
Raster 归档转换提供另一套 profile,在支持原生 Render 时显式损失原始文本与矢量