function ValidatePdfA: TPdfAValidationResult;
ValidatePdfA 会遍历已打开的文档,查找 ISO 19005-1(含 Cor.1:2007)定义的每一种 PDF/A 合规标记
pdfaid:part 和 pdfaid:conformance 条目的 XMP 元数据流,它告诉验证器该文档是按哪个 PDF/A 级别编写的(1a、1b、2b、3b 等)/ID 数组(ISO 19005-1 6.1.3 所要求)xmp:CreateDate 和 xmp:ModifyDate(当 Info 字典按照 6.7.3 示例 2 持有 CreationDate / ModDate 值时需要)pdfaExtension:schemas 容器(6.7.8 / Cor.1 所要求)结果是一个 TPdfAValidationResult 记录
pac1a、pac1b、pac2a、pac2b、pac2u、pac3a、pac3b、pac3u、pacNone,或者当 PDF/A 标记没有可识别级别时返回 pacUnknown)TPdfAValidationIssue 值组成的 TPdfAValidationIssues 集合,描述发现的每一个问题。结构性标记包括 pvaiMissingXmpMetadata、pvaiMissingPdfAIdentifier、pvaiMissingOutputIntent、pvaiMissingIccProfile、pvaiEncryptionPresent、pvaiMissingTrailerId、pvaiMissingXmpDates 和 pvaiMissingExtensionSchema。它还会报告标记注入无法修复的内容级违规:pvaiLevelAStructureMissing(缺少标记结构的 Level A 声明)、pvaiJavaScriptPresent、pvaiForbiddenAction、pvaiAdditionalActions、pvaiEmbeddedFilesNonConforming、pvaiLzwUsed、pvaiTransparencyForbidden、pvaiOptionalContentForbidden、pvaiForbiddenAnnotation、pvaiNeedAppearancesTrue、pvaiXfaPresent、pvaiFontNotEmbedded 和 pvaiUnicodeMappingMissing(其字体缺少 /ToUnicode 的 PDF/A-2u / PDF/A-3u 声明)。自 v1.63.0 起进一步报告:pvaiTrappedTrue(Info 字典的 /Trapped /True,TN0008 §2.7 误友键)、pvaiForbiddenActionSubtype(Sound / Movie 动作或非白名单 Named 动作,6.6.1)、pvaiTransparentColorSpace(ExtGState 的非 Normal 混合模式或 /CA//ca 不等于 1.0,PDF/A-1 6.4)、pvaiAnnotationDictViolation(注释 /CA 不等于 1.0,6.5.3)、pvaiUnembeddedFont(字体描述符多于嵌入字体程序,6.3.4 的更严格检测)和 pvaiMixedDeviceColorSpaces(同时使用 DeviceRGB 与 DeviceCMYK,6.2.3.3)。内容流算子级检查(ISO 19005-1 6.2.10)进一步报告:pvaiUndefinedContentOperator(页面内容流含未定义操作符,如遗留的 PS PostScript 操作符)和 pvaiForbiddenRenderingIntent(ri 操作符使用不在 6.2.9 白名单中的渲染意图);第二轮补全 6.2.4-6.2.8 与注释标志位:pvaiExtGStateTransferFunction(ExtGState 含 /TR 或 /TR2 非 Default,6.2.8)、pvaiImageDictionaryViolation(Image 含 /Alternates//OPI 或 /Interpolate 为 true,6.2.4)、pvaiFormXObjectViolation(Form XObject 含 /Subtype2 PS 或 /PS 键,6.2.5)、pvaiPostScriptOrRefXObject(PostScript XObject 或 Reference XObject,6.2.6/6.2.7)和 pvaiAnnotationFlagsViolation(注释 /F Print 位未置或 Hidden/Invisible/NoView 位被置,6.5.3);第三轮补全 6.6.1/6.7.2/6.8:pvaiDeprecatedAction(弃用的 no-op 动作,6.6.1)、pvaiMetadataFilterForbidden(Metadata 流字典含 /Filter,6.7.2)、pvaiStructElemTypeMissing(Level A 结构元素缺 /Type /StructElem,6.8.3.3)和 pvaiRoleMapMissing(Level A 非标准结构类型缺 role map 映射,6.8.3.4)ValidatePdfA 是只读检查 — 它不会修改文档,并且可以安全地重复调用。请在把 PDF 交给归档系统之前使用它,以便把不合规情况显示给操作员。对于常见的“这是什么级别”的检查,如果不需要问题列表,建议使用更轻量的 PdfAConformance 属性
/NeedAppearances 与 /XFA,以及其描述符不含嵌入字体程序的字体。透明度、可选内容与嵌入文件检查会根据所声明的 PDF/A 部分来应用(在 PDF/A-1 中被禁止,在 PDF/A-2 和 PDF/A-3 中被允许)。它仍是一种快速的字节级检查,而非详尽的校验器(例如,它不会解析颜色空间或逐字形的字体覆盖情况),因此在需要详尽认证时,请将其与 veraPDF 之类的完整校验器搭配使用Conformance = pacNone 且 Issues 数组为空的记录
uses System.TypInfo;
var
Outcome: TPdfAValidationResult;
Issue: TPdfAValidationIssue;
begin
Pdf1.FileName := 'C:\Incoming\report.pdf';
Pdf1.Active := True;
Outcome := Pdf1.ValidatePdfA;
Memo1.Lines.Add('Level: ' + GetEnumName(TypeInfo(TPdfAConformance),
Ord(Outcome.Conformance)));
for Issue in Outcome.Issues do
Memo1.Lines.Add('- ' + GetEnumName(TypeInfo(TPdfAValidationIssue), Ord(Issue)));
end;