CheckFileCompliance

Соответствие стандартам, инспекция документов

Выбор профиля чтения PDF/UA

Проверки PDF/UA выбирают часть 2, когда XMP указывает pdfuaid:part=2, и в остальных случаях удерживают проверки части 1; описанные здесь устаревшие проверки PDF/UA-1 не следует считать применимыми к части 2

Профиль PDF/UA-2 реализует базовые проверки идентификации, пространств имён, ролей и структуры; структурированные отчёты используют PDF/UA-2 и ISO 14289-2 и раскрывают fullCertification=false и неподтверждённую область

Чтобы принудительно задать целевую часть, используйте CheckFilePDFUACompliance или RunPDFUAValidationPipelineTask, а для просмотра пределов возможностей — GetPDFUAReadValidationCoverageJSON

Описание

Читает внешний PDF-файл и проверяет его соответствие выбранному стандарту ISO. Возвращается либо ноль (файл чисто проходит выбранный тест), либо ненулевой дескриптор StringListID со списком всех обнаруженных проблем. Каждая запись списка — короткий код, двоеточие и человекочитаемое сообщение; формат кодов в точности совпадает с форматом GetPDFUADiagnostics. Переберите результат с помощью GetStringListCount и GetStringListItem

Тест PDF/A охватывает все шесть уровней соответствия (PDF/A-1a, PDF/A-1b, PDF/A-2a, PDF/A-2b, PDF/A-3a, PDF/A-3b) и читает XMP-записи pdfaid:part/pdfaid:conformance, чтобы определить применимый набор правил

Тест PDF/UA-1 (добавлен в v3.56.0) проверяет внешний PDF на соответствие ISO 14289-1 и выдаёт диагностические коды в диапазоне 10xxx, чтобы они визуально не смешивались с кодами 00xxx PDF/A

Синтаксис

Delphi

Function TPDFlib.CheckFileCompliance(Const InputFileName, Password: WideString; ComplianceTest, Options: Integer): Integer;

ActiveX

Function PDFlib::CheckFileCompliance(InputFileName As String, Password As String, ComplianceTest As Long, Options As Long) As Long

DLL

int DLCheckFileCompliance(int InstanceID, const wchar_t * InputFileName, const wchar_t * Password, int ComplianceTest, int Options);

Параметры

InputFileNameПолный путь к проверяемому PDF-файлу. Файл открывается только для чтения и не изменяется
PasswordПароль для открытия файла. Для незашифрованных документов передайте пустую строку. Обратите внимание: зашифрованный документ не проходит тест PDF/A (код 00006) независимо от того, передан ли правильный пароль — PDF/A запрещает шифрование
ComplianceTestСтандарт для проверки.

1 — PDF/A (ISO 19005-1/-2/-3, все шесть уровней соответствия).
2 — PDF/UA-1 (ISO 14289-1:2014, доступный PDF).
3 — PDF/X (ISO 15930, включая семейство PDF/X-6).
4 — PDF/VT-3 (ISO 16612-3:2020 на основе семейства PDF/X-6).
5 — PDF/R-1 ограниченный растровый обмен.
6 — PDF/VCR-1 шаблоны замены переменного содержимого.
7 — PDF/E-1 обмен инженерными документами
OptionsБитовые флаги, изменяющие тест.

0 — по умолчанию: сообщать каждую найденную в документе проблему.
1 — остановиться после первой проблемы и немедленно вернуть результат. Полезно, когда вызывающей стороне нужен только сигнал проход/не проход

Возвращаемые значения

0Файл соответствует выбранному стандарту
Не нольДескриптор StringListID, чьи записи описывают каждое обнаруженное несоответствие. Дескриптор остается действительным, пока документ не закрыт или не вызвана ReleaseStringList

Коды проблем PDF/A (ComplianceTest = 1)

