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

ISO 19005-4 (PDF/A-4): карта возможностей NextPDF

International Organization for Standardization (ISO) 19005-4:2020 — это архивный профиль Portable Document Format (PDF) 2.0, известный как PDF/A-4. Эта страница сверяет профиль с возможностями NextPDF без завышения уровня поддержки: что формирует Core, что добавляет расширение nextpdf/pro и что явно остаётся вне охвата NextPDF. NextPDF формирует структуры, относящиеся к PDF/A-4; только валидатор может подтвердить, что файл соответствует профилю.

Окно терминала
composer require nextpdf/core:^3
# PDF/A-4 file authoring (OutputIntent + ICC + XMP) requires:
# composer require nextpdf/pro

ISO 19005-4:2020 основан на ISO 32000-2:2020 (PDF 2.0), тогда как PDF/A-2 и PDF/A-3 основаны на ISO 32000-1:2008 (PDF 1.7). NextPDF отражает это различие в базовой версии через ConformanceMode::requiresPdf17(). Метод возвращает false для всех вариантов PDF/A-4 и true для PDF/A-2 и PDF/A-3.

PDF/A-4 определяет три варианта соответствия. Базовый профиль не задаёт букву pdfa:conformance. PDF/A-4e (приложение B, инженерный / 3D-контент) задаёт pdfa:conformance = E. PDF/A-4f (приложение A, встроенные файлы) задаёт pdfa:conformance = F. ISO 19005-4:2020 §6.7.3 определяет схему идентификации PDF/A в пространстве имён Association for Intelligent Information Management (AIIM). Согласно этой схеме, файл, который не относится ни к PDF/A-4e, ни к PDF/A-4f, не содержит записи pdfa:conformance. NextPDF точно воспроизводит это поведение в ConformanceMode::pdfaConformanceLetter(): PdfA4 возвращает пустую строку, PdfA4e возвращает E, PdfA4f возвращает F.

Ключевая граница между редакциями — создание файла PDF/A-4. Словарь OutputIntent, встроенный профиль International Color Consortium (ICC), схема расширения Extensible Metadata Platform (XMP), гарантии создания подмножеств шрифтов и запрет на шифрование реализованы в Enterprise PdfAManager. Enterprise PdfAManager поставляется в расширении nextpdf/pro. В установке только с Core Document::enablePdfA() выбрасывает InvalidConfigException, потому что возможность security.pdfa не зарегистрирована. Готовый к запуску пример (examples/32-pdfa4-icc.php) показывает это: он проверяет реестр возможностей и завершается понятным сообщением без трассировки стека.

Поэтому в одном лишь Core область PDF/A-4 — только дискриминатор. NextPDF фиксирует, какой вариант PDF/A-4 объявляет документ. NextPDF формирует маркеры pdfaid:part = 4 / pdfa:conformance, определённые схемой. Создание полного файла PDF/A-4 — и проверка его соответствия — отдельные шаги. Для первого шага требуется nextpdf/pro. Для второго шага требуется veraPDF.

ПоверхностьРедакцияЧто предоставляет
ConformanceMode::PdfA4 / PdfA4e / PdfA4fcoreДискриминатор варианта
ConformanceMode::pdfaPart()4coreНомер части ISO 19005
ConformanceMode::pdfaConformanceLetter()'' / 'E' / 'F'coreБуква соответствия §6.7.3
ConformanceMode::requiresPdf17()falsecoreКонтроль происхождения PDF 2.0
Document::enablePdfA()proСоздание OutputIntent + ICC + XMP; выбрасывает InvalidConfigException в Core
<?php
declare(strict_types=1);
use NextPDF\Conformance\ConformanceMode;
// Core: introspect the declared PDF/A-4f contract.
$mode = ConformanceMode::PdfA4f;
$mode->pdfaPart(); // 4
$mode->pdfaConformanceLetter(); // 'F' (ISO 19005-4:2020 §6.7.3 / Annex A)
$mode->requiresPdf17(); // false (PDF/A-4 is PDF 2.0 lineage)
<?php
declare(strict_types=1);
use NextPDF\Core\Document;
use NextPDF\Exception\InvalidConfigException;
use NextPDF\Support\CapabilityRegistry;
// PDF/A-4 file authoring requires the Premium extension. Probe first so a
// Core-only install gets a clear rationale, not a stack trace.
$registry = CapabilityRegistry::getInstance();
if (!$registry->get('security.pdfa')->isAvailable()) {
throw new InvalidConfigException(
configKey: 'security.pdfa',
givenValue: 'Core-only install',
expectedType: 'nextpdf/pro extension (Enterprise PdfAManager)',
);
}
$doc = Document::createStandalone();
$doc->enablePdfA(); // Emits OutputIntent + ICC + pdfaid XMP (Premium).
// … write content …
$doc->save(__DIR__ . '/out/archive-a4.pdf');
// The file now CARRIES PDF/A-4 structures. Conformance is still unproven
// until veraPDF asserts it:
//
// verapdf --flavour 4 out/archive-a4.pdf
  • Core не может создать файл PDF/A-4. enablePdfA() выбрасывает исключение в Core. Core предоставляет только дискриминатор и маркеры XMP.
  • Базовый PDF/A-4 не формирует pdfa:conformance. Согласно ISO 19005-4:2020 §6.7.3, букву задают только PDF/A-4e и PDF/A-4f. ConformanceMode::PdfA4 возвращает пустую строку намеренно.
  • Происхождение от PDF 2.0, а не от PDF 1.7. Частая ошибка — повторно использовать конвейер PDF/A-3, который ожидает %PDF-1.7. PDF/A-4 — это PDF 2.0; requiresPdf17() возвращает false для всех вариантов PDF/A-4.
  • Проверка ICC относится к Premium. Проверку OutputIntent ICC по ISO 19005-4:2020 §6.2.2 (сигнатура acsp, таблица тегов, белая точка D50) выполняет Enterprise PdfAManager, а не Core.
  • Библиотека не сертифицирует файл. Установка PdfA4f и формирование маркеров не делают результат корректным файлом PDF/A-4f. Проверьте с помощью veraPDF.

