CheckFileComplianceA
Соответствие стандартам, инспекция документов
Описание
Завершающая A обозначает точку входа DLL типа ANSI (char); интерфейс ActiveX/COM предоставляет только форму Unicode. Поведение идентично CheckFileCompliance, а строковые аргументы интерпретируются с использованием текущей кодовой страницы SetAnsiMode
Читает внешний файл PDF и проверяет его на соответствие выбранному стандарту ISO. Возвращаемое значение — либо ноль (файл чисто проходит выбранный тест), либо ненулевой handle 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, чтобы они оставались визуально отделены от кодов PDF/A 00xxx
Синтаксис
Delphi
Function DLCheckFileComplianceA(InstanceID: Integer; InputFileName, Password: PAnsiChar; ComplianceTest, Options: Integer): Integer;
DLL
int DLCheckFileComplianceA(int InstanceID, const char * InputFileName, const char * 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). |
| Options | Битовые флаги, изменяющие тест. 0 — По умолчанию: сообщать о каждой проблеме, найденной в документе. 1 — Остановиться после первой проблемы и немедленно вернуться. Полезно, когда вызывающему нужен только признак «прошёл/не прошёл». |
Возвращаемые значения
| 0 | Файл соответствует выбранному стандарту |
|---|---|
| Non-zero | Дескриптор StringListID, записи которого описывают каждое обнаруженное несоответствие. Дескриптор действителен, пока документ не закрыт или не вызвана ReleaseStringList |
PDF/A issue codes (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 | В каталоге Catalog нет записи /MarkInfo. Требуется только для соответствия уровня a (PDF/A-1a, 2a, 3a) — тегированный PDF обязан себя декларировать. |
| 00012 | В каталоге нет записи /StructTreeRoot. Требуется только для соответствия уровня a. Структурированный PDF-документ должен иметь логическое дерево структуры |
PDF/UA-1 issue codes (ComplianceTest = 2)
| 10001 | Поток метаданных XMP не содержит pdfuaid:part, либо значение не равно 1. ISO 14289-1 §5 требует, чтобы соответствующий файл идентифицировал себя этим свойством; ISO 14289-1 §6.2 запрещает заявлять соответствие без него |
|---|---|
| 10002 | У документа Catalog нет потока /Metadata. Заявка на соответствие PDF/UA-1 записывается внутри этого потока; без него файл не может объявить себя доступным |
| 10003 | Словарь Catalog /MarkInfo отсутствует либо /Marked не равен true. ISO 14289-1 §7.1 требует, чтобы каждый соответствующий файл объявлял себя структурированным, чтобы ассистивные технологии могли полагаться на дерево структуры |
| 10004 | В каталоге нет записи /StructTreeRoot. Файл PDF/UA-1 должен содержать логическое дерево структуры, описывающее порядок чтения и семантику документа |
| 10005 | Словарь /ViewerPreferences отсутствует, либо его запись /DisplayDocTitle не равна true. ISO 14289-1 §7.1 требует от соответствующих читателей показывать заголовок документа в рамке окна вместо имени файла |
| 10006 | Запись Catalog /Lang отсутствует или пуста. ISO 14289-1 §7.2 (со ссылкой на ISO 32000-1 §14.9.2) требует, чтобы каждый соответствующий файл объявлял свой естественный язык, чтобы экранные дикторы выбирали правильный голос и правила произношения |
| 10007 | Поток метаданных XMP не несет непустого Dublin Core dc:title. 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, "Extract for accessibility") не установлен. ISO 14289-1 §7.16 требует, чтобы каждый зашифрованный соответствующий файл разрешал извлечение для доступности, чтобы ассистивные технологии могли добраться до содержимого |
| 10011 | Обнаружена динамическая XFA-форма: пакет XDP содержит <dynamicRender>required</dynamicRender>. ISO 14289-1 §7.15 запрещает динамические XFA-формы в соответствующих файлах; статическая XFA разрешена. |
| 10012 | Обнаружен Reference XObject (Form XObject с записью /Ref). ISO 14289-1 §7.20 запрещает reference 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 | Один или несколько не входящих в Standard-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 требует, чтобы каждый внедренный Type 2 CIDFont нес /CIDToGIDMap (поток, отображающий CID в индексы глифов, либо имя Identity) |
| 10022 | Один или несколько стандартных шрифтов (Helvetica, Times, Courier, Symbol, ZapfDingbats и их жирные/наклонные варианты) упоминаются без внедрённой шрифтовой программы. 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: "If any heading tags are used, H1 shall be the first." |
| 10025 | One or more heading-level skips were detected in document order — e.g. an H1 immediately followed by an H3, skipping H2. ISO 14289-1 §7.4.2 requires descending heading sequences to proceed in strict numerical order without skipping intervening levels. |
| 10026 | У одной или нескольких аннотаций Widget отсутствует запись /StructParent. ISO 14289-1 §7.18.4 требует, чтобы аннотации Widget были вложены в структурный тег Form; без /StructParent Widget в принципе недостижим из дерева структуры. Строка деталей сообщает число |
| 10027 | У одной или нескольких аннотаций Widget есть запись /StructParent, но значение не разрешается через StructTreeRoot/ParentTree в структурный элемент с /S = Form. ISO 14289-1 §7.18.4 требует, чтобы каждая аннотация Widget была вложена в структурный тег Form. Возможные причины: запись /ParentTree отсутствует целиком, указывает на не-StructElem (сырое целое или словарь MCR) или называет тег не Form |
| 10028 | One or more non-symbolic TrueType fonts have /Encoding (or an Encoding dictionary's /BaseEncoding) that is not MacRomanEncoding or WinAnsiEncoding. ISO 14289-1 §7.21.6 restricts non-symbolic TrueType encoding to these two predefined names. |
| 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 |
| 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-1 (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