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)
| 00002 | PDF 版本超過符合性層級允許的最大值(PDF/A-1 上限為 1.4;PDF/A-2 與 PDF/A-3 上限為 1.7)。詳細行會指出違規的版本與允許的最大值。 |
|---|---|
| 00003 | 目錄包含 /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 | 目錄沒有 /OutputIntents 項目。所有 PDF/A 部分都需要輸出意圖,才能明確定義描繪色彩空間。 |
| 00011 | 目錄沒有 /MarkInfo 項目。只有 a 層級符合性(PDF/A-1a、2a、3a)需要此項——標籤式 PDF 必須自我宣告。 |
| 00012 | 目錄沒有 /StructTreeRoot 項目。只有 a 層級符合性需要此項。標籤式 PDF 文件必須具有邏輯結構樹。 |
PDF/UA-1 問題碼(ComplianceTest = 2)
| 10001 | XMP 中繼資料串流不包含 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)要求每個符合規範的檔案宣告其自然語言,讓螢幕助讀程式選取正確的語音與發音規則。 |
| 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 要求這類頁面上的定位順序遵循結構樹,而這由 /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 陣列必須與內嵌字形計量一致。 |
| 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 明確禁止此情況——請拆分章節,或以編號的 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 串流限制;可重用共用的驗證管線剖析結果