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

Формирование архивного вывода 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:^3
composer require nextpdf/pro

PDF/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) генерируется из PHPDoc. Используйте следующие ключевые точки входа:

  • \NextPDF\Core\Document::createStandalone(): Document
  • Document::enablePdfA(?object $version = null): static
  • \NextPDF\Support\CapabilityRegistry::getInstance()->get('security.pdfa')->isAvailable(): bool
  • \NextPDF\Conformance\ConformanceMode::PdfA4 / PdfA4e / PdfA4f
  • ConformanceMode::pdfaPart(): 2|3|4|null и ConformanceMode::pdfaConformanceLetter(): string
examples/32-pdfa4-icc.php
<?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.

Этот рецепт не выполняет криптографических операций. Режим 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. Сделайте его вердикт контрольной точкой сборки.