CheckFileCompliance

合規性、文件檢查

PDF/UA 讀取器設定檔選擇

PDF/UA 檢查在 XMP 識別 pdfuaid:part=2 時選擇 part 2,否則沿用 part 1 檢查;本文描述的舊式 PDF/UA-1 檢查不表示適用於 part 2

PDF/UA-2 設定檔實作核心的識別、命名空間、角色與結構檢查;結構化報告使用 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(以 PDF/X-6 系列為基礎的 ISO 16612-3:2020)。
5 — PDF/R-1 受限點陣交換。
6 — PDF/VCR-1 可變內容取代範本。
7 — PDF/E-1 工程文件交換。
Options修改測試行為的位元旗標。

0 — 預設:回報文件中發現的每個問題。
1 — 在第一個問題後停止並立即傳回。當呼叫端只需要通過/失敗訊號時非常實用。

傳回值

0檔案符合所選標準。
非零StringListID 控制代碼,其項目描述每個偵測到的不符合項目。控制代碼在文件關閉或呼叫 ReleaseStringList 之前保持有效。

PDF/A 問題碼(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 部分都需要輸出意圖,才能明確定義描繪色彩空間。
00011目錄沒有 /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文件目錄沒有 /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 以參照方式內嵌另一個 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 必須是第一個」。
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 具有包含非 Adobe Glyph List 2.0 成員字形名稱的 /Differences 陣列。.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 陣列必須與內嵌字形計量一致。
10038Type 1 字型描述器的 /CharSet 遺漏其內嵌字型程式中存在的一或多個字形名稱。ISO 14289-1 §7.21.4.2 要求此項目列舉每個內嵌字形。
10039CID 字型描述器的 /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 明確禁止此情況——請拆分章節,或以編號的 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(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 標記位置、版本與加密、generation 0 間接物件、受限制的字典與濾器、單串流頁面程式、有序光柵條帶、影像編碼、頁面覆蓋與有效解析度;可重用共用的驗證管線剖析結果

合規測試 6 審計 PDF/X 基礎與 PDF/VCR-1 XMP 識別、單一直接範本根節點、宣告的欄位、選配的頁面選擇欄位、每個葉節點 PassThrough 取代佔位項、頁面繫結、MCID 與外接框;可重用共用的驗證管線剖析結果

合規測試 7 審計 PDF/E-1 識別與生命週期中繼資料、trailer 識別碼、允許的加密、輸出意圖與設備色彩空間、內容運算元、字型、註解、表單、選用內容、動作、外部檔案參照、圖形狀態與 3D 串流限制;可重用共用的驗證管線剖析結果