Введение

Предприятия, которые хранят контракты, финансовые отчёты или регуляторные документы, должны сохранять эти PDF в архивном формате — PDF/A. Если хотя бы один файл проходит без необходимого соответствия, аудиторы могут отметить всю партию, а дорогостоящая повторная обработка может быть запущена через несколько месяцев. Полагаться на ручные проверки быстро становится непрактично, когда ежедневно поступают сотни файлов.

GroupDocs.Metadata for .NET устраняет догадки. Предоставляя чёткий флаг IsPdfA и точное перечисление PdfFormat, библиотека сообщает в одной строке, соответствует ли документ какому‑либо уровню PDF/A и, если да, какой конкретной разновидности (например, PDF/A‑1b, PDF/A‑2u). В этом руководстве вы увидите, как внедрить эту логику в консольное приложение, открыть её через веб‑API и масштабировать для пакетной обработки.

К концу руководства вы сможете:

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

Почему точное определение PDF/A имеет решающее значение

Надёжная автоматизированная проверка помогает вам:

  • Оставаться готовыми к аудиту: Показать регуляторам, что каждый сохранённый PDF соответствует стандарту ISO 19005.
  • Сохранять визуальную точность: PDF/A гарантирует, что шрифты, цвета и макет сохраняются в будущих просмотрщиках.
  • Автоматизировать конвейеры загрузки: Отклонять несоответствующие файлы до того, как они попадут в вашу систему управления документами.
  • Избежать дорогостоящей переделки: Раннее обнаружение предотвращает дорогостоящую пакетную пере‑валидацию позже в жизненном цикле.

Требования

  • .NET 6.0 или новее.
  • GroupDocs.Metadata пакет NuGet (последняя версия).
  • Один или несколько PDF‑файлов, которые вы хотите оценить.
  • (Опционально) Временная оценочная лицензия — её можно получить в портале GroupDocs.

Установка

Create a new console project and add the package:

dotnet new console -n DetectPdfA
cd DetectPdfA

dotnet add package GroupDocs.Metadata

Шаг 1 – Инициализация движка Metadata

Сначала мы открываем PDF с помощью класса Metadata. Конструктор автоматически распознаёт формат файла, поэтому дополнительные параметры не требуются.

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.
}

Ключевой момент: Оператор using гарантирует своевременное освобождение нативных ресурсов, предотвращая утечки файловых дескрипторов в длительно работающих сервисах.

Шаг 2 – Получение корневого пакета, специфичного для PDF

GroupDocs.Metadata предоставляет строго типизированный корневой объект для каждого формата. Для PDF мы запрашиваем PdfRootPackage, который содержит информацию FileType, необходимую нам.

using GroupDocs.Metadata.Formats.Pdf;

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

root.FileType holds two properties of interest:

  • IsPdfAtrue, если документ соответствует какому‑либо уровню PDF/A.
  • PdfFormat — перечисление, например PdfA1b, PdfA2u и т.д., указывающее точную версию.

Шаг 3 – Выполнение проверки соответствия

Теперь мы считываем флаг и, при необходимости, выводим конкретную разновидность PDF/A.

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

Что вы видите:

  • Один булевый (IsPdfA) даёт мгновенный ответ «да/нет».
  • Когда true, PdfFormat предоставляет точный уровень соответствия, который можно сохранять в журналах, базах данных или аудиторских отчётах.

Полный рабочий пример

Putting the three steps together yields a compact, copy‑pasteable program:

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

Run the program with dotnet run. Sample output for a compliant file might look like:

✅ PDF/A compliant – version: PdfA2u

And for a non‑conforming file:

❌ The document is NOT PDF/A compliant.

Применения в реальном мире

1. Автоматизированные архивные конвейеры — Сканировать папку‑приёмник, проверять каждый PDF с помощью приведённого выше фрагмента и перемещать только соответствующие файлы в долгосрочный слой хранения.

2. Проверка загрузок для веб‑портала — Обернуть ту же логику в контроллер ASP.NET Core (см. необязательный фрагмент кода ниже), чтобы отклонять загрузки, не соответствующие PDF/A, до их сохранения.

3. Безсерверные проверки соответствия — Развернуть метод как Azure Function, который срабатывает при создании Blob, возвращая JSON‑payload со статусом соответствия.

// 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.
  • Параллелизуйте для больших пакетов — создавайте отдельный экземпляр Metadata для каждого файла внутри Parallel.ForEach; API потокобезопасен, если экземпляры не разделяются.

Устранение распространённых проблем

Проблема: root.FileType.PdfFormat возвращает null, хотя IsPdfA равно true.

  • Решение: Убедитесь, что используете GroupDocs.Metadata v23.6+ где перечисление полностью заполнено. Обновление пакета NuGet обычно решает проблему.

Проблема: Приложение падает с FileFormatException при повреждённом PDF.

  • Решение: Оберните вызов new Metadata(pdfPath) в try/catch, логируйте имя файла и пропускайте файл в пакетных сценариях.

Проблема: Высокое потребление памяти при обработке многогигабайтных PDF.

  • Решение: Включите режим потоковой передачи, создавая Metadata с FileStream и флагом enableStreaming, установленным в true (например, new Metadata(stream, true)).

Дополнительные ресурсы