CheckFileCompliance

Відповідність, інспектування документів

Опис

Зчитує зовнішній файл 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, щоб вони візуально відрізнялися від кодів PDF/A 00xxx

Синтаксис

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 забороняє reference XObjects, оскільки вони дозволяють одному 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 вимагає, щоб кожен вбудований CIDFont типу 2 мав /CIDToGIDMap (або як потік, що зіставляє CIDs з індексами гліфів, або як ім'я Identity).
10022Один чи кілька шрифтів Standard 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 словника кодування), відмінне від 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 були унікальними в межах документа.
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, коли хочете, щоб бібліотека відформатувала списки проблем у придатний для повторного використання текстовий звіт. Використовуйте CreatePreflightReportEx чи SavePreflightReportEx для виведення звітів у тексті, JSON, HTML чи CSV, або див. Звіти попередньої перевірки для повного робочого процесу звітівКомпаньйон-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

Тест відповідності 3 перевіряє PDF/X (ISO 15930): ідентифікацію редакції, призначення виводу, геометрію сторінок, вбудовані шрифти та набір заборонених можливостей; для PDF/X-6 він також перевіряє прапорці анотацій і фіксовані вигляди, вигляди AcroForm і підписів, винятки XFA та виглядів, згенерованих переглядачем, розміщення дій, ланцюжки дій, дозволений набір іменованих дій і кожне значення UseBlackPtCompТест відповідності 4 перевіряє метадані ідентифікації PDF/VT-3, його основу з родини PDF/X-6, граф DPartRoot і DPart, імена та значення DPM, рівень записів, порядок сторінок і точне покриття кінцевих вузлів; складені перевірки ділять один прохід розбирачаТест відповідності 5 перевіряє розміщення маркерів PDF/R-1, версію та шифрування, непрямі об'єкти нульового покоління, обмежені словники та фільтри, сторінкові програми з одного потоку, впорядковані растрові смуги, кодування зображень, покриття сторінок і ефективну роздільну здатність; він може повторно використати розбір спільного конвеєра перевіркиТест відповідності 6 перевіряє основу PDF/X та ідентифікацію XMP PDF/VCR-1, єдиний прямий корінь шаблону, оголошені поля, необов'язкове поле вибору сторінок і кожен кінцевий заповнювач заміни PassThrough, прив'язку до сторінки, MCID та обмежувальний прямокутник; він може повторно використати розбір спільного конвеєра перевіркиТест відповідності 7 перевіряє ідентифікацію та метадані життєвого циклу PDF/E-1, ідентифікатори trailer, дозволене шифрування, призначення виводу та апаратні колірні простори, оператори вмісту, шрифти, анотації, форми, необов'язковий вміст, дії, посилання на зовнішні файли, графічні стани та обмеження 3D-потоків; він може повторно використати розбір спільного конвеєра перевірки

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

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

Тест відповідності 6 перевіряє основу PDF/X та XMP-ідентифікацію PDF/VCR-1, єдиний прямий корінь шаблону, оголошені поля, необов'язкове поле вибору сторінок і кожен листовий заповнювач заміни PassThrough, прив'язку сторінок, MCID та обмежувальний прямокутник; він може повторно використати розбір спільного конвеєра валідації

Тест відповідності 7 перевіряє ідентифікацію PDF/E-1 та метадані життєвого циклу, ідентифікатори трейлера, дозволене шифрування, intención виводу та кольорові простори пристроїв, оператори вмісту, шрифти, анотації, форми, необов'язковий вміст, дії, посилання на зовнішні файли, стани графіки та обмеження 3D-потоків; він може повторно використати спільний аналіз конвеєра валідації