Przejdź do głównej zawartości

Generowanie archiwalnego wyjścia PDF/A-4

Użyj tego przepisu, aby za pomocą menedżera Pro PdfAManager wygenerować archiwalne wyjście PDF/A-4 (Międzynarodowa Organizacja Normalizacyjna (ISO) 19005-4). Podczas zapisu NextPDF przygotowuje element OutputIntent, osadzony profil International Color Consortium (ICC) oraz metadane identyfikacyjne. NextPDF generuje wyjście ukierunkowane na zgodność; samą zgodność rozstrzyga niezależny walidator. Przepis opiera się na examples/32-pdfa4-icc.php.

Okno terminala
composer require nextpdf/core:^3
composer require nextpdf/pro

PDF/A-4 to funkcja warstwy Pro. W instalacji obejmującej wyłącznie Core wywołanie enablePdfA() zgłasza InvalidConfigException. Komunikat wskazuje brakującą zdolność security.pdfa oraz podpowiada rozwiązanie composer require nextpdf/pro. Do weryfikacji potrzebny jest walidator PDF/A dostępny w PATH. W przykładach użyto veraPDF z --flavour 4.

PDF/A-4 to profil archiwalny ISO 19005-4 zbudowany na ISO 32000-2 (PDF 2.0). Zgodny plik ma deterministyczny kolor i jest samowystarczalny. Deklaruje element OutputIntent, który odwołuje się do osadzonego docelowego profilu ICC, dzięki czemu kolor jest odtwarzany bez zasobów zewnętrznych (§6.2.3). Każdy program czcionki jest osadzony (§6.2.10.4.1). Dokument zawiera metadane identyfikacyjne pdfaid w formacie Extensible Metadata Platform (XMP) (§6.7.3). Plik nie jest zaszyfrowany (§6.6.4 — PDF/A zabrania klucza zwiastuna Encrypt).

NextPDF modeluje PDF/A za pomocą typowanego wyliczenia ConformanceMode. enablePdfA() tworzy egzemplarz menedżera Pro PdfAManager i domyślnie przyjmuje ConformanceMode::PdfA4. Podczas save() menedżer przygotowuje element OutputIntent, strumień ICC oraz schematy rozszerzeń XMP. Dyskryminatory pdfaPart() oraz pdfaConformanceLetter() utrzymują metadane pdfaid:part / pdfaid:conformance w zgodzie z wybranym wariantem (bazowy 4, 4e, 4f). Profil bazowy nie emituje litery pdfa:conformance, zgodnie z wymaganiem tej części.

Powierzchnia API jest generowana z PHPDoc. Użyj tych kluczowych punktów wejścia:

  • \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 oraz 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";

Użyj tego samowystarczalnego programu w środowisku testowym. W środowisku produkcyjnym uczyń werdykt walidatora bramką w procesie kompilacji. Pomyślne wywołanie save() potwierdza, że NextPDF wyemitował artefakty; zgodność potwierdza wyłącznie walidator.

<?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";

Na hoście z zainstalowanym nextpdf/pro oraz z verapdf, który raportuje plik jako zgodny, oczekiwane wyjście standardowe (STDOUT) to:

veraPDF PASS — archival.pdf is reported PDF/A-4 conforming

