はじめに

契約書、財務諸表、または規制提出書類を保管する企業は、これらの PDF をアーカイブ向けのフォーマット – PDF/A で保存しなければなりません。必要な適合性を満たさないファイルが 1 つでも混入すると、監査人がバッチ全体にフラグを付け、数か月後に高額な再処理が発生する可能性があります。数百ファイルが毎日届く環境で手作業チェックに依存することは、すぐに非現実的になります。

GroupDocs.Metadata for .NET は推測の余地を排除します。IsPdfA フラグと正確な PdfFormat 列挙型を公開することで、ライブラリは 1 行でドキュメントが任意の 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 ファイル 1 つ以上。
  • (任意)一時評価ライセンス – GroupDocs ポータルから取得可能です。

インストール

新しいコンソール プロジェクトを作成し、パッケージを追加します。

dotnet new console -n DetectPdfA
cd DetectPdfA

dotnet add package GroupDocs.Metadata

手順 1 – メタデータエンジンの初期化

まず 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 には次の 2 つのプロパティがあります。

  • IsPdfA – ドキュメントが任意の PDF/A レベルに準拠している場合は true
  • PdfFormatPdfA1bPdfA2u など、正確なバージョンを示す列挙型。

手順 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 が正確な準拠レベルを提供し、ログやデータベース、監査レポートに保存できます。

完全な動作例

3 つの手順を組み合わせた、コピー&ペースト可能なプログラムは以下の通りです。

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. Web ポータルのアップロード検証 – 同じロジックを 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 インスタンスを作成すれば、インスタンスを共有しない限りスレッドセーフです。

一般的な問題のトラブルシューティング

問題: root.FileType.PdfFormatnull を返すが、IsPdfAtrue のまま。

  • 解決策: GroupDocs.Metadata v23.6 以降を使用しているか確認してください。列挙型が完全に埋められたバージョンに更新すると解決します。

問題: 破損した PDF で FileFormatException が発生する。

  • 解決策: new Metadata(pdfPath) 呼び出しを try/catch で囲み、ファイル名をログに残してバッチ処理時にスキップします。

問題: マルチギガバイト PDF を処理するとメモリ使用量が高くなる。

  • 解決策: MetadataFileStreamenableStreaming フラグ true で構築し、ストリーミング モードを有効にします(例: new Metadata(stream, true))。

追加リソース