00002Версия PDF превышает максимум, разрешенный уровнем соответствия (PDF/A-1 ограничена 1.4; PDF/A-2 и PDF/A-3 — 1.7). Строка деталей называет нарушающую версию и допустимый максимум
00003Каталог содержит /OCProperties (необязательное содержимое / слои), запрещенное в PDF/A-1. PDF/A-2 и PDF/A-3 разрешают слои и не вызывают эту проверку
00005Пара XMP pdfaid:part+pdfaid:conformance отсутствует, некорректна или содержит значение вне допустимого набора 1A, 1B, 2A, 2B, 3A, 3B. Библиотека не может определить применимый набор правил, поэтому проблема сообщается как фатальная независимо от Options
00006Документ зашифрован. PDF/A запрещает шифрование во всех частях
00007В каталоге нет записи /OutputIntents. Все части PDF/A требуют выходного назначения, чтобы цветовое пространство рендеринга было определено однозначно
00011В каталоге нет записи /MarkInfo. Требуется только для соответствия уровню a (PDF/A-1a, 2a, 3a) — тегированный PDF должен заявить о себе
00012В каталоге нет записи /StructTreeRoot. Требуется только для соответствия уровню a. Тегированный PDF-документ должен иметь дерево логической структуры

Коды проблем PDF/UA-1 (ComplianceTest = 2)

