Создание PDF/A-4-вывода и контроль через оракул veraPDF
В этом руководстве создаётся вывод Portable Document Format/Archive (PDF/A-4) с помощью PdfAManager уровня Premium, запускается veraPDF, а его вердикт используется как контрольная точка сборки. NextPDF записывает артефакты; решение о соответствии принимает валидатор. Процесс соответствует examples/32-pdfa4-icc.php.
Предварительные требования
Заголовок раздела «Предварительные требования»- Core установлен:
composer require nextpdf/core:^3. - Premium установлен:
composer require nextpdf/pro. PDF/A-4 — это функция уровня Premium (Architecture Decision Record ADR-011). Без PremiumenablePdfA()выбрасываетInvalidConfigExceptionс указанием пути обновления. - veraPDF доступен в
PATHдля шага контроля.
- Проверьте в реестре возможностей наличие
security.pdfa, чтобы при установке только Core показывалось понятное сообщение вместо трассировки стека. - Создайте документ и вызовите
enablePdfA()до того, как добавлять содержимое. - Задайте метаданные и запишите содержимое. Не вызывайте
setEncryption(); PDF/A запрещает ключEncrypt. - Сохраните документ. Во время
save()PdfAManagerподготавливает OutputIntent, встроенный профиль International Color Consortium (ICC) и схемы расширений Extensible Metadata Platform (XMP). - Запустите
verapdf --flavour 4для полученного файла. Завершите сборку с ошибкой, если код возврата не нулевой. Именно вердикт валидатора служит контрольной точкой.
Полный пример
Заголовок раздела «Полный пример»<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/archival.pdf';
// Step 1 — probe before activating a Premium-gated feature.$registry = CapabilityRegistry::getInstance();if (!$registry->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
try { $doc = Document::createStandalone();
// Step 2 — enable PDF/A-4 before content. Defaults to PdfA4. $doc->enablePdfA();
// Step 3 — metadata and content. No setEncryption() on a PDF/A document. $doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->addPage(); $doc->setFont('helvetica', '', 12); $doc->cell(0, 10, 'This document targets PDF/A-4.', newLine: true);
// Step 4 — save. PdfAManager emits OutputIntent + ICC + XMP here. $doc->save($out);} catch (InvalidConfigException $e) { fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n"); exit(1);}
// Step 5 — the gate. veraPDF, not the library, asserts conformance.$exitCode = 0;$output = [];exec('verapdf --flavour 4 ' . escapeshellarg($out), $output, $exitCode);
if ($exitCode !== 0) { fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n"); fwrite(STDERR, implode("\n", $output) . "\n"); exit(1);}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDF\n";Ожидаемый вывод
Заголовок раздела «Ожидаемый вывод»Когда проверка veraPDF проходит успешно:
veraPDF PASS — archival.pdf is reported PDF/A-4 conforming by veraPDFЕсли пакет Premium отсутствует, скрипт завершается с ненулевым кодом возврата, выводит сообщение с дальнейшими действиями и не записывает файл.
Граничные случаи
Заголовок раздела «Граничные случаи»- Контроль Premium. При установке только Core
enablePdfA()выбрасываетInvalidConfigException: в сообщении указаныsecurity.pdfaи решениеcomposer require nextpdf/pro. Сначала проверьте реестр. - Конфликт с шифрованием. Вызов
setEncryption(),useAesGcm()илиsetPublicKeyEncryption()для документа PDF/A вызывает исключение несовместимости независимо от порядка вызовов. PDF/A запрещает ключEncryptв трейлере. - Вариант соответствия. Передайте
PdfAVersionвenablePdfA(), чтобы выбрать4eили4f. По умолчанию используется4. - Контроль выполняет валидатор, а не движок. Успешный
save()означает, что NextPDF сформировал артефакты, требуемые PDF/A-4. Сам по себеsave()не подтверждает соответствие. Соответствие удостоверяет veraPDF; этот рецепт делает его вердикт контрольной точкой. Не утверждайте, что файл соответствует PDF/A-4, пока проверка валидатором не пройдена.
Соответствие
Заголовок раздела «Соответствие»| Утверждение | Спецификация | Раздел | Идентификатор ссылки (reference_id) |
|---|---|---|---|
| Файл PDF/A-4 может задавать свои цветовые характеристики через PDF/A OutputIntent, который ссылается на встроенный профиль International Color Consortium (ICC). Аппаратно-независимый цвет можно вместо этого задать напрямую; §6.2.4.1. | ISO 19005-4 | §6.2.3 | |
| Шифрование запрещено в PDF/A-4. | ISO 19005-4 | §6.6.4 | |
| В PDF/A-4 идентификация pdfaid содержится в метаданных Extensible Metadata Platform (XMP). | ISO 19005-4 | §6.7.5 |
Соответствие удостоверяет валидатор. Библиотека формирует вывод, предназначенный для соответствия; окончательное решение принимает валидатор.