PDF/A — это стандартизированная по ISO версия PDF, предназначенная для использования при архивировании и долговременном хранении электронных документов. Стандарт PDF/A не определяет стратегию архивирования или цели системы архивирования. Он определяет «профиль» для электронных документов, который гарантирует, что документы могут быть воспроизведены точно таким же образом с использованием различного программного обеспечения в ближайшие годы. Ключевым элементом этой воспроизводимости является требование к документам PDF/A быть на 100% автономными. Вся информация, необходимая для отображения документа таким же образом, встроена в файл. Это включает, помимо прочего, все содержимое (текст, растровые изображения и векторную графику), шрифты и информацию о цвете. Документ PDF/A не может зависеть от информации из внешних источников.

 

При включенном режиме "PDF/A Compliance" на экспортируемый отчет накладываются следующие ограничения:

не используется прозрачность (PDF/A-1 only);
не используются гиперлинки;
не используются подсказки при наведении;
шрифты всегда включены;
не используется шифрование документа.

 

 

При экспорте отчета в PDF документ с использованием стандарта PDF/A могут возникать некоторые ошибки.

 
Ошибка "Font not embedded".

Стандарт PDF-A требует, чтобы шрифты были включены в pdf-файл. Поэтому, если установлен режим "PDF/A Compliance", то независимо от параметра "Embedded fonts" в настройках экспорта, шрифты будут принудительно включены в pdf-экспорт. Однако в приложениях в которых используются .NET Core и JS компоненты, ядро генератора отчетов имеет доступ только к тем шрифтам, которые загружены в StiFontCollection. Соответственно, если какой-то шрифт не загружен, он не будет включен в PDF файл. В следствие чего, проверка на PDF/A покажет ошибку "Font not embedded".

 

HomeController.cs

 

StiFontCollection.AddFontFile(StiNetCoreHelper.MapPath(this, "Reports/Font.ttf"));

 

 

 

Ошибка "Width information for rendered glyphs is inconsistent"

("Glyph widths in font dictionary are not consistent with embedded font program widths")

TrueType, OpenType представляют собой векторные шрифты. В них контуры всех символов хранятся в виде точек, которые соединены прямыми или дугами. Ширина символов не хранится в шрифте, она рассчитывается на основании геометрии символа. Внутри PDF файла, кроме самого файла шрифта, записывается также блок информации об этом шрифте:

Название;
Кодировка;
Таблица "Widths", в которой указана ширина всех используемых символов. Эту таблицу использует вьювер для ускорения работы с текстом (как кэш), чтобы не рассчитывать ширину символов каждый раз из данных шрифта.

 

Проверка на соответствие стандарту PDF/A состоит из многих этапов. Один из этапов - это проверка, чтобы данные из таблицы Widths соответствовали данным шрифта. При этом утилита проверки рассчитывает ширину символов и сравнивает ее с записанной в таблице Widths. По стандартам допускается отклонение на 0.1%. В этот момент и проявляется проблема. Различные графические библиотеки рассчитывают ширину символов по-разному, в следствие чего, значения могут отличаться, иногда до 1-2%, что гораздо больше, чем допустимые 0.1%. Причем даже разные утилиты проверки могут по-разному рассчитывать ширину, и соответственно ругаться на разные файлы.

 

Примечание

 

Пример из нашей практики: PDF файл прошел проверку в Adobe Acrobat Pro, но не прошел в одной из онлайн-утилит. Наша графическая библиотека рассчитала ширину одного из символов как 554, и это значение подошло для Adobe Acrobat Pro. Когда мы вручную заменили число на 553, файл прошел проверку в онлайн-утилите, но перестал проходить в Adobe Acrobat Pro.

 

 

 

Универсального решения данной проблемы не существует. Однако, при возникновении такой ошибки стоит учитывать этот нюанс.