Вступ
Підприємства, які зберігають контракти, фінансові звіти чи регуляторні документи, повинні тримати ці PDF у архівному форматі – PDF/A. Якщо хоча б один файл пройде без необхідної відповідності, аудитори можуть позначити всю партію, а дорогоцінна повторна обробка може бути запущена через кілька місяців. Підтримка ручних перевірок швидко стає непрактичною, коли щодня надходять сотні файлів.
GroupDocs.Metadata для .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.
Встановлення
Створіть новий консольний проєкт і додайте пакет:
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, який містить потрібну інформацію про тип файлу.
using GroupDocs.Metadata.Formats.Pdf;
// Inside the using block from Step 1
var root = metadata.GetRootPackage<PdfRootPackage>();
root.FileType містить два важливих властивості:
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надає точний рівень відповідності, який можна зберігати у логах, базах даних або аудиторських звітах.
Повний робочий приклад
Об’єднуючи три кроки, отримуємо компактну програму, готову до копіювання:
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. Автоматизовані архівні конвеєри – скануйте «drop‑folder», перевіряйте кожен 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)).