已加载 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;转换或文件发布失败时会被清除

外观处理

提供既有普通外观时支持任意已在那个外观中正确表达的内嵌字体文本,包括 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 时显式损失原始文本与矢量