10001Поток метаданных XMP не содержит pdfuaid:part, либо значение не равно 1. ISO 14289-1 §5 требует, чтобы соответствующий файл идентифицировал себя через это свойство; ISO 14289-1 §6.2 запрещает заявлять соответствие без него
10002В каталоге документа нет потока /Metadata. Заявление о соответствии PDF/UA-1 записывается внутри этого потока; без него файл не может объявить себя доступным
10003Словарь /MarkInfo каталога отсутствует либо /Marked не равен true. ISO 14289-1 §7.1 требует, чтобы каждый соответствующий файл объявлял себя тегированным, чтобы ассистивные технологии могли полагаться на дерево структуры
10004В каталоге нет записи /StructTreeRoot. Файл PDF/UA-1 должен включать дерево логической структуры, описывающее порядок чтения и семантику документа
10005Словарь /ViewerPreferences отсутствует либо его запись /DisplayDocTitle не равна true. ISO 14289-1 §7.1 требует от соответствующих программ просмотра показывать заголовок документа в своем окне вместо имени файла
10006Запись /Lang каталога отсутствует или пуста. ISO 14289-1 §7.2 (со ссылкой на ISO 32000-1 §14.9.2) требует, чтобы каждый соответствующий файл объявлял свой естественный язык, чтобы программы экранного доступа выбирали правильный голос и правила произношения
10007Поток метаданных XMP не содержит непустого dc:title Dublin Core. ISO 14289-1 §7.1 требует "запись dc:title, однозначно идентифицирующую документ"
10008Словарь /MarkInfo имеет /Suspects равным true. ISO 14289-1 §7.1: файлы, заявляющие соответствие PDF/UA, должны иметь значение Suspects равным false — значение true помечает тегирование как заведомо содержащее ошибки
10009Словарь /RoleMap документа переназначает один или несколько стандартных типов структуры. ISO 14289-1 §7.1: стандартные теги, определенные в ISO 32000-1 §14.8.4 (P, H1..H6, Figure, Table и т. д.), не подлежат переназначению. Строка деталей называет первый переназначенный стандартный тег
10010Файл зашифрован, но бит 10 ключа разрешений шифрования /P (маска 512, "извлечение для доступности") не установлен. ISO 14289-1 §7.16 требует, чтобы каждый зашифрованный соответствующий файл разрешал извлечение для доступности, чтобы ассистивные технологии могли добраться до содержимого
10011Обнаружена динамическая XFA-форма: пакет XFA XDP содержит <dynamicRender>required</dynamicRender>. ISO 14289-1 §7.15 запрещает динамические XFA-формы в соответствующих файлах; статическая XFA разрешена
10012Обнаружен Reference XObject (Form XObject с записью /Ref). ISO 14289-1 §7.20 запрещает ссылочные XObject, поскольку они позволяют одному PDF встраивать другой по ссылке, не открывая ссылочное содержимое ассистивным технологиям
10013Обнаружены одна или несколько аннотаций TrapNet. ISO 14289-1 §7.18.2 явно запрещает TrapNet в соответствующих файлах. Строка деталей сообщает, сколько аннотаций найдено
10014Одна или несколько страниц содержат аннотации, но не задают /Tabs /S в словаре страницы. ISO 14289-1 §7.18.3 требует, чтобы порядок табуляции на таких страницах следовал дереву структуры, на что указывает /Tabs /S. Строка деталей сообщает число нарушающих страниц
10015Одна или несколько аннотаций Link не имеют непустого альтернативного описания /Contents. ISO 14289-1 §7.18.5 требует, чтобы каждая аннотация Link несла доступное описание, чтобы программы экранного доступа могли озвучить цель ссылки. Строка деталей сообщает число нарушающих аннотаций Link
10016В одном или нескольких словарях FileSpec встроенных файлов отсутствует ключ имени файла /F. ISO 14289-1 §7.11 требует, чтобы каждый FileSpec встроенного файла нес как /F, так и /UF
10017В одном или нескольких словарях FileSpec встроенных файлов отсутствует ключ имени файла в Unicode /UF. ISO 14289-1 §7.11 требует, чтобы каждый FileSpec встроенного файла нес как /F, так и /UF
10018В одном или нескольких словарях конфигурации необязательного содержимого отсутствует непустая текстовая строка /Name. ISO 14289-1 §7.10 требует, чтобы каждый словарь конфигурации OCG (запись D по умолчанию плюс каждый словарь в OCProperties/Configs) нес непустой /Name
10019Один или несколько словарей конфигурации необязательного содержимого содержат запрещенный ключ /AS. ISO 14289-1 §7.10 явно запрещает /AS в любом словаре конфигурации OCG, чтобы предотвратить автоматическую подстройку состояний по информации об использовании
10020Один или несколько шрифтов, не входящих в стандартные 14 и используемых документом, не встраивают свою шрифтовую программу (нет записи FontFile, FontFile2 или FontFile3 в FontDescriptor). ISO 14289-1 §7.21.4.1 требует, чтобы каждый шрифт, используемый для рендеринга, встраивал свою программу. Шрифты Type 3 пропускают эту проверку, поскольку их глифы являются встроенными CharProcs
10021У одного или нескольких потомков CIDFontType2 отсутствует запись /CIDToGIDMap. ISO 14289-1 §7.21.3.2 требует, чтобы каждый встроенный CIDFont Type 2 нес /CIDToGIDMap (либо как поток, отображающий CIDs в индексы глифов, либо как имя Identity)
10022Один или несколько из стандартных 14 шрифтов (Helvetica, Times, Courier, Symbol, ZapfDingbats и их варианты bold / oblique) используются без встроенной шрифтовой программы. ISO 14289-1 §7.21.4 NOTE 5 прямо указывает, что для 14 стандартных шрифтов Type 1 исключений из встраивания нет
10023У одного или нескольких шрифтов отсутствует CMap /ToUnicode, и они не подпадают под список исключений §7.21.7. Список исключений охватывает предопределенные MacRomanEncoding / MacExpertEncoding / WinAnsiEncoding, шрифты Type 0, чей потомок CIDFont использует наборы символов Adobe GB1 / CNS1 / Japan1 / Korea1, и несимволические шрифты TrueType
10024Первый элемент заголовка в порядке документа не H1 (или строго структурный H). ISO 14289-1 §7.4.2: "Если используются какие-либо теги заголовков, первым должен быть H1"
10025В порядке документа обнаружены один или несколько пропусков уровней заголовков — например, H1, сразу за которым следует H3, минуя H2. ISO 14289-1 §7.4.2 требует, чтобы убывающие последовательности заголовков шли в строгом числовом порядке без пропуска промежуточных уровней
10026У одной или нескольких аннотаций Widget отсутствует запись /StructParent. ISO 14289-1 §7.18.4 требует, чтобы аннотации Widget были вложены в структурный тег Form; без /StructParent виджет в принципе недостижим из дерева структуры. Строка деталей сообщает количество
10027У одной или нескольких аннотаций Widget есть запись /StructParent, но значение не разрешается через StructTreeRoot/ParentTree в структурный элемент с /S = Form. ISO 14289-1 §7.18.4 требует, чтобы каждая аннотация Widget была вложена в структурный тег Form. Возможные причины: запись /ParentTree отсутствует полностью, указывает на не-StructElem (сырое целое / словарь MCR) или называет тег, отличный от Form
10028У одного или нескольких несимволических шрифтов TrueType /Encoding (или /BaseEncoding словаря Encoding) не равен MacRomanEncoding или WinAnsiEncoding. ISO 14289-1 §7.21.6 ограничивает кодирование несимволического TrueType этими двумя предопределенными именами
10029Один или несколько символических шрифтов TrueType содержат запись /Encoding в словаре шрифта. Четвертый абзац ISO 14289-1 §7.21.6 это запрещает — кодирование символического TrueType должно выражаться только через таблицу cmap встроенной шрифтовой программы
10030У одного или нескольких структурных элементов L (список) отсутствует атрибут ListNumbering. ISO 14289-1 §7.6 требует, чтобы каждый тег L объявлял свой стиль нумерации через этот атрибут. Допустимые значения: None, Disc, Circle, Square, Decimal, UpperRoman, LowerRoman, UpperAlpha и LowerAlpha (ISO 32000-1 Table 347)
10031Одна или несколько аннотаций Link содержат словарь действия URI с записью /IsMap равной true. ISO 14289-1 §7.18.5 запрещает /IsMap = true в действии URI, если эквивалентная функциональность не обеспечена в другом месте содержимого без ключа /IsMap. Авторы с законным сценарием использования IsMap должны подавлять эту диагностику самостоятельно
10032У одного или нескольких структурных элементов Note отсутствует запись /ID. ISO 14289-1 §7.9 требует, чтобы каждый тег Note объявлял уникальный /ID, чтобы перекрестные ссылки попадали на стабильную цель
10033Два и более структурных элемента Note разделяют одно и то же значение /ID. Строка деталей сообщает число обнаруженных дублирующихся пар. ISO 14289-1 §7.9 требует уникальности Note ID в пределах документа
10034Одна или несколько несимволических программ TrueType (FontDescriptor со сброшенным флагом Symbolic и присутствующим потоком FontFile2) встраивают таблицу cmap, чья единственная подтаблица — символическая запись Microsoft (3,0). Первый абзац ISO 14289-1 §7.21.6 требует хотя бы одной несимволической подтаблицы cmap, чтобы программа могла отобразить кодовые точки, объявленные ее /Encoding
10035Один или несколько несимволических шрифтов TrueType объявляют /Encoding с массивом /Differences, содержащим имена глифов, не входящие в Adobe Glyph List 2.0. .notdef внесен в белый список, поскольку спецификация неявно допускает его. Третий абзац ISO 14289-1 §7.21.6 требует, чтобы каждая запись Differences попадала в AGL
10036Ширины одного или нескольких простых шрифтов TrueType расходятся с соответствующими метриками встроенной шрифтовой программы более чем на одну тысячную em. ISO 14289-1 §7.21.5 требует, чтобы массив /Widths согласовывался со встроенными метриками глифов
10037Ширины одного или нескольких CIDFontType2 расходятся с соответствующими метриками встроенной программы TrueType более чем на одну тысячную em. ISO 14289-1 §7.21.5 требует, чтобы массив /W согласовывался со встроенными метриками глифов
10038Дескриптор шрифта Type 1 /CharSet пропускает одно или несколько имен глифов, присутствующих во встроенной шрифтовой программе. ISO 14289-1 §7.21.4.2 требует, чтобы запись перечисляла каждый встроенный глиф
10039Дескриптор CID-шрифта /CIDSet пропускает один или несколько CIDs, отображающихся в глифы встроенной шрифтовой программы. ISO 14289-1 §7.21.4.2 требует, чтобы битовый набор идентифицировал каждый встроенный CID
10040Form XObject, содержащий текст, вызывается из содержимого страницы вне маркированного содержимого. ISO 14289-1 §7.20 требует, чтобы содержимое Form XObject включалось в структурные элементы
10041Один или несколько операторов показа текста разрешаются в глиф .notdef. ISO 14289-1 §7.21.8 запрещает ссылки на .notdef независимо от режима отображения текста
10042В одном или нескольких словарях данных медиаклипов (определяемых как /S /MCD, при необходимости /Type /MediaClip) отсутствует обязательная запись типа содержимого /CT. ISO 14289-1 §7.18.6 повышает этот необязательный ключ из ISO 32000-1 Table 274 до обязательного
10043В одном или нескольких словарях данных медиаклипов отсутствует обязательный массив /Alt (пары строка-язык + альтернативный текст). ISO 14289-1 §7.18.6 повышает этот необязательный ключ из ISO 32000-1 Table 274 до обязательного, чтобы ассистивные технологии могли озвучить описание встроенного мультимедиа
10044Один или несколько узлов дерева структуры содержат более одного прямого потомка H (общий заголовок). ISO 14289-1 §7.4.4 явно это запрещает — разделите секцию или замените теги H нумерованными уровнями H1..H6

