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. |
| 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, коли хочете, щоб бібліотека відформатувала списки проблем у придатний для повторного використання текстовий звіт. Використовуйте 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-потоків; він може повторно використати спільний аналіз конвеєра валідації