介紹

儲存合約、財務報表或法規申報文件的企業必須將這些 PDF 以檔案保存等級的格式 – PDF/A 進行保存。如果有單一檔案未符合所需的相容性,稽核人員可能會標記整批檔案,並在數月後觸發昂貴的重新處理。當每天有數百個檔案陸續到達時,依賴人工檢查很快就變得不切實際。

GroupDocs.Metadata for .NET 消除了猜測。透過明確的 IsPdfA 標誌與精確的 PdfFormat 列舉,程式庫只需一行程式碼即可告訴您文件是否符合任何 PDF/A 級別,以及若符合,具體是哪一種變體(例如 PDF/A‑1b、PDF/A‑2u)。在本教學中,您將看到如何將此邏輯嵌入主控台應用程式、透過 Web API 暴露,並擴展至批次處理。

完成本指南後,您將能夠:

  • 使用 Metadata 類別載入 PDF。
  • 透過布林屬性判斷 PDF/A 相容性。
  • 為符合條件的檔案擷取精確的 PDF/A 版本。
  • 將檢查整合至更大的工作流程(批次作業、API、無伺服器函式)。

為何精確的 PDF/A 偵測至關重要

可靠且自動化的檢查可協助您:

  • 保持稽核就緒:向監管機構證明每個儲存的 PDF 都符合 ISO 19005 標準。
  • 保留視覺忠實度:PDF/A 確保字型、顏色與版面在未來的檢視器中仍能正確呈現。
  • 自動化匯入管線:在檔案進入文件管理系統前即拒絕不符合規範的檔案。
  • 避免昂貴的返工:早期偵測可防止在生命週期後期進行成本高昂的批次重新驗證。

前置條件

  • .NET 6.0 或更新版本。
  • GroupDocs.Metadata NuGet 套件(最新版本)。
  • 一個或多個您想要評估的 PDF 檔案。
  • (可選)臨時評估授權 – 可從 GroupDocs 入口網站取得。

安裝

建立新主控台專案並加入套件:

dotnet new console -n DetectPdfA
cd DetectPdfA

dotnet add package GroupDocs.Metadata

第 1 步 – 初始化 Metadata 引擎

首先使用 Metadata 類別開啟 PDF。建構子會自動辨識檔案格式,無需額外參數。

using GroupDocs.Metadata;

string pdfPath = "sample.pdf";

// 開啟文件 – using 區塊確保檔案句柄會被釋放。
using (Metadata metadata = new Metadata(pdfPath))
{
    // 後續步驟寫在此處。
}

重點說明: using 陳述式確保本機資源即時釋放,避免長時間執行的服務出現檔案句柄洩漏。

第 2 步 – 取得 PDF 專屬的根套件

GroupDocs.Metadata 為每種格式提供強型別的根物件。對於 PDF,我們請求 PdfRootPackage,其中包含我們需要的 FileType 資訊。

using GroupDocs.Metadata.Formats.Pdf;

// 在第 1 步的 using 區塊內
var root = metadata.GetRootPackage<PdfRootPackage>();

root.FileType 包含兩個關鍵屬性:

  • IsPdfA – 若文件符合任一 PDF/A 級別則為 true
  • PdfFormat – 如 PdfA1bPdfA2u 等列舉,指示確切的版本。

第 3 步 – 執行相容性檢查

現在讀取旗標,若適用則輸出具體的 PDF/A 變體。

if (root.FileType.IsPdfA)
{
    // 文件符合 – 回報精確版本。
    Console.WriteLine($"✅ PDF/A compliant – version: {root.FileType.PdfFormat}");
}
else
{
    // 文件未符合 PDF/A 要求。
    Console.WriteLine("❌ The document is NOT PDF/A compliant.");
}

您會看到:

  • 單一布林值 (IsPdfA) 即給出立即的通過/不通過答案。
  • true 時,PdfFormat 提供精確的相容等級,您可以將其寫入日誌、資料庫或稽核報告。

完整範例程式

將上述三個步驟合併,即可得到一個簡潔、可直接複製貼上的程式:

using System;
using GroupDocs.Metadata;
using GroupDocs.Metadata.Formats.Pdf;

class Program
{
    static void Main(string[] args)
    {
        string pdfPath = "sample.pdf";

        using (Metadata metadata = new Metadata(pdfPath))
        {
            var root = metadata.GetRootPackage<PdfRootPackage>();

            if (root.FileType.IsPdfA)
            {
                Console.WriteLine($"✅ PDF/A compliant – version: {root.FileType.PdfFormat}");
            }
            else
            {
                Console.WriteLine("❌ The document is NOT PDF/A compliant.");
            }
        }
    }
}

使用 dotnet run 執行程式。符合規範的檔案可能會輸出:

✅ PDF/A compliant – version: PdfA2u

而不符合規範的檔案則會顯示:

❌ The document is NOT PDF/A compliant.

真實案例應用

1. 自動化歸檔管線 – 監控投遞資料夾,使用上述程式碼驗證每個 PDF,僅將符合規範的檔案移至長期儲存層。

2. 網站上傳驗證 – 在 ASP.NET Core 控制器中包裝相同邏輯(見下方可選程式碼片段),於檔案持久化前拒絕非 PDF/A 上傳。

3. 無伺服器相容性檢查 – 將此方法部署為 Azure Function,於 Blob 建立時觸發,回傳包含相容性狀態的 JSON 負載。

// Minimal Azure Function payload (excerpt)
var result = new
{
    file = file.FileName,
    isPdfA = root.FileType.IsPdfA,
    format = root.FileType.IsPdfA ? root.FileType.PdfFormat.ToString() : null
};

最佳實踐與技巧

  • 先驗證路徑 – 使用 Path.GetFullPath 並在建立 Metadata 前檢查檔案是否存在,以避免 FileNotFoundException
  • 保持套件最新 – 新版會改進格式偵測並修正邊緣案例錯誤。
  • 即時釋放 – 前述的 using 模式確保本機資源被釋放。
  • 處理例外 – 將建構子包在 try/catch 中,記錄 MetadataException 以因應損毀的 PDF。
  • 批次平行化 – 在 Parallel.ForEach 內為每個檔案建立獨立的 Metadata 實例;只要不共享實例,API 即為執行緒安全。

常見問題排除

問題: root.FileType.PdfFormat 回傳 null,即使 IsPdfAtrue

  • 解決方案: 確認使用的是 GroupDocs.Metadata v23.6 以上版本,該版本已完整填入列舉。更新 NuGet 套件通常可解決此問題。

問題: 應用程式在處理損毀的 PDF 時拋出 FileFormatException

  • 解決方案:new Metadata(pdfPath) 呼叫外層加上 try/catch,記錄檔名,並在批次情境下跳過該檔案。

問題: 處理多 GB PDF 時記憶體使用量過高。

  • 解決方案:FileStream 建構 Metadata,並將 enableStreaming 旗標設為 true(例如 new Metadata(stream, true)),以啟用串流模式。

其他資源