Примечания

Тест PDF/A предназначен для быстрой самопроверки перед поставкой. Он выявляет проблемы уровня документа, которые сразу дисквалифицируют файл (неверная версия PDF, отсутствие OutputIntent, отсутствие дерева структуры на уровне A, шифрование, слои в PDF/A-1). Он не проходит по каждому оператору потока содержимого и не проверяет встраивание шрифтов или ссылки на цветовые пространства для каждого рисуемого объекта — такие проверки требуют специализированного валидатора PDF/A (например, veraPDF). Используйте эту функцию как проверку первой линии и как шлюз регрессии в конвейерах сборки. Используйте CreatePreflightReport или SavePreflightReport, если хотите, чтобы библиотека оформила списки проблем в пригодный для повторного использования текстовый отчет. Для вывода отчетов в тексте, JSON, HTML или CSV используйте CreatePreflightReportEx или SavePreflightReportEx, либо см. Preflight Reports для полного рабочего процесса отчётов

Сопутствующий API GetPDFUADiagnostics выполняет аналогичные проверки PDF/UA (ISO 14289-1) для находящегося в памяти строящегося документа, а не для внешнего файла

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

Пример

// Validate a delivered PDF/A file and print all issues
var
  Issues, Count, I: Integer;
begin
  Issues := PDF.CheckFileCompliance('archive.pdf', '', 1, 0);
  if Issues = 0 then
    WriteLn('archive.pdf: PDF/A conformant')
  else
  begin
    Count := PDF.GetStringListCount(Issues);
    WriteLn('archive.pdf: ', Count, ' PDF/A issue(s) detected:');
    for I := 1 to Count do
      WriteLn('  ', PDF.GetStringListItem(Issues, I));
  end;