Интерфейс PDF/A-4 в Core — это чистая интроспекция типизированных значений: диспетчеризация enum match, O(1) и без выделений памяти. Путь создания в Premium добавляет OutputIntent и пакет ICC во время записи. Его стоимость — размер встроенного профиля, который учитывается в бюджете записи. Проверка veraPDF выполняется вне основного пути генерации.

PDF/A-4 запрещает шифрование. Enterprise PdfAManager гарантирует инвариант запрета шифрования и применяет его в правильном порядке относительно enablePdfA(), чтобы вызывающий код не мог случайно совместить Advanced Encryption Standard in Galois/Counter Mode (AES-GCM) с архивным режимом. Предварительная защита Core в HasSecurity::enablePdfA() отклоняет неподдерживаемое сочетание до того, как будет записан хотя бы один байт. Подробности об архивном конвейере см. в модели угроз проекта.

Эта страница представляет собой сопоставление возможностей, а не заявление о соответствии.

Область ISO 19005-4:2020РазделОхват NextPDFСтатус
Схема идентификации варианта§6.7.3ConformanceMode формирует pdfaid:part = 4 и букву pdfa:conformance, определённую схемойЗаявлено (Core; модульные тесты в tests/Unit/Conformance/)
Контроль происхождения PDF 2.0§6.7.3 / базовыйrequiresPdf17() возвращает false для всех случаев PDF/A-4Проверено (модульными тестами)
OutputIntent + встроенный ICC§6.2.2Компонент Enterprise PdfAManager (nextpdf/pro)Только Premium (не Core)
Схема расширения XMP, создание подмножеств шрифтов, запрет на шифрование§6 / приложения A/BКомпонент Enterprise PdfAManager (nextpdf/pro)Только Premium (не Core)
Определение соответствияРаздел 5Не выполняется NextPDF — veraPDFЯвный отказ от охвата

Поддержка — это не соответствие, и эта страница намеренно разделяет эти два понятия. (a) NextPDF Core формирует структуры, которые ISO 19005-4:2020 §6.7.3 определяет для идентификации варианта; это реализация, подтверждённая tests/Unit/Conformance/ConformanceModePdfAVariantTest.php (тест проходит). (b) Соответствие файла профилю PDF/A-4 — отдельное утверждение; согласно ISO 19005-4:2020, раздел 5, его может сделать только валидатор. Раздел 5 устанавливает, что фактическое определение соответствия нормативным требованиям выполняет инструмент проверки. NextPDF заявляет только (a). NextPDF не заявляет (b). Проверьте с помощью veraPDF (verapdf --flavour 4 … или php oracle/run.php для oracle-обвязки — она запускается только при наличии двоичного файла veraPDF и включается вручную).

Формулировки “PDF/A-4 compliant”, “fully conformant” и “PDF/A-4 certified” намеренно отсутствуют на этой странице. NextPDF формирует структуры, относящиеся к PDF/A-4; он не гарантирует, что файл соответствует профилю.

Цитаты перефразированы из корпуса соответствия NextPDF. Полные 64-символьные дайджесты reference_id записаны во вступительных метаданных страницы и в docs/public/modules/core/_normative-evidence-conf.md.