跳到內容

疑難排解:PDF/A 與 PDF/UA 驗證失敗

這些條目涵蓋引擎為了讓文件維持在 PDF/A 或 PDF/UA 設定檔範圍內而引發的失敗。以下列出的條號,就是引擎在自身原始碼與例外訊息中引用的條號。本頁以自己的文字改述這些條號。引擎只會回報它偵測到的設定檔失敗,並不因此證明文件已符合規範。具權威性的符合性裁決,仍須由執行自有規則集的外部驗證程式作出。

  • 症狀。 出現 NextPDF\Security\Exception\IncompatiblePdfAModeException,訊息指出 PDF/A 模式禁止執行加密作業。
  • 可能原因。 此流程同時啟用了某個 PDF/A 模式並要求加密。引擎引用 ISO 19005-{1,2,3,4} §6.1.3:PDF/A 檔案的 trailer 中不得出現 Encrypt 鍵。不論呼叫順序為何,引擎一律將此視為絕對拒絕。
  • 證據/診斷。 getContext() 會回傳 pdfa_modeencryption_operation。失敗路徑測試 tests/SecurityScenarios/PdfAEncryptionRefusalTest.php 會斷言:不論 PDF/A 是在加密呼叫之前或之後啟用,都會觸發此拒絕。
  • 解法。
    1. 判斷文件需要哪一項性質:封存符合性,或是加密。
    2. 若為封存用文件,請移除加密呼叫。
    3. 若為加密文件,請移除 PDF/A 的啟用呼叫。
    4. 重新執行該流程。
  • 相關內容。 加密與權限
  • 症狀。 影像匯入期間引發 Pdf14FeatureRejectedException,訊息點名 /JPXDecode/JBIG2Decode,並引用條號 ISO 19005-1:2005 §6.1.13
  • 可能原因。 某個 PDF/A-1 建置匯入了以 PDF 1.4 之後才導入的篩選器編碼的影像。PDF/A-1 以 PDF 1.4 功能集為目標,因此 PdfA1FeatureGuard 會拒絕 JPEG 2000(/JPXDecode)與 JBIG2(/JBIG2Decode)。
  • 證據/診斷。 src/Writer/PdfA1FeatureGuard.php 保存這份禁用篩選器清單,並會帶著所引用的條號引發例外。這項防護只會在 PDF/A-1 設定檔下拒絕;PDF/A-2、PDF/A-3 與 PDF 2.0 設定檔均允許這些篩選器。
  • 解法。
    1. 重新編碼來源影像,避免使用 JPEG 2000 或 JBIG2,例如另存為基線 JPEG,或改用 Flate 壓縮的影像。
    2. 或者將目標改為 PDF/A-2 或 PDF/A-3,這兩者均允許這些篩選器。
    3. 重新執行建置。
  • 相關內容。 符合性參考文件
  • 症狀。 PDF/A 建置在字型驗證步驟失敗;外部驗證程式回報有字型未內嵌。
  • 可能原因。 有些字元是使用程式未內嵌的字型繪製。PDF/A 管理器合約規定每個字型都必須內嵌;任何 standard-14 字型未經內嵌都不被允許。
  • 證據/診斷。 src/Contracts/PdfAManagerInterface.php 宣告了 validateFont(string $fontName, bool $isEmbedded, array $cmapForward),並載明規則「所有字型都必須內嵌;任何 standard 14 字型未經內嵌一律不允許。」實際強制執行邏輯則隨 nextpdf/pro 一併出貨。
  • 解法。
    1. 找出回報為未內嵌的字型。
    2. 為該字型設定可內嵌的字型程式檔案,而非依賴內建的 standard-14 字體。
    3. 若想了解 Base 14 替代的交互影響,請閱讀「字型與標記」條目。
    4. 重新執行建置並重新驗證。
  • 相關內容。 字型與標記

條目:文件含 JavaScript 導致 PDF/A 驗證失敗

標題為「條目:文件含 JavaScript 導致 PDF/A 驗證失敗」的區段
  • 症狀。 PDF/A 建置在 JavaScript 驗證步驟失敗,或外部驗證程式回報有 JavaScript 動作。
  • 可能原因。 文件或某個表單欄位含有 JavaScript 動作。PDF/A 管理器合約引用 ISO 19005-4:2020 §6.7.1,該條禁止 JavaScript 動作。
  • 證據/診斷。 PdfAManagerInterface::validateNoJavaScript()validateNoJavaScriptActions() 都在其文件區塊引用 §6.7.1。
  • 解法。
    1. 從文件或表單欄位移除該 JavaScript 動作。
    2. 若該動作是功能所必需,這份文件就無法做成 PDF/A;請為該用途另外產生一份非 PDF/A 的版本。
    3. 重新執行建置並重新驗證。
  • 相關內容。 符合性參考文件

條目:已加標記的輸出未宣告 PDF/UA-2

標題為「條目:已加標記的輸出未宣告 PDF/UA-2」的區段
  • 症狀。 啟用標記後建置的文件未被辨識為 PDF/UA-2,或缺少 PDF/UA-2 宣告。
  • 可能原因。 結構樹是空的。對於不含任何已加標記結構的文件,引擎不會宣告 PDF/UA-2,因為空的結構樹無法滿足該設定檔。
  • 證據/診斷。 失敗路徑測試 tests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.php 會斷言:已加標記但內容為空的文件不會宣告 PDF/UA-2。這是引擎載明的行為,並非缺陷。
  • 解法。
    1. 確認內容是透過標記路徑輸出的,讓結構樹填入內容,而不是空的。
    2. 驗證標記內容序列確實對映到結構元素。
    3. 重新執行建置,並重新檢查 PDF/UA-2 狀態。
  • 相關內容。 字型與標記

條目:PDF/UA-2 因語言缺失或無效而失敗

標題為「條目:PDF/UA-2 因語言缺失或無效而失敗」的區段
  • 症狀。 語言項目缺失,或不是有效的標籤,導致 PDF/UA-2 檢查失敗。
  • 可能原因。 文件或某個結構元素缺少有效的語言設定。PDF/UA-2 要求宣告自然語言;缺失或格式錯誤的 Lang 值都無法通過嚴格檢查。
  • 證據/診斷。 失敗路徑測試 tests/Unit/Conformance/PdfUa2Section844LangStrictTest.php 涵蓋此嚴格語言要求。語言標籤會透過 src/Accessibility/Bcp47Validator.php 驗證;無效的標籤會引發 src/Accessibility/InvalidBcp47TagException.php
  • 解法。
    1. 將文件層級語言設為有效的 BCP-47 標籤,例如 en-USzh-Hant-TW
    2. 若某段內容使用不同語言,請在該結構元素上設定語言。
    3. 重新執行建置並重新驗證。
  • 相關內容。 字型與標記
  • 此處所述的 PDF/A 與 PDF/UA 拒絕,均由引擎內部產生。它們與外部驗證程式的裁決彼此獨立,也不會取代外部裁決;請執行 veraPDF 之類的驗證程式,以取得權威結果。
  • 具體的 PDF/A 必要物件寫入器(XMP 中繼資料串流、含 ICC 設定檔的輸出意圖)會在執行階段由 nextpdf/pro resolve(解析)取得。若只安裝 core 套件,這些物件不會被輸出;僅含 core 的建置並不是完整的 PDF/A 產生器。
  • 加密拒絕是絕對的,且與順序無關;即使在加密呼叫之後才啟用 PDF/A,仍會引發此拒絕。

詞彙表:輸出意圖 · 結構樹