Introduction

Perusahaan yang menyimpan kontrak, laporan keuangan, atau pengajuan regulasi harus menyimpan PDF‑nya dalam format arsip tingkat tinggi – PDF/A. Jika satu berkas saja lolos tanpa kepatuhan yang diperlukan, auditor dapat menandai seluruh batch, dan proses ulang yang mahal dapat dipicu berbulan‑bulan kemudian. Mengandalkan pemeriksaan manual menjadi tidak praktis ketika ratusan berkas tiba setiap hari.

GroupDocs.Metadata untuk .NET menghilangkan dugaan. Dengan menampilkan flag IsPdfA yang jelas dan enumerasi PdfFormat yang tepat, perpustakaan memberi tahu Anda dalam satu baris apakah dokumen memenuhi level PDF/A mana pun dan, jika ya, varian spesifik apa (mis., PDF/A‑1b, PDF/A‑2u) yang dipatuhi. Dalam tutorial ini Anda akan melihat cara menyematkan logika tersebut ke dalam aplikasi konsol, mengeksposnya melalui API web, dan menskalakannya untuk pemrosesan batch.

Pada akhir panduan Anda akan dapat:

  • Memuat PDF dengan kelas Metadata.
  • Menentukan kepatuhan PDF/A dengan properti Boolean.
  • Mengekstrak versi PDF/A yang tepat untuk berkas yang patuh.
  • Mengintegrasikan pemeriksaan ke dalam alur kerja yang lebih besar (pekerjaan batch, API, fungsi serverless).

Why Accurate PDF/A Detection Is Crucial

Pemeriksaan otomatis yang andal membantu Anda:

  • Stay audit‑ready: Tunjukkan kepada regulator bahwa setiap PDF yang disimpan memenuhi standar ISO 19005.
  • Preserve visual fidelity: PDF/A menjamin bahwa font, warna, dan tata letak tetap terjaga pada penampil di masa depan.
  • Automate ingestion pipelines: Tolak berkas yang tidak sesuai sebelum mencapai sistem manajemen dokumen Anda.
  • Avoid costly re‑work: Deteksi dini mencegah validasi ulang batch yang mahal di kemudian hari dalam siklus hidup.

Prerequisites

  • .NET 6.0 atau yang lebih baru.
  • Paket NuGet GroupDocs.Metadata (versi terbaru).
  • Satu atau lebih berkas PDF yang ingin Anda evaluasi.
  • (Opsional) Lisensi evaluasi sementara – Anda dapat memperolehnya dari portal GroupDocs.

Installation

Buat proyek konsol baru dan tambahkan paketnya:

dotnet new console -n DetectPdfA
cd DetectPdfA

dotnet add package GroupDocs.Metadata

Step 1 – Initialise the Metadata Engine

Pertama kita membuka PDF dengan kelas Metadata. Konstruktor secara otomatis mengenali format berkas, jadi tidak diperlukan parameter tambahan.

using GroupDocs.Metadata;

string pdfPath = "sample.pdf";

// Open the document – the using block guarantees the file handle is released.
using (Metadata metadata = new Metadata(pdfPath))
{
    // Subsequent steps go here.
}

Key point: Pernyataan using memastikan sumber daya native dibuang segera, mencegah kebocoran handle file pada layanan yang berjalan lama.

Step 2 – Get the PDF‑Specific Root Package

GroupDocs.Metadata menyediakan objek root yang kuat‑tipe untuk setiap format. Untuk PDF kita meminta PdfRootPackage, yang berisi informasi FileType yang kita butuhkan.

using GroupDocs.Metadata.Formats.Pdf;

// Inside the using block from Step 1
var root = metadata.GetRootPackage<PdfRootPackage>();

root.FileType memiliki dua properti yang penting:

  • IsPdfAtrue jika dokumen mematuhi level PDF/A mana pun.
  • PdfFormat – sebuah enum seperti PdfA1b, PdfA2u, dll., yang menunjukkan versi tepat.

Step 3 – Perform the Compliance Check

Sekarang kita membaca flag tersebut dan, bila berlaku, menampilkan varian PDF/A yang konkret.

if (root.FileType.IsPdfA)
{
    // Document conforms – report the exact version.
    Console.WriteLine($"✅ PDF/A compliant – version: {root.FileType.PdfFormat}");
}
else
{
    // Document does not meet PDF/A requirements.
    Console.WriteLine("❌ The document is NOT PDF/A compliant.");
}

What you see:

  • Sebuah Boolean tunggal (IsPdfA) memberikan jawaban langsung ya/tidak.
  • Ketika true, PdfFormat menyediakan level kepatuhan yang tepat, yang dapat Anda simpan dalam log, basis data, atau laporan audit.

Complete Working Example

Menggabungkan ketiga langkah menghasilkan program yang ringkas dan siap disalin:

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.");
            }
        }
    }
}

Jalankan program dengan dotnet run. Contoh output untuk berkas yang patuh mungkin terlihat seperti:

✅ PDF/A compliant – version: PdfA2u

Dan untuk berkas yang tidak patuh:

❌ The document is NOT PDF/A compliant.

Real‑World Applications

1. Automated archival pipelines – Pindai folder drop‑folder, validasi setiap PDF dengan cuplikan di atas, dan pindahkan hanya berkas yang patuh ke tier penyimpanan jangka panjang.

2. Upload validation for a web portal – Bungkus logika yang sama dalam kontroler ASP.NET Core (lihat cuplikan kode opsional di bawah) untuk menolak unggahan non‑PDF/A sebelum disimpan.

3. Serverless compliance checks – Deploy metode sebagai Azure Function yang dipicu pada pembuatan Blob, mengembalikan payload JSON dengan status kepatuhan.

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

Best Practices & Tips

  • Validate the path first – gunakan Path.GetFullPath dan periksa keberadaan berkas sebelum membuat Metadata untuk menghindari FileNotFoundException.
  • Keep the library up‑to‑date – rilis terbaru meningkatkan deteksi format dan memperbaiki bug pada kasus tepi.
  • Dispose promptly – pola using yang ditunjukkan di seluruh contoh menjamin sumber daya native dibebaskan.
  • Handle exceptions – bungkus konstruktor dalam try/catch dan log MetadataException untuk PDF yang rusak.
  • Parallelise for large batches – buat instance Metadata terpisah per berkas di dalam Parallel.ForEach; API bersifat thread‑safe selama instance tidak dibagikan.

Troubleshooting Common Issues

Problem: root.FileType.PdfFormat returns null even though IsPdfA is true.

  • Solution: Pastikan Anda menggunakan GroupDocs.Metadata v23.6+ di mana enum terisi penuh. Memperbarui paket NuGet biasanya menyelesaikan masalah.

Problem: The application crashes with FileFormatException on a corrupt PDF.

  • Solution: Bungkus pemanggilan new Metadata(pdfPath) dengan try/catch, log nama berkas, dan lewati berkas tersebut dalam skenario batch.

Problem: High memory consumption when processing multi‑gigabyte PDFs.

  • Solution: Aktifkan mode streaming dengan membangun Metadata menggunakan FileStream dan flag enableStreaming yang diset ke true (mis., new Metadata(stream, true)).

Additional Resources