Формирование архивного вывода PDF/A-4
Коротко о главном
Заголовок раздела «Коротко о главном»Используйте этот рецепт, чтобы сформировать архивный вывод PDF/A-4 (International Organization for Standardization (ISO) 19005-4) с помощью Pro-компонента PdfAManager. При сохранении NextPDF планирует вывод OutputIntent, встроенного профиля International Color Consortium (ICC) и идентификационных метаданных. NextPDF формирует вывод, рассчитанный на соответствие; решение о соответствии принимает независимый валидатор. Рецепт основан на examples/32-pdfa4-icc.php.
Установка
Заголовок раздела «Установка»composer require nextpdf/core:^3composer require nextpdf/proPDF/A-4 — функция уровня Pro. При установке только Core enablePdfA() вызывает InvalidConfigException. В сообщении указана отсутствующая возможность security.pdfa и способ устранения composer require nextpdf/pro. Для проверки требуется валидатор PDF/A, доступный в PATH. В примерах используется veraPDF с --flavour 4.
Концептуальный обзор
Заголовок раздела «Концептуальный обзор»PDF/A-4 — архивный профиль ISO 19005-4, построенный на ISO 32000-2 (PDF 2.0). Соответствующий файл самодостаточен, а его цветовое поведение детерминировано. Он объявляет OutputIntent, который ссылается на встроенный целевой профиль ICC, поэтому цвет воспроизводится без внешних ресурсов (§6.2.3). Каждая программа шрифта встроена (§6.2.10.4.1). Документ содержит идентификационные метаданные pdfaid в формате Extensible Metadata Platform (XMP) (§6.7.3). Файл не зашифрован (§6.6.4 — PDF/A запрещает ключ трейлера Encrypt).
NextPDF моделирует PDF/A через типизированное перечисление ConformanceMode. enablePdfA() создаёт экземпляр Pro-компонента PdfAManager и по умолчанию использует ConformanceMode::PdfA4. Во время save() менеджер планирует вывод OutputIntent, потока ICC и схем расширения XMP. Дискриминаторы pdfaPart() и pdfaConformanceLetter() сохраняют метаданные pdfaid:part / pdfaid:conformance согласованными с выбранным вариантом (базовый 4, 4e, 4f). Базовый профиль не выводит букву pdfa:conformance, как требует эта часть стандарта.
Поверхность API
Заголовок раздела «Поверхность API»Описание интерфейса прикладного программирования (API) генерируется из PHPDoc. Используйте следующие ключевые точки входа:
\NextPDF\Core\Document::createStandalone(): DocumentDocument::enablePdfA(?object $version = null): static\NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool\NextPDF\Conformance\ConformanceMode::PdfA4/PdfA4e/PdfA4fConformanceMode::pdfaPart(): 2|3|4|nullиConformanceMode::pdfaConformanceLetter(): string
Пример кода — быстрый старт
Заголовок раздела «Пример кода — быстрый старт»<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
use NextPDF\Core\Document;use NextPDF\Support\CapabilityRegistry;
$out = __DIR__ . '/output/32-pdfa4-icc.pdf';
// Probe before activating a Pro-gated feature so a Core-only install// gets an actionable message instead of a stack trace.$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);}
$doc = Document::createStandalone();$doc->enablePdfA(); // defaults to ConformanceMode::PdfA4$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);$doc->save($out); // PdfAManager emits OutputIntent + ICC + XMP here
echo "Created: output/32-pdfa4-icc.pdf\n";Пример кода — продакшен
Заголовок раздела «Пример кода — продакшен»Используйте эту самодостаточную программу в тестовой обвязке. В продакшене сделайте вердикт валидатора контрольной точкой сборки. Успешный save() подтверждает, что NextPDF сформировал артефакты; соответствие подтверждает только валидатор.
<?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');
if (!CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable()) { fwrite(STDERR, "PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro\n"); exit(1);}
try { $doc = Document::createStandalone(); $doc->enablePdfA(); // ConformanceMode::PdfA4
$doc->setTitle('Archival Record 2026-0042'); $doc->setLanguage('en'); $doc->addPage(); $doc->setFont('helvetica', '', 12); $doc->cell(0, 10, 'Long-term archival record. PDF/A-4 (ISO 19005-4).', newLine: true);
// Do NOT call setEncryption(): PDF/A prohibits the Encrypt key and // the call raises an incompatibility exception in either order. $doc->save($out);} catch (InvalidConfigException $e) { fwrite(STDERR, "PDF/A-4 activation failed: {$e->getMessage()}\n"); exit(1);}
$exitCode = 0;$report = [];exec('verapdf --flavour 4 ' . escapeshellarg($out), $report, $exitCode);
if ($exitCode !== 0) { fwrite(STDERR, "veraPDF FAILED — output is not PDF/A-4 conforming\n"); fwrite(STDERR, implode("\n", $report) . "\n"); exit(1);}
echo "veraPDF PASS — archival.pdf is reported PDF/A-4 conforming\n";На узле с установленными nextpdf/pro и verapdf, где валидатор сообщает о соответствии файла, ожидаемый стандартный вывод (STDOUT) такой:
veraPDF PASS — archival.pdf is reported PDF/A-4 conformingНа узле только с Core программа завершается с ненулевым кодом и записывает PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro в стандартный поток ошибок (STDERR). Если verapdf сообщает о проблеме, программа завершается с ненулевым кодом после veraPDF FAILED — output is not PDF/A-4 conforming. Формулировка относит вердикт к veraPDF; NextPDF не утверждает соответствие PDF/A-4.
Граничные случаи и подводные камни
Заголовок раздела «Граничные случаи и подводные камни»- Ограничение по Pro. При установке только Core
enablePdfA()выбрасываетInvalidConfigException. В сообщении указаныsecurity.pdfaи способ устраненияcomposer require nextpdf/pro. Сначала опросите реестр, чтобы вывести понятное оператору сообщение. - Конфликт с шифрованием. Если вы вызываете
setEncryption(),useAesGcm()илиsetPublicKeyEncryption()для документа PDF/A, NextPDF выбрасывает исключение о несовместимости независимо от порядка вызовов. PDF/A-4 запрещает ключ трейлераEncrypt(ISO 19005-4 §6.6.4). - Вариант соответствия. Передайте Pro-объект
PdfAVersionвenablePdfA()для4e(инженерия, 3D) или4f(вложенные файлы). Базовый профиль не выводит буквуpdfa:conformance;4e/4fустанавливаютE/F. ДискриминаторConformanceModeсохраняет согласованностьpdfaid:part. - Тегирование независимо. Для базового профиля PDF/A-4 тегирование необязательно. Чтобы результат был одновременно доступным и пригодным для архивирования, включите режим тегирования и PDF/A по отдельности; см. рецепт PDF/UA-2.
- Контрольная точка — валидатор. Успешный
save()означает, что артефакты были сформированы, а не что файл соответствует требованиям. Не заявляйте о соответствии PDF/A-4, пока валидатор не подтвердит его.
Производительность
Заголовок раздела «Производительность»OutputIntent добавляет один поток ICC-профиля (несколько сотен КБ для sRGB) и пакет XMP. Если документ использует шрифты, не входящие в базовый набор из 14, основной вклад в размер даёт встраивание шрифтов. Для типичных архивных документов рецепт укладывается в бюджет 2000 мс / 128 МБ. Применяется профиль семантической воспроизводимости: сравнивайте результат, ориентированный на валидатор, по структурному абстрактному синтаксическому дереву (AST) и метаданным, а не по необработанным байтам.
Примечания по безопасности
Заголовок раздела «Примечания по безопасности»Резидентность данных и меры по защите ПДн
Заголовок раздела «Резидентность данных и меры по защите ПДн»Архивный вывод по своей природе долговечен и самодостаточен. Любые персональные данные в содержимом сохраняются на весь срок хранения архива. Встроенный ICC-профиль и метаданные перемещаются вместе с файлом. Перед архивированием примените политику хранения и минимизации данных. В PDF/A-4 нет семантики редактирования (удаления конфиденциальных данных).
Безопасная телеметрия и очистка журналов
Заголовок раздела «Безопасная телеметрия и очистка журналов»Рецепт записывает только фиксированную строку прогресса. Вывод veraPDF может содержать фрагменты содержимого; для документов с конфиденциальным содержимым не отправляйте журналы валидатора в общие приёмники журналов.
Модель угроз
Заголовок раздела «Модель угроз»PDF/A-4 — профиль точности архивирования, а не средство контроля целостности или подлинности. Он не подписывает файл и не делает несанкционированные изменения очевидными. Сочетайте его с подписью, когда важно происхождение. Подпись рассматривается в отдельном рецепте. Согласно спецификации шифрование несовместимо с PDF/A.
Поведение в режиме FIPS
Заголовок раздела «Поведение в режиме FIPS»Этот рецепт не выполняет криптографических операций. Режим Federal Information Processing Standards (FIPS) не изменяет его поведение. PDF/A-4 запрещает шифрование, поэтому шифр не выбирается.
Соответствие
Заголовок раздела «Соответствие»| Утверждение | Спецификация | Пункт | reference_id (идентификатор ссылки) |
|---|---|---|---|
| PDF/A-4 требует OutputIntent, ссылающийся на встроенный ICC-профиль. | ISO 19005-4 | §6.2.3 | |
| Цвет не зависит от устройства благодаря целевому профилю вывода. | ISO 19005-4 | §6.2.4.3 | |
| Каждая программа шрифта встроена. | ISO 19005-4 | §6.2.10.4.1 | |
| Документ содержит идентификацию pdfaid в XMP. | ISO 19005-4 | §6.7.3 | |
| Шифрование запрещено в PDF/A-4. | ISO 19005-4 | §6.6.4 | |
| Соответствие определяет валидатор, а не генератор. | ISO 19005-4 | §6.7.3 |
NextPDF формирует вывод, рассчитанный на соответствие PDF/A-4. Поддержка — это не соответствие; протестированный профиль — это не сертификация. Этот рецепт не утверждает соответствие; такое решение принимает независимый валидатор, например veraPDF. Сделайте его вердикт контрольной точкой сборки.