CheckFileComplianceA

合规性、文档检查

描述

末尾的 A 表示 ANSI(char)DLL 入口点,ActiveX/COM 接口仅公开 Unicode 形式。其行为与 CheckFileCompliance 相同,字符串参数会按照当前的 SetAnsiMode 代码页进行解释

读取外部 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 DLCheckFileComplianceA(InstanceID: Integer; InputFileName, Password: PAnsiChar; ComplianceTest, Options: Integer): Integer;

DLL

int DLCheckFileComplianceA(int InstanceID, const char * InputFileName, const char * 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)
Options修改测试的位标志

0 — 默认:报告文档中发现的每个问题
1 — 在第一个问题后停止并立即返回。当调用方仅需通过或失败信号时很有用

返回值

0文件符合所选标准
Non-zero一个 StringListID 句柄,其条目描述每个检测到的不符合项。该句柄在文档关闭或调用 ReleaseStringList 前始终有效

PDF/A 问题代码(ComplianceTest = 1)

00002PDF 版本超过一致性级别允许的最大值(PDF/A-1 上限为 1.4;PDF/A-2 和 PDF/A-3 上限为 1.7),详细行会列出违规版本及允许的最大值
00003Catalog 包含 /OCProperties(可选内容 / 图层),而 PDF/A-1 禁止此项。PDF/A-2 和 PDF/A-3 允许图层,因此不会触发此检查
00005XMP pdfaid:part+pdfaid:conformance 对缺失、格式错误,或包含合法集合 1A、1B、2A、2B、3A、3B 之外的值。库无法确定要应用的规则集,因此无论 Options 如何,此问题都会报告为致命问题
00006该文档已加密 PDF/A 的所有部分均禁止加密
00007Catalog 没有 /OutputIntents 条目,所有 PDF/A 部分都需要输出意图,以便明确确定渲染色彩空间
00011Catalog 没有 /MarkInfo 条目。仅 a 级一致性(PDF/A-1a、2a、3a)要求此项 鈥?带标记 PDF 必须声明自身
00012目录没有 /StructTreeRoot 条目,仅 a 级一致性需要该条目,带标记 PDF 文档必须具有逻辑结构树

PDF/UA-1 问题代码(ComplianceTest = 2)

10001XMP 元数据流不包含 pdfuaid:part,或其值不是 1。ISO 14289-1 §5 要求合规文件通过此属性标识自身;ISO 14289-1 §6.2 禁止在缺少该属性时报告合规性
10002文档 Catalog 没有 /Metadata 流。PDF/UA-1 一致性声明记录在此流中;没有它,文件无法声明自身可访问
10003Catalog /MarkInfo 字典缺失,或 /Marked 不为 true。ISO 14289-1 §7.1 要求每个合规文件声明自身已加标签,以便辅助技术可以依赖结构树
10004目录没有 /StructTreeRoot 条目,PDF/UA-1 文件必须包含描述文档阅读顺序和语义的逻辑结构树
10005/ViewerPreferences 字典缺失,或其 /DisplayDocTitle 条目不是 true。ISO 14289-1 §7.1 要求符合规范的阅读器在其窗口界面中显示文档标题而非文件名
10006Catalog /Lang 条目缺失或为空 ISO 14289-1 §7.2(引用 ISO 32000-1 §14.9.2)要求每个符合规范的文件声明其自然语言,以便屏幕阅读器选择正确的语音和发音规则
10007XMP 元数据流不包含非空 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 要求此类页面的制表顺序遵循结构树,并以 /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 注释 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 编码必须仅通过嵌入式字体程序's 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 注释携带 URI 动作字典,其 /IsMap 条目为 true。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 程序(Symbolic 标志已清除且存在 FontFile2 流的 FontDescriptor)嵌入的 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 中
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 明确禁止此情况——请拆分节,或以编号的 H1..H6 级别替换 H 标签

备注

PDF/A 测试旨在交付前快速自检。它会捕获可直接取消文件资格的文档级问题(错误 PDF 版本、缺失 OutputIntent、A 级缺失结构树、加密、PDF/A-1 中的图层)。它不会遍历每个内容流运算符,也不会验证每个绘制对象的字体嵌入或颜色空间引用 鈥?这些验证需要专用 PDF/A 验证器(如 veraPDF)。将此函数作为第一线检查和构建管线的回归门。需要库将问题列表格式化为可重用文本报告时,使用 CreatePreflightReport 或 SavePreflightReport。需要文本、JSON、HTML 或 CSV 报告输出时,使用 CreatePreflightReportEx 或 SavePreflightReportEx,或参阅 Preflight Reports 了解完整报告工作流

配套 API GetPDFUADiagnostics 会对当前正在构建的内存中文档执行类似的 PDF/UA-1(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;

另请参阅

预检报告、CreatePreflightReport、CreatePreflightReportEx、SavePreflightReport、SavePreflightReportEx、ComparePreflightReports、SetPDFAMode、GetPDFUADiagnostics、GetStringListCount、GetStringListItem、SetPDFUAMode