CheckFileCompliance
合规、文档检查
PDF/UA 读取器 Profile 选择
当 XMP 标识 pdfuaid:part=2 时,PDF/UA 检查选择 part 2,否则保留 part 1 检查;此处描述的旧 PDF/UA-1 检查并不意味着适用于 part 2
PDF/UA-2 Profile 实现核心的标识、命名空间、角色与结构检查;结构化报告使用 PDF/UA-2 与 ISO 14289-2,并披露 fullCertification=false 与未验证范围
需要强制目标 part 时使用 CheckFilePDFUACompliance 或 RunPDFUAValidationPipelineTask,检查能力限制时使用 GetPDFUAReadValidationCoverageJSON
描述
读取外部 PDF 文件,并按所选的 ISO 合规标准进行验证。返回值要么为零(文件完全通过所选测试),要么为非零的 StringListID 句柄,其中列出检测到的每个问题。列表中的每一项都是简短代码、冒号和人类可读的消息——与 GetPDFUADiagnostics 使用的代码格式完全相同。使用 GetStringListCount 和 GetStringListItem 枚举结果PDF/A 测试涵盖全部六种一致性模式(PDF/A-1a、PDF/A-1b、PDF/A-2a、PDF/A-2b、PDF/A-3a、PDF/A-3b),并读取
pdfaid:part/pdfaid:conformance XMP 条目来决定应用哪套规则PDF/UA-1 测试(v3.56.0 新增)依据 ISO 14289-1 检查外部 PDF,并发出
10xxx 范围的诊断代码,使其在视觉上与 PDF/A 的 00xxx 代码明显区分
语法
Delphi
Function TPDFlib.CheckFileCompliance(Const InputFileName, Password: WideString; ComplianceTest, Options: Integer): Integer;
ActiveX
Function PDFlib::CheckFileCompliance(InputFileName As String, Password As String, ComplianceTest As Long, Options As Long) As Long
DLL
int DLCheckFileCompliance(int InstanceID, const wchar_t * InputFileName, const wchar_t * Password, int ComplianceTest, int Options);
参数
| InputFileName | 要验证的 PDF 文件的完整路径。文件以只读方式打开,不会被修改。 |
|---|---|
| Password | 用于打开文件的密码。未加密文档传入空字符串。注意,无论提供的密码是否正确,加密文档都无法通过 PDF/A 测试(代码 00006)——PDF/A 禁止加密。 |
| ComplianceTest | 要检查的标准。 1 — PDF/A(ISO 19005-1/-2/-3,全部六个一致性级别)。 2 — PDF/UA-1(ISO 14289-1:2014,无障碍 PDF)。 3 — PDF/X(ISO 15930,包括 PDF/X-6 系列)。 4 — PDF/VT-3(ISO 16612-3:2020,以 PDF/X-6 系列为基础)。 5 — PDF/R-1 受限光栅交换。 6 — PDF/VCR-1 可变内容替换模板。 7 — PDF/E-1 工程文档交换。 |
| Options | 修改测试行为的位标志。 0 — 默认:报告文档中发现的每个问题。 1 — 在第一个问题后停止并立即返回。当调用者只需要通过/失败信号时很有用。 |
返回值
| 0 | 文件符合所选标准。 |
|---|---|
| 非零 | StringListID 句柄,其条目描述每个检测到的不合规项。句柄在文档关闭或调用 ReleaseStringList 之前保持有效。 |
PDF/A 问题代码(ComplianceTest = 1)
| 00002 | PDF 版本超过一致性级别允许的最大值(PDF/A-1 上限为 1.4;PDF/A-2 和 PDF/A-3 上限为 1.7)。详细信息行会指出违规版本和允许的最大值。 |
|---|---|
| 00003 | Catalog 包含 /OCProperties(可选内容/图层),这是 PDF/A-1 所禁止的。PDF/A-2 和 PDF/A-3 允许图层,不会触发该检查。 |
| 00005 | XMP 的 pdfaid:part+pdfaid:conformance 组合缺失、格式错误,或包含合法集合 1A、1B、2A、2B、3A、3B 之外的值。库无法确定应应用哪套规则,因此无论 Options 如何都会将其报告为致命问题。 |
| 00006 | 文档已加密。PDF/A 在所有部分中都禁止加密。 |
| 00007 | Catalog 没有 /OutputIntents 条目。所有 PDF/A 部分都要求存在输出意图,以便明确定义渲染色彩空间。 |
| 00011 | Catalog 没有 /MarkInfo 条目。仅 a 级一致性(PDF/A-1a、2a、3a)需要——标记 PDF 必须声明自身。 |
| 00012 | Catalog 没有 /StructTreeRoot 条目。仅 a 级一致性需要。标记 PDF 文档必须拥有逻辑结构树。 |
PDF/UA-1 问题代码(ComplianceTest = 2)
| 10001 | XMP 元数据流不包含 pdfuaid:part,或其值不是 1。ISO 14289-1 §5 要求合规文件通过该属性标识自身;ISO 14289-1 §6.2 禁止在没有它的情况下声明一致性。 |
|---|---|
| 10002 | 文档 Catalog 没有 /Metadata 流。PDF/UA-1 一致性声明记录在该流中;没有它,文件就无法宣告自身为无障碍文件。 |
| 10003 | Catalog 的 /MarkInfo 字典缺失或 /Marked 不为 true。ISO 14289-1 §7.1 要求每个合规文件声明自身为标记文件,以便辅助技术可以依赖结构树。 |
| 10004 | Catalog 没有 /StructTreeRoot 条目。PDF/UA-1 文件必须包含描述文档阅读顺序和语义的逻辑结构树。 |
| 10005 | /ViewerPreferences 字典缺失或其 /DisplayDocTitle 条目不为 true。ISO 14289-1 §7.1 要求合规阅读器在其窗口界面中显示文档标题而非文件名。 |
| 10006 | Catalog 的 /Lang 条目缺失或为空。ISO 14289-1 §7.2(引用 ISO 32000-1 §14.9.2)要求每个合规文件声明其自然语言,以便屏幕阅读器选择正确的语音和发音规则。 |
| 10007 | XMP 元数据流不携带非空的 Dublin Core dc:title。ISO 14289-1 §7.1 要求存在"明确标识文档的 dc:title 条目"。 |
| 10008 | /MarkInfo 字典的 /Suspects 被设为 true。ISO 14289-1 §7.1:声明 PDF/UA 一致性的文件必须具有 Suspects 值 false——true 表示标记已知包含错误。 |
| 10009 | 文档的 /RoleMap 重映射了一个或多个标准结构类型。ISO 14289-1 §7.1:ISO 32000-1 §14.8.4 中定义的标准标签(P、H1..H6、Figure、Table 等)不得被重映射。详细信息行会指出第一个被重映射的标准标签。 |
| 10010 | 文件已加密,但加密 /P 权限键的第 10 位(掩码 512,"为无障碍提取")未设置。ISO 14289-1 §7.16 要求每个加密的合规文件允许无障碍提取,以便辅助技术能够访问内容。 |
| 10011 | 检测到动态 XFA 表单:XFA XDP 数据包包含 <dynamicRender>required</dynamicRender>。ISO 14289-1 §7.15 禁止合规文件使用动态 XFA 表单;静态 XFA 是允许的。 |
| 10012 | 检测到 Reference XObject(携带 /Ref 条目的 Form XObject)。ISO 14289-1 §7.20 禁止引用 XObject,因为它们允许一个 PDF 通过引用嵌入另一个 PDF,而不会向辅助技术公开被引用的内容。 |
| 10013 | 检测到一个或多个 TrapNet 注释。ISO 14289-1 §7.18.2 明确禁止合规文件使用 TrapNet。详细信息行会报告发现的注释数量。 |
| 10014 | 一个或多个页面带有注释但未在其页面字典中设置 /Tabs /S。ISO 14289-1 §7.18.3 要求此类页面上的 Tab 顺序遵循结构树,这由 /Tabs /S 表示。详细信息行会报告违规页面的数量。 |
| 10015 | 一个或多个 Link 注释缺少非空的 /Contents 替代描述。ISO 14289-1 §7.18.5 要求每个 Link 注释携带无障碍描述,以便屏幕阅读器能够播报链接目标。详细信息行会报告违规 Link 注释的数量。 |
| 10016 | 一个或多个嵌入文件 FileSpec 字典缺少 /F 文件名键。ISO 14289-1 §7.11 要求每个嵌入文件 FileSpec 同时携带 /F 和 /UF。 |
| 10017 | 一个或多个嵌入文件 FileSpec 字典缺少 /UF Unicode 文件名键。ISO 14289-1 §7.11 要求每个嵌入文件 FileSpec 同时携带 /F 和 /UF。 |
| 10018 | 一个或多个可选内容配置字典缺少非空的 /Name 文本字符串。ISO 14289-1 §7.10 要求每个 OCG 配置字典(默认 D 条目以及 OCProperties/Configs 中的每个字典)携带非空的 /Name。 |
| 10019 | 一个或多个可选内容配置字典包含被禁止的 /AS 键。ISO 14289-1 §7.10 明确禁止在任何 OCG 配置字典中使用 /AS,以防止由使用信息驱动的自动状态调整。 |
| 10020 | 文档引用的一个或多个非 Standard-14 字体未嵌入其字体程序(FontDescriptor 上没有 FontFile、FontFile2 或 FontFile3 条目)。ISO 14289-1 §7.21.4.1 要求每种用于渲染的字体都嵌入其程序。Type 3 字体跳过该检查,因为其字形是内联 CharProcs。 |
| 10021 | 一个或多个 CIDFontType2 后代缺少 /CIDToGIDMap 条目。ISO 14289-1 §7.21.3.2 要求每个嵌入的 Type 2 CIDFont 携带 /CIDToGIDMap(或作为将 CID 映射到字形索引的流,或作为名称 Identity)。 |
| 10022 | 一个或多个 Standard 14 字体(Helvetica、Times、Courier、Symbol、ZapfDingbats 及其粗体/斜体变体)被引用但没有嵌入字体程序。ISO 14289-1 §7.21.4 NOTE 5 明确指出,14 种标准 Type 1 字体的嵌入没有任何豁免。 |
| 10023 | 一个或多个字体缺少 /ToUnicode CMap,且不符合 §7.21.7 豁免列表。豁免列表涵盖预定义的 MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding、其后代 CIDFont 使用 Adobe GB1 / CNS1 / Japan1 / Korea1 字符集合的 Type 0 字体,以及非符号 TrueType 字体。 |
| 10024 | 按文档顺序的第一个标题元素不是 H1(或强结构化的 H)。ISO 14289-1 §7.4.2:"如果使用了任何标题标签,H1 必须是第一个。" |
| 10025 | 在文档顺序中检测到一个或多个标题级别跳跃——例如 H1 之后紧接 H3,跳过了 H2。ISO 14289-1 §7.4.2 要求标题级别降序序列严格按数字顺序进行,不得跳过中间级别。 |
| 10026 | 一个或多个 Widget 注释缺少 /StructParent 条目。ISO 14289-1 §7.18.4 要求 Widget 注释嵌套在 Form 结构标签内;没有 /StructParent,Widget 不可能从结构树到达。详细信息行会报告数量。 |
| 10027 | 一个或多个 Widget 注释带有 /StructParent 条目,但其值无法通过 StructTreeRoot/ParentTree 解析到 /S = Form 的结构元素。ISO 14289-1 §7.18.4 要求每个 Widget 注释都嵌套在 Form 结构标签内。可能原因:/ParentTree 条目完全缺失、指向非 StructElem(原始整数 / MCR 字典),或命名了非 Form 标签。 |
| 10028 | 一个或多个非符号 TrueType 字体的 /Encoding(或 Encoding 字典的 /BaseEncoding)不是 MacRomanEncoding 或 WinAnsiEncoding。ISO 14289-1 §7.21.6 将非符号 TrueType 编码限制为这两个预定义名称。 |
| 10029 | 一个或多个符号 TrueType 字体在字体字典中带有 /Encoding 条目。ISO 14289-1 §7.21.6 第四段禁止这一点 — 符号 TrueType 编码必须仅通过嵌入字体程序的 cmap 表表达。 |
| 10030 | 一个或多个 L(列表)结构元素缺少 ListNumbering 属性。ISO 14289-1 §7.6 要求每个 L 标签通过该属性声明其编号样式。有效值为 None、Disc、Circle、Square、Decimal、UpperRoman、LowerRoman、UpperAlpha 和 LowerAlpha(ISO 32000-1 Table 347)。 |
| 10031 | 一个或多个 Link 注释带有 /IsMap 条目为 true 的 URI 动作字典。ISO 14289-1 §7.18.5 禁止 URI 动作使用 /IsMap = true,除非内容中其他位置在不带 /IsMap 键的情况下提供了等效功能。具有合理 IsMap 用例的作者应自行抑制该诊断。 |
| 10032 | 一个或多个 Note 结构元素缺少 /ID 条目。ISO 14289-1 §7.9 要求每个 Note 标签声明唯一的 /ID,以便交叉引用能够落在稳定的目标上。 |
| 10033 | 两个或多个 Note 结构元素共享同一 /ID 值。详细信息行会报告检测到的重复对数量。ISO 14289-1 §7.9 要求 Note ID 在文档内唯一。 |
| 10034 | 一个或多个非符号 TrueType 程序(FontDescriptor 的 Symbolic 标志被清除、存在 FontFile2 流)嵌入的 cmap 表仅包含符号 (3,0) Microsoft 子表。ISO 14289-1 §7.21.6 第一段要求至少有一个非符号 cmap 子表,以便程序能够渲染其 /Encoding 声明的码点。 |
| 10035 | 一个或多个非符号 TrueType 字体声明的 /Encoding 带有 /Differences 数组,其中包含不属于 Adobe Glyph List 2.0 的字形名称。.notdef 被列入白名单,因为规范隐式允许它。ISO 14289-1 §7.21.6 第三段要求每个 Differences 条目都落在 AGL 内。 |
| 10036 | 一个或多个简单 TrueType 字体的宽度与嵌入字体程序中相应度量的差异超过千分之一 em。ISO 14289-1 §7.21.5 要求 /Widths 数组与嵌入的字形度量一致。 |
| 10037 | 一个或多个 CIDFontType2 的宽度与嵌入 TrueType 程序中相应度量的差异超过千分之一 em。ISO 14289-1 §7.21.5 要求 /W 数组与嵌入的字形度量一致。 |
| 10038 | Type 1 字体描述符 /CharSet 遗漏了其嵌入字体程序中存在的一个或多个字形名称。ISO 14289-1 §7.21.4.2 要求该条目枚举每个嵌入字形。 |
| 10039 | CID 字体描述符 /CIDSet 遗漏了映射到其嵌入字体程序中字形的一个或多个 CID。ISO 14289-1 §7.21.4.2 要求该位集合标识每个嵌入的 CID。 |
| 10040 | 包含文本的 Form XObject 从标记内容之外的页面内容中被调用。ISO 14289-1 §7.20 要求 Form XObject 内容并入结构元素。 |
| 10041 | 一个或多个文本显示操作数解析为 .notdef 字形。ISO 14289-1 §7.21.8 禁止引用 .notdef,无论文本渲染模式如何。 |
| 10042 | 一个或多个媒体剪辑数据字典(由 /S /MCD 标识,可选 /Type /MediaClip)缺少必需的 /CT 内容类型条目。ISO 14289-1 §7.18.6 将这个 ISO 32000-1 Table 274 可选键提升为必需。 |
| 10043 | 一个或多个媒体剪辑数据字典缺少必需的 /Alt 数组(语言字符串 + 替代文本对)。ISO 14289-1 §7.18.6 将这个 ISO 32000-1 Table 274 可选键提升为必需,以便辅助技术能够播报嵌入多媒体的描述。 |
| 10044 | 一个或多个结构树节点带有多个直接 H(通用标题)子元素。ISO 14289-1 §7.4.4 明确禁止这样做——请拆分该节,或将 H 标签替换为编号的 H1..H6 级别。 |
备注
PDF/A 测试旨在作为交付前的快速自检。它可捕获直接导致文件不合格的文档级问题(错误的 PDF 版本、缺少 OutputIntent、A 级缺少结构树、加密、PDF/A-1 中的图层)。它不会遍历每个内容流运算符,也不会针对每个绘制对象验证字体嵌入或颜色空间引用——这些验证需要专用的 PDF/A 验证器(如 veraPDF)。请将此函数用作第一道检查以及构建流水线中的回归门禁。当希望库将问题列表格式化为可复用的文本报告时,请使用 CreatePreflightReport 或 SavePreflightReport。若需要文本、JSON、HTML 或 CSV 报告输出,请使用 CreatePreflightReportEx 或 SavePreflightReportEx,或参阅 Preflight Reports 了解完整的报告工作流配套 API
GetPDFUADiagnostics 对当前正在构建的内存中文档(而非外部文件)执行针对 PDF/UA(ISO 14289-1)的类似检查使用该库生成 PDF/A 输出时,请在添加任何内容之前调用
SetPDFAMode。SetPDFAMode 内部的生成端守卫会阻止所选部分禁止的操作,因此以此方式构建的文档通常会自动通过 CheckFileCompliance
示例
// Validate a delivered PDF/A file and print all issues
var
Issues, Count, I: Integer;
begin
Issues := PDF.CheckFileCompliance('archive.pdf', '', 1, 0);
if Issues = 0 then
WriteLn('archive.pdf: PDF/A conformant')
else
begin
Count := PDF.GetStringListCount(Issues);
WriteLn('archive.pdf: ', Count, ' PDF/A issue(s) detected:');
for I := 1 to Count do
WriteLn(' ', PDF.GetStringListItem(Issues, I));
end;
end;
// Fast pass/fail gate in a CI pipeline — stop on the first issue
var
Failed: Boolean;
begin
Failed := PDF.CheckFileCompliance('build/output.pdf', '', 1, 1) <> 0;
if Failed then
Halt(1);
end;另请参阅
Preflight Reports、CreatePreflightReport、CreatePreflightReportEx、SavePreflightReport、SavePreflightReportEx、ComparePreflightReports、SetPDFAMode、GetPDFUADiagnostics、GetStringListCount、GetStringListItem、SetPDFUAMode
合规性测试 3 审计 PDF/X(ISO 15930):版本标识、输出意图、页面几何、嵌入字体和禁止功能集;对 PDF/X-6 还会校验注释标志与固定外观、AcroForm 与签名外观、XFA 与查看器生成外观的排除、动作位置、动作链、允许的命名动作集合以及每个 UseBlackPtComp 值
合规性测试 4 审计 PDF/VT-3 标识元数据、其 PDF/X-6 家族基础、DPartRoot 与 DPart 图、DPM 名称与值、记录层级、页面顺序和精确的叶子覆盖;组合检查共享一次解析
合规性测试 5 审计 PDF/R-1 标记位置、版本与加密、第 0 代间接对象、受限字典与过滤器、单流页面程序、有序光栅条带、图像编码、页面覆盖和有效分辨率;可复用共享验证管线的解析
合规性测试 6 审计 PDF/X 基础与 PDF/VCR-1 XMP 标识、唯一的直接模板根、声明的字段、可选的页面选择字段和每个叶子 PassThrough 替换占位符、页面绑定、MCID 与外接框;可复用共享验证管线的解析
合规性测试 7 审计 PDF/E-1 标识与生命周期元数据、trailer 标识符、允许的加密、输出意图与设备色彩空间、内容算子、字体、注释、表单、可选内容、动作、外部文件引用、图形状态和 3D 流限制;可复用共享验证管线的解析