Перейти к содержимому

Соответствие: валидатор 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, которые не реализует.

ТипВидКлючевые члены
NextPDF\Compliance\Validator\PdfRValidatorfinal classvalidate(string $pdfBytes): list<PdfRValidationFinding>
NextPDF\Compliance\Validator\PdfRValidationFindingfinal readonly classstring $clause, 'error'|'warning'|'info' $severity, string $message
NextPDF\Compliance\Profile\PdfRConformancePolicyfinal readonly class__construct(bool $enforceA5ImplementationLimits = true, bool $rejectMultiStripPages = false, bool $requireXmpForA6Compatibility = false); lax(), strictArchival()
NextPDF\Compliance\Validator\ArlingtonValidatorfinal classvalidateReportOnly(string $pdfPath): list<ArlingtonFinding>
NextPDF\Compliance\Validator\WaiverRegistryfinal classisWaived(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.7PdfRValidator применяет список разрешённых операторов потока содержимого к {q,Q,cm,Do}Verified (модульные + стандарт-профильные + интеграционные тесты проходят)
стандарт ISO 23504-1:2020 (PDF/R-1)§6.4.3PdfRValidator применяет список разрешённых ключей словаря InfoVerified (подтверждено тестами)
стандарт 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Проход по списку разрешённых ключей CatalogClaimed (структурный проход регулярными выражениями)
стандарт 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.