end;

// Fast pass/fail gate in a CI pipeline — stop on the first issue
var
  Failed: Boolean;
begin
  Failed := PDF.CheckFileCompliance('build/output.pdf', '', 1, 1) <> 0;
  if Failed then
    Halt(1);
end;

См. также

Preflight Reports, CreatePreflightReport, CreatePreflightReportEx, SavePreflightReport, SavePreflightReportEx, ComparePreflightReports, SetPDFAMode, GetPDFUADiagnostics, GetStringListCount, GetStringListItem, SetPDFUAMode

Тест соответствия 3 проверяет PDF/X (ISO 15930): идентификацию редакции, output intent, геометрию страницы, внедренные шрифты и набор запрещенных возможностей; для PDF/X-6 он также проверяет флаги аннотаций и фиксированные appearances, appearances AcroForm и подписей, исключения для XFA и создаваемых просмотрщиком appearances, размещение действий, цепочки действий, допустимый набор именованных действий и каждое значение UseBlackPtComp

Тест соответствия 4 проверяет метаданные идентификации PDF/VT-3, его базу семейства PDF/X-6, граф DPartRoot и DPart, имена и значения DPM, уровень записей, порядок страниц и точное покрытие листьев; составные проверки используют один проход парсера

Тест соответствия 5 проверяет размещение, версию и шифрование маркеров PDF/R-1, косвенные объекты нулевого поколения, ограниченные словари и фильтры, программы страниц в одном потоке, упорядоченные растровые полосы, кодирования изображений, покрытие страницы и эффективное разрешение; он может переиспользовать общий проход конвейера проверки

Тест соответствия 6 проверяет фундамент PDF/X и XMP-идентификацию PDF/VCR-1, единственный прямой корень шаблона, объявленные поля, необязательное поле выбора страниц и каждый заменяющий placeholder PassThrough на листьях, привязку страниц, MCID и bounding box; он может переиспользовать общий проход конвейера проверки

Тест соответствия 7 проверяет идентификацию и метаданные жизненного цикла PDF/E-1, идентификаторы trailer, допустимое шифрование, output intents и цветовые пространства устройства, операторы содержимого, шрифты, аннотации, формы, optional content, действия, ссылки на внешние файлы, графические состояния и ограничения потоков 3D; он может переиспользовать общий проход конвейера проверки