疑難排解:PDF/A 與 PDF/UA 驗證失敗
適用範圍
標題為「適用範圍」的區段這些條目涵蓋引擎為了讓文件維持在 PDF/A 或 PDF/UA 設定檔範圍內而引發的失敗。以下列出的條號,就是引擎在自身原始碼與例外訊息中引用的條號。本頁以自己的文字改述這些條號。引擎只會回報它偵測到的設定檔失敗,並不因此證明文件已符合規範。具權威性的符合性裁決,仍須由執行自有規則集的外部驗證程式作出。
條目:PDF/A 下加密遭拒
標題為「條目:PDF/A 下加密遭拒」的區段- 症狀。 出現
NextPDF\Security\Exception\IncompatiblePdfAModeException,訊息指出 PDF/A 模式禁止執行加密作業。 - 可能原因。 此流程同時啟用了某個 PDF/A 模式並要求加密。引擎引用 ISO 19005-{1,2,3,4} §6.1.3:PDF/A 檔案的 trailer 中不得出現
Encrypt鍵。不論呼叫順序為何,引擎一律將此視為絕對拒絕。 - 證據/診斷。
getContext()會回傳pdfa_mode與encryption_operation。失敗路徑測試tests/SecurityScenarios/PdfAEncryptionRefusalTest.php會斷言:不論 PDF/A 是在加密呼叫之前或之後啟用,都會觸發此拒絕。 - 解法。
- 判斷文件需要哪一項性質:封存符合性,或是加密。
- 若為封存用文件,請移除加密呼叫。
- 若為加密文件,請移除 PDF/A 的啟用呼叫。
- 重新執行該流程。
- 相關內容。 加密與權限。
條目:PDF/A-1 下影像篩選器遭禁用
標題為「條目:PDF/A-1 下影像篩選器遭禁用」的區段- 症狀。 影像匯入期間引發
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 設定檔均允許這些篩選器。 - 解法。
- 重新編碼來源影像,避免使用 JPEG 2000 或 JBIG2,例如另存為基線 JPEG,或改用 Flate 壓縮的影像。
- 或者將目標改為 PDF/A-2 或 PDF/A-3,這兩者均允許這些篩選器。
- 重新執行建置。
- 相關內容。 符合性參考文件。
條目:PDF/A 下字型未內嵌
標題為「條目:PDF/A 下字型未內嵌」的區段- 症狀。 PDF/A 建置在字型驗證步驟失敗;外部驗證程式回報有字型未內嵌。
- 可能原因。 有些字元是使用程式未內嵌的字型繪製。PDF/A 管理器合約規定每個字型都必須內嵌;任何 standard-14 字型未經內嵌都不被允許。
- 證據/診斷。
src/Contracts/PdfAManagerInterface.php宣告了validateFont(string $fontName, bool $isEmbedded, array $cmapForward),並載明規則「所有字型都必須內嵌;任何 standard 14 字型未經內嵌一律不允許。」實際強制執行邏輯則隨nextpdf/pro一併出貨。 - 解法。
- 找出回報為未內嵌的字型。
- 為該字型設定可內嵌的字型程式檔案,而非依賴內建的 standard-14 字體。
- 若想了解 Base 14 替代的交互影響,請閱讀「字型與標記」條目。
- 重新執行建置並重新驗證。
- 相關內容。 字型與標記。
條目:文件含 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。 - 解法。
- 從文件或表單欄位移除該 JavaScript 動作。
- 若該動作是功能所必需,這份文件就無法做成 PDF/A;請為該用途另外產生一份非 PDF/A 的版本。
- 重新執行建置並重新驗證。
- 相關內容。 符合性參考文件。
條目:已加標記的輸出未宣告 PDF/UA-2
標題為「條目:已加標記的輸出未宣告 PDF/UA-2」的區段- 症狀。 啟用標記後建置的文件未被辨識為 PDF/UA-2,或缺少 PDF/UA-2 宣告。
- 可能原因。 結構樹是空的。對於不含任何已加標記結構的文件,引擎不會宣告 PDF/UA-2,因為空的結構樹無法滿足該設定檔。
- 證據/診斷。 失敗路徑測試
tests/Integration/Accessibility/EmptyTaggedPdfDoesNotAdvertisePdfUa2Test.php會斷言:已加標記但內容為空的文件不會宣告 PDF/UA-2。這是引擎載明的行為,並非缺陷。 - 解法。
- 確認內容是透過標記路徑輸出的,讓結構樹填入內容,而不是空的。
- 驗證標記內容序列確實對映到結構元素。
- 重新執行建置,並重新檢查 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。 - 解法。
- 將文件層級語言設為有效的 BCP-47 標籤,例如
en-US或zh-Hant-TW。 - 若某段內容使用不同語言,請在該結構元素上設定語言。
- 重新執行建置並重新驗證。
- 將文件層級語言設為有效的 BCP-47 標籤,例如
- 相關內容。 字型與標記。
邊界情況與陷阱
標題為「邊界情況與陷阱」的區段- 此處所述的 PDF/A 與 PDF/UA 拒絕,均由引擎內部產生。它們與外部驗證程式的裁決彼此獨立,也不會取代外部裁決;請執行 veraPDF 之類的驗證程式,以取得權威結果。
- 具體的 PDF/A 必要物件寫入器(XMP 中繼資料串流、含 ICC 設定檔的輸出意圖)會在執行階段由
nextpdf/proresolve(解析)取得。若只安裝 core 套件,這些物件不會被輸出;僅含 core 的建置並不是完整的 PDF/A 產生器。 - 加密拒絕是絕對的,且與順序無關;即使在加密呼叫之後才啟用 PDF/A,仍會引發此拒絕。