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

Соответствие 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:^3
composer require nextpdf/pro # OutputIntent + ICC + XMP authoring

Core регистрирует возможность 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 на уровне документа (пространство имён AIIM pdfaid) с 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 закрепляет определение за этим процессом.

МетодДействие
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 общедоступным.

Формирование 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 излагает разделы своими словами.