CheckFileComplianceA

合規性、文件檢查

描述

結尾的 A 表示 ANSI(char)DLL 進入點,ActiveX/COM 介面僅公開 Unicode 形式。其行為與 CheckFileCompliance 相同,字串引數會依據目前的 SetAnsiMode 字碼頁進行解譯

讀取外部 PDF 檔案,依選定的 ISO 符合性標準驗證。傳回值為零(檔案乾淨通過所選測試)或非零的 StringListID handle,列出每個偵測到的問題。清單中每一筆都是短代碼、冒號與人類可讀訊息 — 與 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-zeroStringListID 控制代碼,其條目描述每個偵測到的不符合項目。控制代碼在文件關閉或呼叫 ReleaseStringList 之前保持有效。

PDF/A issue codes (ComplianceTest = 1)

00002PDF 版本超過符合性層級允許的最大值(PDF/A-1 上限 1.4;PDF/A-2 與 PDF/A-3 上限 1.7)。詳細行會指出違規版本與允許的最大值。
00003目錄含 /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 在每個部分都禁止加密。
00007目錄沒有 /OutputIntents 項目。所有 PDF/A 部分都需要輸出意圖,描繪色彩空間才能明確定義。
00011Catalog 沒有 /MarkInfo 項目。只有 a 級符合性(PDF/A-1a、2a、3a)需要 — 標籤式 PDF 必須自我宣告。
00012目錄沒有 /StructTreeRoot 項目。只有 a 層級符合性需要。標籤式 PDF 文件必須有邏輯結構樹。

PDF/UA-1 issue codes (ComplianceTest = 2)

10001XMP 中繼資料串流不含 pdfuaid:part,或其值不是 1。ISO 14289-1 §5 要求符合規範的檔案透過此屬性自我識別;ISO 14289-1 §6.2 禁止在缺少該屬性的情況下宣稱符合規範。
10002文件目錄沒有 /Metadata 串流。PDF/UA-1 符合性聲明記錄在此串流中;缺少它時,檔案無法宣告自身為無障礙文件。
10003目錄的 /MarkInfo 字典遺失,或 /Marked 不是 true。ISO 14289-1 §7.1 要求每個符合規範的檔案自我宣告為標籤式,輔助技術才能依賴結構樹。
10004目錄沒有 /StructTreeRoot 項目。PDF/UA-1 檔案必須包含描述文件閱讀順序與語義的邏輯結構樹。
10005/ViewerPreferences 字典遺失,或其 /DisplayDocTitle 項目不是 true。ISO 14289-1 §7.1 要求符合規範的閱讀器在視窗介面顯示文件標題,而不是檔名。
10006目錄的 /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 以參照方式內嵌另一份,而不向輔助技術公開被參照的內容。
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 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 必須是第一個。」
10025One or more heading-level skips were detected in document order — e.g. an H1 immediately followed by an H3, skipping H2. ISO 14289-1 §7.4.2 requires descending heading sequences to proceed in strict numerical order without skipping intervening levels.
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 內。
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 中的圖層)。它不會走訪每個 content-stream 運算子,也不會為每個繪製物件驗證字型內嵌或色彩空間參照 — 這類驗證需要專用的 PDF/A 驗證器(例如 veraPDF)。此函式適合當作第一線檢查與建置 pipeline 的迴歸關卡。要讓程式庫把問題清單格式化成可重複使用的文字報告,請用 CreatePreflightReport 或 SavePreflightReport。文字、JSON、HTML 或 CSV 報告輸出請用 CreatePreflightReportEx 或 SavePreflightReportEx,完整報告工作流程見 Preflight Reports。

配套 API GetPDFUADiagnostics 針對目前正在建構的記憶體內文件(而不是外部檔案)執行 PDF/UA-1(ISO 14289-1)的類似檢查。

用本程式庫產出 PDF/A 時,加入任何內容之前先呼叫 SetPDFAMode。ConvertToPDFA 內建的產生端防護可涵蓋未經此設定的文件

範例

// 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