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 |
| 10040 | Form 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; он может переиспользовать общий проход конвейера проверки