Введение
Предприятия, которые хранят контракты, финансовые отчёты или регуляторные документы, должны сохранять эти 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:
IsPdfA—true, если документ соответствует какому‑либо уровню 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)).