function SaveAsPdfA(const FileName: string; Conformance: TPdfAConformance = pac1b): Boolean; overload;
function SaveAsPdfA(const FileName: string; const Options: TPdfASaveOptions): Boolean; overload;
SaveAsPdfA 会先执行常规的 SaveAs,然后在已保存字节之上叠加一个增量更新, 将文件提升为 PDF/A 归档(默认是 PDF/A-1b;ISO 19005-1,含 Cor.1:2007) 该后处理会向保存流中注入四项内容:
pdfaid:part = 1,pdfaid:conformance = B),并按 ISO 19005-1 6.7.3 的要求把 Document Information Dictionary 中的每一项映射到其 XMP 等价项(Title → dc:title,Author → dc:creator,Subject → dc:description,Keywords → pdf:Keywords,Creator → xmp:CreatorTool,Producer → pdf:Producer,CreationDate → xmp:CreateDate,ModDate → xmp:ModifyDate),并嵌入 6.7.8 / Cor.1 所需的 pdfaid 扩展架构描述TPdfASaveOptions.IccProfileData 提供自定义 ICC 配置文件/ID 数组(ISO 19005-1 6.1.3 要求)。如果源 PDF 已经带有文件标识符,则复用现有的 16-byte permanent 和 changing IDs;否则会从源字节派生一个确定性的 16-byte 回退 ID输出在原始 PDF 结束之前会与基础 SaveAs 结果完全逐字节一致;只有增量更新会被追加到末尾
即使不理解 PDF/A 的旧版阅读器,也仍会像常规 SaveAs 一样渲染文件。两个重载的区别只在于
符合性 / 选项的传入方式 —— TPdfAConformance 形式是常见场景
(pac1b)的简写;TPdfASaveOptions 形式接收一个包含完整配置面的
记录,包括 Title、Author、Subject、Keywords、Creator、Producer、CreationDate、
ModDate、DocumentId 和 InstanceId 的可选覆盖值。留空的字段会从 FPDF_GetMetaText
/ FPDF_GetFileIdentifier 自动填充,因此一般调用者除了 Conformance
之外无需设置其他字段
Conformance 值决定目标标准和级别。PDF/A-1(ISO 19005-1)提供
pac1b 和 pac1a;PDF/A-2(ISO 19005-2)和 PDF/A-3
(ISO 19005-3)分别增加 b、u、a 级,对应 pac2b / pac2u /
pac2a 以及 pac3b / pac3u / pac3a
注入的 pdfaid:part(1、2 或 3)和 pdfaid:conformance
(A、B 或 U)会遵循请求值,而 OutputIntent 保持 ISO 19005-2 为每个部分保留的
GTS_PDFA1 子类型。由于后处理器无法合成逻辑结构,当源文件缺少该级别所需的
Tagged PDF 结构时,Level A 请求(pac1a / pac2a / pac3a)
会自动降级为匹配的 Level B,因此保存后的文件不会伪称自己是 Level A
成功时返回 True。如果基础 SaveAs 失败、增量更新无法附加(PDF 太短、
trailer 无效),或者提供了 ICC 配置文件数据但验证失败,则返回 False
/Encrypt 键(内部基础保存会使用 saRemoveSecurity)ValidatePdfA 检查结果,并把剩余问题呈现给操作员
// 使用内置 sRGB 配置文件输出简单的 PDF/A-1b
if Pdf1.SaveAsPdfA('C:\Report.pdfa.pdf') then
ShowMessage('Saved PDF/A-1b');
// 使用自定义 ICC 配置文件
var
Opts: TPdfASaveOptions;
begin
Opts := Default(TPdfASaveOptions);
Opts.Conformance := pac1b;
Opts.IccProfileData := TFile.ReadAllBytes('C:\Profiles\Coated.icc');
Pdf1.SaveAsPdfA('C:\Report.cmyk.pdfa.pdf', Opts);
end;