Соответствие: валидатор PDF/R-1, грамматика Arlington, инструменты жизненного цикла
NextPDF\Compliance предоставляет валидаторы потока байтов и перекрёстную проверку грамматики: они читают готовый файл Portable Document Format (PDF) и сообщают, где он расходится с нормативным контрактом. Если валидатор возвращает ноль замечаний, результат проверен по тем пунктам, которые он реализует. Это не общий сертификат.
Установка
Заголовок раздела «Установка»composer require nextpdf/core:^3Концептуальный обзор
Заголовок раздела «Концептуальный обзор»Модуль состоит из трёх компонентов.
PdfRValidator проверяет поток байтов кандидата на ISO 23504-1:2020 (PDF/R-1). Он работает с необработанными байтами, а не с внутренним состоянием writer. Это финальная проверка: валидатор выявляет расхождения между тем, что writer намеревается вывести, и тем, что требует спецификация. Реализованный набор пунктов — это кластер v5.1.0: §5 комментарий идентификации версии, §6.2.2/§6.2.3 список разрешённых заголовков, §6.2.4 запрет нулевого поколения и потоков объектов, §6.5.7 список разрешённых операторов потока содержимого (только q, Q, cm, Do), §6.6.1 список разрешённых ключей изображения XObject, §6.4.3 список разрешённых ключей словаря Info и §6.3 список разрешённых ключей Catalog. §6.7 инкрементные обновления и §6.8 шифрование явно не входят в начальный кластер и отмечены таковыми в claims.json. Валидатор не останавливается на первом замечании. Он собирает все расхождения за один проход, чтобы вы могли увидеть полный diff.
PdfRConformancePolicy — неизменяемая политика для рекомендуемых, но информативных диапазонов вокруг PDF/R-1. Нормативный минимум §6 никогда не настраивается. Политика управляет только рекомендациями по пределам реализации §A.5, рекомендацией не использовать многополосные страницы по §6.6.1 и требованием XMP Extensible Metadata Platform (XMP) по §A.6 для последующей переклассификации PDF/A.
ArlingtonValidator запускает вышестоящую модель Arlington PDF от PDF Association в режиме только отчёта. В текущем цикле он носит рекомендательный характер: validateReportOnly() никогда не выбрасывает исключение. Валидатор переключается между тремя режимами. Когда доступен эталонный бинарный файл проверки, он разбирает структурированные замечания. Когда доступна только закреплённая грамматика, он выдаёт одно замечание info, которое подтверждает, что закреплённая грамматика загружена. Когда грамматика недоступна, он возвращает пустой список. WaiverRegistry позволяет оркестратору подавлять известные допустимые расхождения, сохраняя контрольный след.
Правило честной маркировки согласовано с матрицей поддержки Cascading Style Sheets (CSS) и модулем соответствия. Пункт считается Verified только тогда, когда есть проходящий тест и приведён нормативный пункт. Пункт, который реализован, но не имеет отдельной фикстуры с проходящим тестом, считается Claimed. Пункты вне области охвата указываются явно. Они не остаются двусмысленными. Результат PdfRValidator с нулём замечаний утверждает только те пункты, которые валидатор проверяет. Он не делает никаких утверждений о §6.7 или §6.8, которые не реализует.
Поверхность API
Заголовок раздела «Поверхность API»| Тип | Вид | Ключевые члены |
|---|---|---|
NextPDF\Compliance\Validator\PdfRValidator | final class | validate(string $pdfBytes): list<PdfRValidationFinding> |
NextPDF\Compliance\Validator\PdfRValidationFinding | final readonly class | string $clause, 'error'|'warning'|'info' $severity, string $message |
NextPDF\Compliance\Profile\PdfRConformancePolicy | final readonly class | __construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival() |
NextPDF\Compliance\Validator\ArlingtonValidator | final class | validateReportOnly(string $pdfPath): list<ArlingtonFinding> |
NextPDF\Compliance\Validator\WaiverRegistry | final class | isWaived(string $validator, string $ruleId, string $scopeKey): bool |
Пример кода — быстрый старт
Заголовок раздела «Пример кода — быстрый старт»<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\PdfRValidator;
$validator = new PdfRValidator();$findings = $validator->validate(file_get_contents('candidate.pdf'));
if ($findings === []) { // Zero divergences from the §6 clauses PdfRValidator implements. // This is NOT a PDF/R-1 certificate — §6.7 and §6.8 are not checked. echo "No PDF/R-1 §6 divergences detected (implemented clause set).\n";} else { foreach ($findings as $f) { echo "[{$f->severity}] §{$f->clause}: {$f->message}\n"; }}Пример кода — продакшен
Заголовок раздела «Пример кода — продакшен»<?php
declare(strict_types=1);
use NextPDF\Compliance\Validator\ArlingtonValidator;use NextPDF\Compliance\Validator\ArlingtonGrammarLoader;use NextPDF\Compliance\Validator\WaiverRegistry;
$validator = new ArlingtonValidator( waivers: new WaiverRegistry(/* loaded waiver entries */), grammar: new ArlingtonGrammarLoader(/* pinned submodule path */), adapter: null, // grammar-only mode when the reference checker is absent);
// Advisory by contract — never throws on findings.$findings = $validator->validateReportOnly('artifact.pdf');
foreach ($findings as $finding) { // Each finding pins the Arlington grammar commit SHA for provenance. logger()->info('arlington', [ 'rule' => $finding->ruleId, 'severity' => $finding->severity, 'grammarSha' => $finding->grammarSha, ]);}Граничные случаи и подводные камни
Заголовок раздела «Граничные случаи и подводные камни»PdfRValidatorоснован на регулярных выражениях, а не на полноценном парсере. Он рассчитан на детерминированный выводNextPDF\Writer\PdfRWriter. Используйте его как детектор расхождений для этого writer, а не как универсальный парсер PDF.- Ноль замечаний ≠ полное соответствие PDF/R-1. §6.7 (инкрементные обновления) и §6.8 (шифрование) не реализованы в кластере v5.1.0 и объявлены вне области охвата в
claims.json. Воспринимайте чистый результат как “нет расхождений по реализованному набору пунктов” и не более того. - Arlington носит рекомендательный характер. В текущем цикле
validateReportOnly()никогда не приводит к сбою сборки. Continuous integration (CI) получает артефакт, но не блокирует сборку по его результатам. - Валидации PDF/A International Color Consortium (ICC) здесь нет. Валидация ICC для OutputIntent по ISO 19005-4:2020 §6.2.2 находится в Enterprise
PdfAManager(nextpdf/pro), а не в модуле Compliance из Core. Поверхность PDF/A в Core ограничена дискриминаторомConformanceMode. - Отказы (waivers) сохраняют контрольный след. Правило, для которого выдан отказ, скрывается из списка замечаний, но запись об отказе остаётся свидетельством того, почему это сделано.
Производительность
Заголовок раздела «Производительность»PdfRValidator::validate() выполняет один линейный проход с ограниченными обходами регулярных выражений по потоку байтов. Затраты масштабируются с размером документа и с большим запасом укладываются в бюджет модуля. В режиме только грамматики ArlingtonValidator имеет сложность O(grammar-rule-count) для замечания, подтверждающего загрузку. Сценарий с эталонной проверкой выполняется как подпроцесс и ограничен вышестоящим инструментом, а не NextPDF. Это внеполосный шаг CI.
Замечания по безопасности
Заголовок раздела «Замечания по безопасности»Эти валидаторы читают недоверенные байты PDF. PdfRValidator удаляет литералы в скобках и шестнадцатеричные литералы перед извлечением ключей, поэтому специально подобранная строка Creator не может внедрить ложный ключ /Name (ISO 32000-1:2008 §7.3.4.2 обработка экранирования). Адаптер Arlington запускает вышестоящий инструмент проверки как ограниченный подпроцесс. Он трактует тайм-аут или ошибку выполнения как отсутствие замечаний, а не доверяет частичному выводу. См. модель угроз проекта, чтобы понять поверхность атаки при разборе PDF.
Соответствие
Заголовок раздела «Соответствие»| Стандарт | Пункт | Что делает модуль Compliance | Статус |
|---|---|---|---|
| стандарт ISO 23504-1:2020 (PDF/R-1) | §6.5.7 | PdfRValidator применяет список разрешённых операторов потока содержимого к {q,Q,cm,Do} | Verified (модульные + стандарт-профильные + интеграционные тесты проходят) |
| стандарт ISO 23504-1:2020 (PDF/R-1) | §6.4.3 | PdfRValidator применяет список разрешённых ключей словаря Info | Verified (подтверждено тестами) |
| стандарт ISO 23504-1:2020 (PDF/R-1) | §6.7, §6.8 | Не реализовано в кластере v5.1.0 | Явное отсутствие охвата (объявлено в claims.json) |
| стандарт ISO 32000-2:2020 (PDF 2.0) | §7.5.2 | Проход по списку разрешённых ключей Catalog | Claimed (структурный проход регулярными выражениями) |
| стандарт ISO 19005-4:2020 (PDF/A-4) | §6.7.3 | Учитывает схему идентификации через модуль Conformance | Перекрёстная ссылка (см. /specifications/pdfa4/) |
Поддержка — это не соответствие. Запуск PdfRValidator, который не возвращает замечаний, доказывает лишь то, что входные данные не расходятся с пунктами §6, которые реализует валидатор. Он не утверждает, что файл соответствует PDF/R-1: §6.7 и §6.8 не проверяются. Перекрёстная проверка Arlington носит рекомендательный характер и никогда не утверждает соответствие. Для PDF/A-4 авторитетным валидатором является veraPDF, который выполняется внеполосно. См. модуль соответствия, чтобы понять оракул veraPDF и блокировку с явным включением.
Цитаты перефразированы из корпуса соответствия NextPDF. Полные 64-символьные дайджесты reference_id записаны в front-matter страницы и в _normative-evidence-conf.md.
См. также
Заголовок раздела «См. также»- Модуль соответствия — маршрутизация
ConformanceModeи оракул veraPDF - Модуль аудита — контрольный след и поверхность аттестации
- Сопоставление спецификации PDF/A-4 — охват и отсутствие охвата ISO 19005-4
- Модуль безопасности — модель угроз при разборе PDF