Соответствие PDF/A-4: что NextPDF формирует для ISO 19005-4
Границы ответственности. NextPDF формирует результат, рассчитанный на соответствие PDF/A-4. Библиотека не подтверждает соответствие; это делает валидатор, например veraPDF.
PDF/A-4 — это ISO 19005-4:2020, архивный профиль на основе PDF 2.0. NextPDF Core использует дискриминатор ConformanceMode (PdfA4, PdfA4e, PdfA4f). Движок Premium nextpdf/pro во время save() формирует OutputIntent, встроенный профиль ICC и схему идентификации pdfaid для Extensible Metadata Platform (XMP). Библиотека формирует артефакты; соответствие определяет veraPDF. ISO 19005-4 §6.7.3 прямо указывает: свойства pdfaid:part/pdfaid:rev “сами по себе не определяют соответствие”.
Установка
Заголовок раздела «Установка»composer require nextpdf/core:^3composer require nextpdf/pro # OutputIntent + ICC + XMP authoringCore регистрирует возможность security.pdfa, но без nextpdf/pro помечает её как недоступную. В этом случае enablePdfA() выбрасывает InvalidConfigException с указанием пути обновления, не формируя несоответствующий файл.
Концептуальный обзор
Заголовок раздела «Концептуальный обзор»Document::enablePdfA(?object $version = null) сопоставляет входное значение перечисления PdfAVersion с вариантом ConformanceMode. Если входное значение не распознано, используется ConformanceMode::PdfA4 ('4e' → PdfA4e, '4f' → PdfA4f). Режим задаёт три обязательных действия при формировании соответствующего файла:
- OutputIntent + ICC — §6.2.3 разрешает соответствующему файлу задавать цветовые характеристики через PDF/A OutputIntent, который ссылается на поток
DestOutputProfileс профилем International Color Consortium (ICC). Согласно §6.2.4.1 это один из двух разрешённых способов задания аппаратно-независимого цвета (второй — прямое указание аппаратно-независимых цветовых пространств). OutputIntent — путь, выбранный NextPDF, а не безусловное требование стандарта. - Идентификация
pdfaid— §6.7.3 требует схему идентификации PDF/A в XMP на уровне документа (пространство имён AIIMpdfaid) сpdfaid:part/pdfaid:rev. Для PDF/A-4e и PDF/A-4f также задаётсяpdfa:conformance(E / F). §6.7.3 устанавливает, что файл, не соответствующий ни одному из этих профилей, не должен предоставлять значениеpdfa:conformance. - Встраивание шрифтов — §6.2.10 требует встраивания всех шрифтов, используемых для отрисовки.
NextPDF формирует эти артефакты, но не определяет соответствие по §5. Это задача veraPDF; §6.7.3 закрепляет определение за этим процессом.
Поверхность API
Заголовок раздела «Поверхность API»| Метод | Действие |
|---|---|
enablePdfA(?object $version = null): static | Выбирает ConformanceMode::PdfA4/PdfA4e/PdfA4f; планирует OutputIntent + ICC + XMP при save(). Выбрасывает InvalidConfigException|PageLayoutException|CompressionException, если nextpdf/pro отсутствует. |
ConformanceMode::pdfaPart(): ?int | Возвращает часть ISO 19005 для активного режима (4 для PdfA4*). |
ConformanceMode::pdfaConformanceLetter(): string | Возвращает букву pdfa:conformance (E / F) или пустую строку. |
Пример кода — быстрый старт
Заголовок раздела «Пример кода — быстрый старт»<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Exception\InvalidConfigException;use NextPDF\Support\CapabilityRegistry;
$out = getenv('NEXTPDF_COOKBOOK_OUTPUT') ?: __DIR__ . '/archival.pdf';
$registry = CapabilityRegistry::getInstance();if (!$registry->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro.\n"); exit(1);}
try { $doc = Document::createStandalone(); $doc->enablePdfA(); // ConformanceMode::PdfA4 $doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->writeHtml('<h1>Archival record</h1><p>Body.</p>'); $doc->save($out); // OutputIntent + ICC + XMP scheduled here} catch (InvalidConfigException $e) { fwrite(STDERR, $e->getMessage() . "\n"); exit(1);}
echo "Wrote {$out} — validate: verapdf --flavour 4 {$out}\n";Пример кода — продакшен
Заголовок раздела «Пример кода — продакшен»Используйте вердикт валидатора как контрольный шлюз сборки. Запустите verapdf --flavour 4 для полученного файла и считайте сборку неуспешной при ненулевом коде выхода. Контрольным шлюзом служит вердикт валидатора: результат, сформированный библиотекой, передаётся ему как входные данные, но сам вердиктом не становится. Полный конвейер с контрольным шлюзом см. в /cookbook/php/pdfa4-conformance-gate/.
Граничные случаи и подводные камни
Заголовок раздела «Граничные случаи и подводные камни»- Включайте до добавления содержимого. Вызывайте
enablePdfA()перед добавлением содержимого. Включение задним числом не обрабатывает повторно уже записанные объекты. - Без шифрования. PDF/A запрещает ключ
Encrypt. Не вызывайтеsetEncryption()для документа PDF/A. Шифрование обеспечивает конфиденциальность, а не архивную целостность; здесь они взаимоисключают друг друга. pdfa:conformanceзадаётся условно. Его задают только для PDF/A-4e и PDF/A-4f. Формирование этого значения в обычном файле PDF/A-4 само по себе нарушает соответствие (§6.7.3) — вариантConformanceModeпредотвращает это по построению.- Вложения PDF/A-4f. Встроенные файлы в PDF/A-4f должны содержать ключи
FиUF(Desc рекомендуется) согласно §6.7.5. Это поддерживает гибридный сценарий ZUGFeRD/Factur-X.
Производительность
Заголовок раздела «Производительность»Встраивание OutputIntent + ICC добавляет поток ICC фиксированного размера (профиль рабочего пространства) и пакет XMP во время save(). Бюджет: реальное время ≤ 1500 мс и пиковая память ≤ 128 МБ для типичного документа.
Примечания по безопасности
Заголовок раздела «Примечания по безопасности»PDF/A-4 запрещает шифрование. Профиль ограничивает документ ради архивности и долговечности, но не является средством защиты. Хранение ключей и политика проверяющей стороны выходят за рамки этого профиля; см. центр доверия.
Резидентность данных и меры защиты персональных данных
Заголовок раздела «Резидентность данных и меры защиты персональных данных»Формирование PDF/A-4 выполняется внутри процесса и записывает только документ, встроенный профиль ICC и пакет XMP. Никакое содержимое не покидает процесс. Персональные данные (PII) в исходном содержимом остаются ответственностью интегратора. Профиль не удаляет и не маскирует данные.
Безопасная телеметрия и очистка журналов
Заголовок раздела «Безопасная телеметрия и очистка журналов»Пример записывает в STDERR только путь к результату и команду валидатора. Он не пишет в журнал байты документа. Рецепт учитывает NEXTPDF_COOKBOOK_OUTPUT и никогда не выводит PDF в STDOUT.
Модель угроз
Заголовок раздела «Модель угроз»Файл PDF/A-4 не содержит управления доступом. Любой, у кого есть файл, может его прочитать. Профиль обеспечивает долговечность воспроизведения, а не конфиденциальность. Считайте поток ICC из OutputIntent общедоступным.
Поведение в режиме FIPS
Заголовок раздела «Поведение в режиме FIPS»Формирование PDF/A-4 не выполняет криптографических операций. Цифровая подпись файла PDF/A-4 (PDF/A-4 §6.5 разрешает профили PAdES) относится к отдельному рецепту подписи и наследует его FIPS-контекст. Эта страница не делает заявлений о подписании.
Соответствие
Заголовок раздела «Соответствие»| Утверждение | Стандарт | Раздел | Идентификатор ссылки (reference_id) |
|---|---|---|---|
| Цветовые характеристики файла PDF/A-4 можно задавать через PDF/A OutputIntent, ссылающийся на профиль ICC DestOutputProfile. | ISO 19005-4 | §6.2.3 | |
| Аппаратно-независимый цвет можно задавать прямо или косвенно через DestOutputProfile в OutputIntent (один из двух разрешённых способов). | ISO 19005-4 | §6.2.4.1 | |
| Версия PDF/A определяется схемой идентификации PDF/A (pdfaid) в XMP документа. | ISO 19005-4 | §6.7.3 | |
| pdfaid:part / pdfaid:rev сами по себе не определяют соответствие; его определяют согласно разделу 5. | ISO 19005-4 | §6.7.3 | |
| Файл, не соответствующий ни PDF/A-4e, ни PDF/A-4f, не должен предоставлять значение pdfa:conformance. | ISO 19005-4 | §6.7.3 | |
| Для встроенных файлов PDF/A-4f требуются ключи F и UF (Desc рекомендуется). | ISO 19005-4 | §6.7.5 | |
| Все шрифты, используемые для отрисовки, должны быть встроены. | ISO 19005-4 | §6.2.10 | |
| Использование прозрачности / цвета зависит от объявленного OutputIntent. | ISO 19005-4 | §6.2.9 |
Ссылки состоят из идентификатора раздела и указателей reference_id в проверочный корпус. Текст стандартов не воспроизводится; NextPDF излагает разделы своими словами.