Na hoście wyłącznie z Core program kończy działanie z kodem różnym od zera po zapisaniu PDF/A-4 requires nextpdf/pro. Run: composer require nextpdf/pro na standardowe wyjście błędów (STDERR). Jeśli verapdf zgłosi problem, program kończy działanie z kodem różnym od zera po komunikacie veraPDF FAILED — output is not PDF/A-4 conforming. Komunikat przypisuje werdykt narzędziu veraPDF; NextPDF nie deklaruje zgodności z PDF/A-4.

  • Bramka Pro. W instalacji obejmującej wyłącznie Core enablePdfA() zgłasza InvalidConfigException. Komunikat wskazuje security.pdfa oraz rozwiązanie composer require nextpdf/pro. Najpierw odpytaj rejestr, aby wyświetlić czytelny komunikat dla operatora.
  • Konflikt z szyfrowaniem. Jeśli wywołasz setEncryption(), useAesGcm() lub setPublicKeyEncryption() na dokumencie PDF/A, NextPDF zgłasza wyjątek niezgodności niezależnie od kolejności wywołań. PDF/A-4 zabrania klucza zwiastuna Encrypt (ISO 19005-4 §6.6.4).
  • Wariant zgodności. Przekaż obiekt Pro PdfAVersion do enablePdfA(), aby wybrać wariant 4e (inżynieria, 3D) lub 4f (załączniki plików). Profil bazowy nie emituje litery pdfa:conformance; warianty 4e/4f ustawiają E/F. Dyskryminator ConformanceMode utrzymuje spójność pdfaid:part.
  • Tagowanie jest niezależne. Profil bazowy PDF/A-4 traktuje tagowanie jako opcjonalne. Aby uzyskać produkt jednocześnie dostępny i archiwalny, włącz tryb tagowany oraz PDF/A osobno; zobacz przepis PDF/UA-2.
  • Bramką jest walidator. Pomyślne wywołanie save() oznacza, że artefakty zostały wyemitowane, a nie że plik jest zgodny. Nie deklaruj zgodności z PDF/A-4, dopóki walidator nie przejdzie pomyślnie.

Element OutputIntent dodaje jeden strumień profilu ICC (kilkaset KB dla sRGB) oraz pakiet XMP. Osadzanie czcionek dominuje w rozmiarze, gdy dokument używa czcionek spoza zestawu base-14. W przypadku typowych dokumentów archiwalnych przepis mieści się w budżecie 2000 ms / 128 MB. Obowiązuje profil odtwarzalności semantycznej: porównuj wynik ukierunkowany na walidator na poziomie strukturalnego drzewa składni abstrakcyjnej (AST) oraz metadanych, a nie surowych bajtów.

Wyjście archiwalne jest z założenia długowieczne i samowystarczalne. Wszelkie dane osobowe zawarte w treści pozostają przez cały okres życia archiwum. Osadzony profil ICC oraz metadane są przenoszone wraz z plikiem. Przed archiwizacją zastosuj zasady retencji i minimalizacji. PDF/A-4 nie definiuje semantyki redakcji.

Przepis zapisuje wyłącznie stały wiersz postępu. Wyjście veraPDF może zawierać fragmenty treści; w przypadku dokumentów z wrażliwą treścią trzymaj dzienniki walidatora poza współdzielonymi miejscami zbierania dzienników.

PDF/A-4 to profil wierności archiwalnej, a nie mechanizm kontroli integralności ani autentyczności. Nie podpisuje pliku ani nie sprawia, że manipulacja staje się widoczna. Połącz go z podpisem, gdy istotne jest pochodzenie. Osobny przepis omawia podpis. Zgodnie ze specyfikacją szyfrowanie wzajemnie wyklucza się z PDF/A.

Ten przepis nie wykonuje żadnej operacji kryptograficznej. Tryb Federal Information Processing Standards (FIPS) nie zmienia jego zachowania. PDF/A-4 zabrania szyfrowania, więc żaden szyfr nie jest wybierany.

StwierdzenieSpecyfikacjaKlauzulareference_id
PDF/A-4 wymaga elementu OutputIntent odwołującego się do osadzonego profilu ICC.ISO 19005-4§6.2.3
Kolor jest niezależny od urządzenia dzięki docelowemu profilowi wyjściowemu.ISO 19005-4§6.2.4.3
Każdy program czcionki jest osadzony.ISO 19005-4§6.2.10.4.1
Dokument przenosi identyfikację pdfaid w XMP.ISO 19005-4§6.7.3
Szyfrowanie jest zabronione w PDF/A-4.ISO 19005-4§6.6.4
O zgodności decyduje walidator, a nie producent.ISO 19005-4§6.7.3

NextPDF generuje wyjście ukierunkowane na zgodność z PDF/A-4. Wsparcie to nie zgodność; przetestowany profil to nie certyfikacja. Ten przepis nie stanowi deklaracji zgodności; rozstrzyga o tym niezależny walidator, taki jak veraPDF. Uczyń jego werdykt bramką w procesie kompilacji.