Эта страница может содержать автоматически переведенный текст.
Преобразование PDF в PDF/A
В этой статье объясняется, как преобразовывать PDF-документы в PDF/A с помощью Docotic.Pdf. Эта библиотека .NET включает высокопроизводительный конвертер PDF в PDF/A, который работает полностью офлайн. Также вы можете использовать Docotic.Pdf для создания документов PDF/A с нуля.

Зачем преобразовывать PDF в PDF/A?
PDF/A — это специальная версия PDF, предназначенная для архивирования. Преобразование стандартных PDF-документов в PDF/A дает несколько преимуществ:
-
Долговременное хранение
Документы PDF/A остаются доступными и пригодными для использования многие годы, что делает их идеальными для юридических, государственных и архивных целей. -
Соответствие нормативным требованиям
Отрасли со строгими требованиями к соответствию и правовыми нормами часто хранят документы в PDF/A. -
Единообразный внешний вид во всех PDF-просмотрщиках
Документы PDF/A отображаются одинаково в разных системах и в разных PDF-просмотрщиках.
Прочитайте статью Что такое PDF/A?, чтобы узнать больше о стандарте PDF/A.
PDF в PDF/A в C#
Чтобы преобразовать PDF в PDF/A, вам понадобятся:
- Docotic.Pdf с надстройкой Conformance.
- Лицензионный ключ. Вы можете получить бесплатную лицензию с ограничением по времени на странице загрузки.
Следующий код C# преобразует PDF-файл в PDF/A-4:
using var pdf = new PdfDocument("input.pdf");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa4);
Метод SaveAsPdfa предоставляется надстройкой в пространстве имен BitMiracle.Docotic.Pdf.Conformance. Он поддерживает все уровни соответствия PDF/A: PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-2u, PDF/A-3a, PDF/A-3b, PDF/A-3u, PDF/A-4, PDF/A-4e, PDF/A-4f. Выходные данные можно записать либо в файл, либо в поток.
Если исходный документ нельзя преобразовать к запрошенному уровню соответствия PDF/A, SaveAsPdfa вызывает ConformanceException. См. раздел Обработка ошибок для подробностей.
Продвинутые сценарии преобразования
Docotic.Pdf поддерживает широкий спектр рабочих процессов PDF/A, включая создание документов PDF/A с нуля, преобразование HTML в PDF/A и объединение документов в один файл PDF/A.
Создание документов PDF/A
Docotic.Pdf предоставляет разные способы создания PDF-документов в .NET. Вы можете использовать тот же метод SaveAsPdfa для создания документов PDF/A с помощью Core API или Layout API.
Этот код C# создает документ PDF/A-3u с использованием Core API:
using var pdf = new PdfDocument();
pdf.Pages[0].Canvas.DrawString("Hello PDF/A");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3U);
С помощью Layout API вы создаете обычный PDF-документ, а затем преобразуете его в PDF/A. Этот пример кода показывает, как создать документ PDF/A-1b:
using var ms = new MemoryStream();
PdfDocumentBuilder.Create().Generate(ms, doc => doc.Pages(pages =>
{
pages.Content().Text("Hello, world!");
}));
using var pdf = new PdfDocument(ms);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);
HTML в PDF/A
Надстройка HtmlToPdf преобразует HTML в PDF. Чтобы подготовить результат к архивированию, сохраните сгенерированный PDF как PDF/A:
var uri = new Uri("https://google.com");
var options = new HtmlConversionOptions
{
PreserveStructureInformation = true,
};
using var converter = await HtmlConverter.CreateAsync();
using var pdf = await converter.CreatePdfAsync(uri, options);
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa3A);
Параметр PreserveStructureInformation = true помогает создавать документы с поддержкой специальных возможностей. Это важно для уровней соответствия PDF/A-1a, PDF/A-2a и PDF/A-3a.
Объединение PDF-документов в PDF/A
Docotic.Pdf поддерживает объединение PDF-документов. Замените вызов PdfDocument.Save на SaveAsPdfa, чтобы сохранить объединенный документ как PDF/A:
using var pdf = new PdfDocument("first.pdf");
pdf.Append("second.pdf");
pdf.SaveAsPdfa("merged.pdf", PdfaConformanceLevel.Pdfa1B);
Вы можете применять тот же принцип в других сценариях редактирования PDF. Например, удалять страницы PDF, редактировать текст, сворачивать поля форм и в конце сохранять как PDF/A.
Создание файлов ZUGFeRD / Factur-X в C#
Factur-X / ZUGFeRD — это европейский стандарт электронных счетов, основанный на PDF/A-3. Вы можете использовать Docotic.Pdf, чтобы встроить XML-файл счета и создать корректный документ Factur-X / ZUGFeRD:
using var pdf = new PdfDocument();
PdfFileSpecification xml = pdf.CreateFileAttachment("your_path_to/xrechnung.xml");
xml.Relationship = "Alternative";
pdf.SharedAttachments.Add(xml);
var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("INVOICE")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("xrechnung.xml")));
props.Add(new XmpProperty("Version", new XmpString("3.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("XRECHNUNG")));
pdf.Metadata.Schemas.Add(fx);
pdf.SaveAsPdfa("zugferd.pdf", PdfaConformanceLevel.Pdfa3A);
Создание документов Order-X
Order-X — еще один стандарт ЕС, который позволяет выполнять электронную обработку заказов на поставку. Этот фрагмент кода C# показывает, как создать документ Order-X с использованием профиля COMFORT:
using var pdf = new PdfDocument();
using (var file = File.OpenRead("order-data-comfort.xml"))
{
PdfFileSpecification xml = pdf.CreateFileAttachment(file, "order-x.xml");
xml.Relationship = "Data";
pdf.SharedAttachments.Add(xml);
}
var fx = new XmpSchema("fx", "urn:factur-x:pdfa:CrossIndustryDocument:1p0#");
var props = fx.Properties;
props.Add(new XmpProperty("DocumentType", new XmpString("ORDER")));
props.Add(new XmpProperty("DocumentFileName", new XmpString("order-x.xml")));
props.Add(new XmpProperty("Version", new XmpString("1.0")));
props.Add(new XmpProperty("ConformanceLevel", new XmpString("COMFORT")));
pdf.Metadata.Schemas.Add(fx);
pdf.SaveAsPdfa("order-x.pdf", PdfaConformanceLevel.Pdfa3B);
Преобразование защищенных PDF-файлов в PDF/A
Преобразование зашифрованных PDF-файлов ничем не отличается. Откройте документ с правильным паролем и вызовите SaveAsPdfa:
using var pdf = new PdfDocument(fileName, new PdfStandardDecryptionHandler("password"));
pdf.SaveAsPdfa("result.pdf", PdfaConformanceLevel.Pdfa4E);
Пакетная обработка
Вы можете автоматизировать преобразование нескольких PDF-файлов в PDF/A. Переберите все PDF-файлы в каталоге и преобразуйте каждый документ в PDF/A. Этот пример кода показывает, как преобразовывать файлы параллельно:
public static async Task ConvertAsync(string directoryPath)
{
string[] files = Directory.GetFiles(directoryPath, "*.pdf", SearchOption.AllDirectories);
if (files.Length == 0)
return;
var semaphore = new SemaphoreSlim(Environment.ProcessorCount);
var tasks = new List<Task>(files.Length);
foreach (var f in files)
{
await semaphore.WaitAsync();
var task = Task.Run(() =>
{
string outputFileName = $"{Path.GetFileName(f)}-{Guid.NewGuid()}.pdf";
try
{
using var pdf = new PdfDocument(f);
pdf.SaveAsPdfa(outputFileName, PdfaConformanceLevel.Pdfa1B);
}
finally
{
semaphore.Release();
}
});
tasks.Add(task);
}
await Task.WhenAll(tasks);
}
При реализации рабочего процесса преобразования произвольных PDF-файлов стоит проверять все полученные файлы на соответствие PDF/A. Готовое приложение для пакетного преобразования и проверки можно найти в разделе Оценка качества преобразования.
Обработка ошибок
Преобразование может завершиться ошибкой в некоторых ситуациях. Например, если:
- Входной файл не является PDF
- Для зашифрованного PDF указан неверный пароль
- Невозможно встроить байты шрифта для PDF/A
Docotic.Pdf выбрасывает исключения в таких случаях. Этот пример кода показывает, как обрабатывать исключения:
try
{
using var pdf = new PdfDocument("input.pdf");
pdf.SaveAsPdfa("output.pdf", PdfaConformanceLevel.Pdfa1B);
}
catch (PdfException ex)
{
Console.WriteLine($"Problem with an input document: {ex.Message}");
}
catch (ConformanceException ex)
{
Console.WriteLine($"Unable to convert to PDF/A: {ex.Message}");
}
Преобразование из PDF/A в PDF
Преобразование из PDF/A в PDF иногда используют, чтобы упростить редактирование документов. Этот процесс гораздо проще, чем преобразование PDF в PDF/A. Нужно лишь удалить часть метаданных XMP. Пример кода:
using var pdf = new PdfDocument("pdfa-compliant.pdf");
var schemas = pdf.Metadata.Schemas;
for (int i = 0; i < schemas.Count; ++i)
{
if (schemas[i].Namespace == "http://www.aiim.org/pdfa/ns/id/")
{
schemas.RemoveAt(i);
--i;
}
}
pdf.Save("regular.pdf");
Почему выбрать Docotic.Pdf для преобразования PDF в PDF/A?
Docotic.Pdf — это высокопроизводительная библиотека на чистом C# .NET без внешних зависимостей. Ее можно использовать для создания документов PDF/A в Windows, Linux, macOS, Android, iOS или в облачной среде. Кроме того, Docotic.Pdf предоставляет следующие преимущества:
Автономное офлайн-преобразование
Преобразование выполняется полностью на вашем компьютере. Никакие данные не передаются на внешние серверы или сторонним поставщикам. Офлайн-преобразование помогает защитить конфиденциальные документы, потому что данные не покидают вашу среду.
Качество
Docotic.Pdf разработан так, чтобы при преобразовании сохранять как можно больше исходной информации без ущерба для качества.
Соответствие ISO
Docotic.Pdf создает файлы PDF/A, соответствующие стандартам ISO:
- ISO 19005-1:2005 (PDF/A-1)
- ISO 19005-2:2011 (PDF/A-2)
- ISO 19005-3:2012 (PDF/A-3)
- ISO 19005-4:2020 (PDF/A-4)
Каждая сборка Docotic.Pdf проходит через тысячи автоматизированных тестов. Тесты конвертации PDF в PDF/A используют большую коллекцию PDF-файлов из разных источников и преобразуют их в различные уровни соответствия PDF/A. Затем полученные файлы проверяются на соответствие PDF/A.
Одна группа тестов проверяет, что veraPDF не сообщает о проблемах для преобразованных файлов. Вторая группа тестов сравнивает каждый полученный файл с его ожидаемой версией PDF/A, которая была проверена на отсутствие проблем соответствия с помощью veraPDF и Adobe Acrobat Preflight.
Оценка качества преобразования
Мы предоставляем проект PdfToPdfa с открытым исходным кодом. Это консольное приложение .NET, которое преобразует PDF-файлы в PDF/A. После преобразования приложение проверяет каждый полученный документ. Проект использует Docotic.Pdf для преобразования и veraPDF для проверки.
Вы можете использовать это приложение в режиме командной строки для автоматизации рабочих процессов PDF/A. Или использовать его в режиме UI, чтобы быстро оценить качество и производительность преобразования.

Приложение обрабатывает любой PDF-файл или каталог. Для вашего удобства репозиторий проекта также включает тестовые файлы из корпуса veraPDF и Isartor Test Suite.
Что происходит во время преобразования в PDF/A?
Спецификации PDF/A определяют огромный список требований к совместимому документу. Конвертер проверяет их все и обеспечивает их выполнение, чтобы создавать корректные файлы PDF/A. На высоком уровне он проверяет каждый объект PDF и исправляет обнаруженные проблемы соответствия PDF/A.
Не каждый PDF можно преобразовать в PDF/A без изменения содержимого. Некоторые возможности PDF запрещены выбранным уровнем соответствия PDF/A, поэтому конвертер должен либо удалить их, либо преобразовать. В результате преобразование может приводить к потере данных.
Например, PDF/A-1 не допускает дополнительный контент (слои), встроенные файлы (вложения) или прозрачность. Если исходный документ PDF использует эти возможности, конвертер сворачивает слои, удаляет вложения и прозрачность. Если важно сохранить такое содержимое, выберите уровень соответствия PDF/A, который его поддерживает:
- Все уровни соответствия PDF/A-2, PDF/A-3 и PDF/A-4 поддерживают прозрачность и дополнительный контент.
- PDF/A-3, PDF/A-4 и PDF/A-4f поддерживают любые встроенные файлы. PDF/A-2 и PDF/A-4 поддерживают только встроенные файлы PDF/A.
Рассмотрим, как Docotic.Pdf исправляет наиболее распространенные проблемы.
Шрифты и текст
Конвертер пытается встроить каждый шрифт, используемый в документе. Для шрифтов, которые еще не встроены, он сначала пытается загрузить соответствующие данные шрифта из системной коллекции шрифтов или из пользовательского источника шрифтов. Если подходящий шрифт не найден, используется замещающий шрифт.
Вы можете настроить этот процесс, предоставив собственные загрузчики шрифтов. Интерфейс IFontLoader используется для загрузки данных шрифта. Например, реализация DirectoryFontLoader загружает байты шрифтов из одного или нескольких указанных каталогов.
Вы также можете предоставить реализацию интерфейса IFallbackFontProvider, чтобы подставлять замещающие шрифты, когда IFontLoader не может загрузить запрошенный шрифт.
Следующий пример показывает, как настроить загрузку шрифтов:
public static void ConfigurePdfToPdfa(
string fileName,
PdfaConformanceLevel level,
Stream output,
IFontLoader? fontLoader,
IFallbackFontProvider? fallbackFontProvider)
{
var config = PdfConfigurationOptions.Create();
if (fontLoader != null)
config.FontLoader = fontLoader;
if (fallbackFontProvider != null)
config.FallbackFontProvider = fallbackFontProvider;
using var pdf = new PdfDocument(fileName, config);
pdf.SaveAsPdfa(output, level);
}
Docotic.Pdf также исправляет несогласованные ширины глифов, потоки CMap и ToUnicode. Неопределенные символы удаляются в процессе преобразования.
Метаданные
Конвертер исправляет или удаляет неверные схемы или свойства метаданных, добавляет схему pdfaid, синхронизирует метаданные XMP и словарь сведений документа.
Надстройка Conformance также предоставляет расширяющий метод ReadPdfaConformance для PdfDocument. Используйте этот метод, чтобы прочитать уровень соответствия PDF/A, объявленный в метаданных XMP:
using var pdf = new PdfDocument("input.pdf");
PdfaConformanceLevel? level = pdf.ReadPdfaConformance();
Цвета
Конвертер предоставляет ICC-профили output intent для аппаратно-зависимых цветов, поскольку цвета, зависящие от устройства, не допускаются в документах PDF/A. Он также исправляет несоответствующие output intent и цветовые пространства.
При создании документов PDF/A-1 прозрачность удаляется. Это влияет на режимы наложения, soft masks и группы прозрачности. Неверные свойства изображений также исправляются.
Встроенные файлы
Обработка встроенных файлов зависит от уровня соответствия PDF/A. В PDF/A-1 все встроенные файлы удаляются.
В PDF/A-2 и PDF/A-4 встроенные PDF-файлы преобразуются в PDF/A. Вложения не в формате PDF удаляются. Для встроенных файлов PDF/A в PDF/A-4 также исправляются MIME-типы и связи файлов.
В PDF/A-3 вложения не удаляются, но связи файлов и MIME-типы исправляются.
Интерактивные возможности
Конвертер создает отсутствующие или неверные потоки отображения. Он также исправляет неверные свойства аннотаций, сворачивает аннотации недопустимых типов и удаляет действия недопустимых типов.
Формы XFA удаляются для PDF/A-2, PDF/A-3 и PDF/A-4. Только PDF/A-1 допускает формы XFA, но их все равно не рекомендуют для долговременного архивирования.
Опциональный контент сворачивается при выборе PDF/A-1. Для других уровней соответствия конвертер исправляет словари конфигурации опционального контента с неполными массивами порядка, отсутствующими именами или дублирующимися именами.
Цифровые подписи
Цифровые подписи по своей природе не допускают изменения подписанного содержимого. Если подписанная часть PDF содержит проблемы соответствия PDF/A, конвертер исправляет их и делает подпись недействительной.
Другие области
Для специальных возможностей конвертер добавляет базовую информацию о структуре документа, если она отсутствует. Он также исправляет неверные или нестандартные теги структуры. Это относится к документам PDF/A-1a, PDF/A-2a и PDF/A-3a.
Файлы PDF/A не должны быть зашифрованы, поэтому конвертер не допускает шифрование выходных файлов.
Данные, сжатые LZW, не допускаются в PDF/A. Конвертер повторно сжимает потоки LZW с помощью сжатия Flate. Он также исправляет несоответствующие объекты массива, словаря, числа, имени и строки.
Неверные заголовки файлов или секции перекрестных ссылок также исправляются автоматически.
Заключение
Docotic.Pdf с надстройкой Conformance предоставляет высококачественный конвертер PDF в PDF/A. Вы можете преобразовывать существующие PDF-документы в любой уровень соответствия PDF/A или создавать документы PDF/A с нуля. Библиотека работает полностью локально, поэтому ваши данные никогда не покидают ваши серверы.
Вы можете ознакомиться с запускаемыми примерами на C# и VB.NET для создания и обработки документов PDF/A в разделе PDF/A репозитория с примерами.
Также доступно приложение PdfToPdfa с открытым исходным кодом для преобразования PDF в PDF/A. Вы можете использовать его для автоматизации рабочих процессов PDF/A или просто преобразовывать PDF-файлы в PDF/A.
Часто задаваемые вопросы
Как выбрать подходящий конвертер PDF в PDF/A?
Хороший конвертер PDF в PDF/A должен:
- Создавать файлы, соответствующие PDF/A.
- Сохранять информацию и визуальный вид исходных документов.
- Работать локально, не отправляя файлы на сторонние серверы.
- Работать быстро.
- (если требуется автоматизация) Поддерживать запуск без UI.
Библиотека Docotic.Pdf соответствует всем критериям и является хорошим выбором для преобразования PDF в PDF/A.
Как проверить, что документ PDF/A соответствует требованиям?
Используйте ПО для проверки. Хороший валидатор PDF/A должен:
- Глубоко следовать стандартам ISO для PDF/A.
- Работать локально, не отправляя файлы на сторонние серверы.
- Работать быстро.
- (если требуется автоматизация) Поддерживать запуск без UI.
veraPDF — это отраслевой инструмент валидации, который поддерживает все эти требования.
Как автоматизировать рабочий процесс преобразования PDF в PDF/A?
Преобразуйте PDF-файлы с помощью надстройки Docotic.Pdf Conformance. Проверяйте результаты валидатором veraPDF. Отслеживайте ход преобразования и проверки.
Приложение PdfToPdfa с открытым исходным кодом реализует этот рабочий процесс. Используйте его как отправную точку для собственной реализации.
Какую версию PDF/A следует использовать?
См. раздел Как выбрать версию PDF/A.
Могу ли я встроить XML-файл в PDF для ZUGFeRD?
Да, конечно. Посмотрите примеры в разделе Создание файлов ZUGFeRD / Factur-X.
Как защитить документ PDF/A?
Технически это невозможно. Файлы PDF/A не должны быть зашифрованы.