Introduction

Підприємства, які зберігають контракти, фінансові звіти чи регуляторні документи, повинні тримати ці PDF у архівному форматі — PDF/A. Якщо хоча б один файл не відповідає вимогам, аудитори можуть позначити всю партію, а дорогі повторні обробки можуть розпочатися через кілька місяців. Ручна перевірка швидко стає непрактичною, коли щодня надходять сотні файлів.

GroupDocs.Metadata для .NET усуває здогадки. Завдяки чітко вираженому IsPdfA‑прапору та точному перерахуванню PdfFormat, бібліотека в одній лінії коду повідомляє, чи документ відповідає будь‑якому рівню PDF/A, і, якщо так, який саме варіант (наприклад, PDF/A‑1b, PDF/A‑2u). У цьому посібнику ви побачите, як підключити цю логіку до консольного застосунку, експортувати її через веб‑API та масштабувати для пакетної обробки.

Після завершення керівництва ви зможете:

  • Завантажити PDF за допомогою класу Metadata.
  • Визначити відповідність PDF/A за допомогою булевого властивості.
  • Отримати точну версію PDF/A для файлів, що відповідають вимогам.
  • Інтегрувати перевірку у великі робочі процеси (пакетні завдання, API, безсерверні функції).

Why Accurate PDF/A Detection Is Crucial

Надійна автоматизована перевірка допомагає:

  • Бути готовим до аудиту: Показати регуляторам, що кожен збережений PDF відповідає стандарту ISO 19005.
  • Зберігати візуальну цілісність: PDF/A гарантує, що шрифти, кольори та розмітка залишаються незмінними у майбутніх переглядачах.
  • Автоматизувати конвеєри інжестії: Відхиляти файли, що не відповідають вимогам, ще до їх потрапляння у систему управління документами.
  • Уникати дорогих переробок: Раннє виявлення запобігає витратним пакетним повторним перевіркам у подальшому життєвому циклі.

Prerequisites

  • .NET 6.0 або новіша версія.
  • GroupDocs.Metadata пакет NuGet (остання версія).
  • Один або кілька PDF‑файлів, які потрібно оцінити.
  • (Опціонально) Тимчасова ліцензія для оцінки — її можна отримати на порталі GroupDocs.

Installation

Створіть новий консольний проєкт і додайте пакет:

dotnet new console -n DetectPdfA
cd DetectPdfA

dotnet add package GroupDocs.Metadata

Step 1 – Initialise the Metadata Engine

Спочатку відкриваємо PDF за допомогою класу Metadata. Конструктор автоматично розпізнає формат файлу, тому додаткові параметри не потрібні.

using GroupDocs.Metadata;

string pdfPath = "sample.pdf";

// Відкриваємо документ – блок using гарантує, що дескриптор файлу буде звільнено.
using (Metadata metadata = new Metadata(pdfPath))
{
    // Подальші кроки розташовуються тут.
}

Ключовий момент: оператор using забезпечує швидке звільнення нативних ресурсів, запобігаючи витокам дескрипторів файлів у довготривалих сервісах.

Step 2 – Get the PDF‑Specific Root Package

GroupDocs.Metadata надає строго типізований кореневий об’єкт для кожного формату. Для PDF‑файлів ми запитуємо PdfRootPackage, який містить потрібну інформацію про FileType.

using GroupDocs.Metadata.Formats.Pdf;

// Усередині блоку using з кроку 1
var root = metadata.GetRootPackage<PdfRootPackage>();

root.FileType містить два важливих властивості:

  • IsPdfA — true, якщо документ відповідає будь‑якому рівню PDF/A.
  • PdfFormat — перелік типу, наприклад PdfA1b, PdfA2u тощо, що вказує точну версію.

Step 3 – Perform the Compliance Check

Тепер читаємо прапорець і, за потреби, виводимо конкретний варіант 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 надає точний рівень відповідності, який можна зберігати в логах, базах даних або аудиторських звітах.

Complete Working Example

Об’єднуючи три кроки, отримуємо компактну програму, готову до копіювання:

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.

Real‑World Applications

1. Автоматизовані архівні конвеєри — скануйте «drop‑folder», перевіряйте кожен PDF за допомогою наведеного фрагмента коду та переміщуйте лише відповідні файли у довгострокове сховище.

2. Валідація завантажень у веб‑порталі — обгорніть ту ж логіку в контролер ASP.NET Core (див. необов’язковий код нижче), щоб відхилити завантаження, які не є PDF/A, ще до їх збереження.

3. Безсерверні перевірки відповідності — розгорніть метод як Azure Function, що спрацьовує при створенні Blob, і повертає JSON‑payload зі статусом відповідності.

// Мінімальний фрагмент Azure Function (excerpt)
var result = new
{
    file = file.FileName,
    isPdfA = root.FileType.IsPdfA,
    format = root.FileType.IsPdfA ? root.FileType.PdfFormat.ToString() : null
};

Best Practices & Tips

  • Перевіряйте шлях заздалегідь — використовуйте Path.GetFullPath і перевіряйте існування файлу перед створенням Metadata, щоб уникнути FileNotFoundException.
  • Тримайте бібліотеку актуальною — нові випуски покращують розпізнавання форматів і виправляють крайові баги.
  • Вивільняйте ресурси одразу — шаблон using, показаний вище, гарантує звільнення нативних ресурсів.
  • Обробляйте виключення — обгорніть конструктор у try/catch і логуйте MetadataException для пошкоджених PDF.
  • Паралелізуйте великі пакети — створюйте окремий екземпляр Metadata для кожного файлу всередині Parallel.ForEach; API є потокобезпечним, якщо екземпляри не діляться між потоками.

Troubleshooting Common Issues

Проблема: root.FileType.PdfFormat повертає null, хоча IsPdfA дорівнює true.

  • Рішення: Переконайтеся, що використовується GroupDocs.Metadata v23.6+ — у цій версії перелік enum‑ів заповнюється повністю. Оновлення пакету NuGet зазвичай вирішує проблему.

Проблема: Додаток падає з FileFormatException на пошкодженому PDF.

  • Рішення: Обгорніть виклик new Metadata(pdfPath) у try/catch, залогуйте ім’я файлу та пропустіть його під час пакетної обробки.

Проблема: Велика витрата пам’яті при обробці багатогігабайтних PDF.

  • Рішення: Увімкніть режим потокової обробки, створюючи Metadata з FileStream та прапором enableStreaming, встановленим у true (наприклад, new Metadata(stream, true)).

Additional Resources