Odborný článok

Výstup PDF 2.0, PDF/A-4 a PDF/UA-2 s HotPDF v Delphi

HotPDF zapisuje natívne dokumenty PDF 2.0 z Delphi a C++Builder, vrátane troch archivačných profilov PDF/A-4 a prístupného výstupu PDF/UA-2 so štruktúrnymi elementmi v priestore názvov. Ich výber je vecou dvoch vlastností, no štandardy za týmito vlastnosťami sa zmenili viac, než naznačuje číslo verzie: PDF/A-4 zahodilo písmená zhody, ktoré sa všetci naučili s PDF/A-2, a PDF/UA-2 zaviedlo priestory názvov štruktúry, ktoré dokument časťi 1 nikdy nemal

Tento článok pokrýva, čo sa skutočne mení vo vygenerovanom súbore a ktoré chyby HotPDF mení na výnimku v EndDoc namiesto na dokument, ktorý zlyhá validáciou u zákazníka

Čím sa identifikácia PDF/A-4 líši od časti 2 a 3

PDF/A-4 sa identifikuje číslom časti a rokom revízie, bez písmena zhody pre základnú časť. Nastavte PDFACompliance na '4' a HotPDF emituje pdfaid:part=4 s pdfaid:rev=2020 a vôbec žiadnu položku pdfaid:conformance. Písmeno sa nestratilo — časť 4 nemá žiadne úrovne A/B/U, pretože požiadavky, ktoré ich kedysi oddeľovali, boli zlúčené do základnej časti

Dve rozšírenia si písmeno ponechávajú. '4E' vyberá PDF/A-4e pre inžinierske dokumenty a emituje zhodu E, ktorá povoľuje cesty 3D a RichMedia anotácií, ktoré ostatné profily zakazujú. '4F' vyberá PDF/A-4f a emituje zhodu F, ktorá povoľuje vložený súbor akéhokoľvek formátu. Všetky tri vynútia hlavičku PDF 2.0, vyžadujú si bežnú kontrolu výstupného zámeru a metadát PDF/A a zakazujú šifrovanie — šifrovaný archivačný súbor je rozpor, ktorý štandard nezvažuje

var
  Pdf: THotPDF;
begin
  Pdf := THotPDF.Create(nil);
  try
    Pdf.FileName := 'invoice-archive.pdf';
    Pdf.PDFACompliance := '4F';   // PDF/A-4f: associated files of any format
    Pdf.BeginDoc;
    Pdf.CurrentPage.SetFont('Arial', [], 11);
    Pdf.CurrentPage.TextOut(50, 760, 0, 'Invoice 2026-0731');
    Pdf.AddPDFAssociatedFile('invoice.xml', 'text/xml',
      'Structured invoice data', 'Data', LoadInvoiceBytes);
    Pdf.EndDoc;
  finally
    Pdf.Free;
  end;
end;

AddPDFAssociatedFile vloží súbor, postaví jeho FileSpec s /AFRelationship a zaregistruje ho v poli /AF katalógu aj v strome názvov EmbeddedFiles. Obe registrácie sú povinné; súbor uvedený iba v jednej z nich je najčastejšia príčina, prečo hybridná faktúra prejde rýchlou vizuálnou kontrolou a zlyhá skutočným validátorom. Reťazec vzťahu prijíma Source, Data, Alternative, Supplement alebo Unspecified a aktívny profil musí byť PDF/A-3, PDF/A-4e alebo PDF/A-4f — základný profil časti 4 neprípúšťa pridružené súbory. Starší názov AddPDFA3AssociatedFile stále funguje pre existujúci kód

Čo PDF/UA-2 vyžaduje a PDF/UA-1 nevyžadovalo

PDF/UA-2 vynúti PDF 2.0 a emituje pdfuaid:part=2 s pdfuaid:rev=2024 a zavádza priestory názvov do stromu štruktúry. Dokument časti 1 mal jednu plochú slovnú zásobu štandardných rolí. Dokument časti 2 môže niesť vlastné roly, pokiaľ každá z nich patrí do deklarovaného priestoru názvov, čo robí doménovo špecifické značenie zrozumiteľným pre asistívne technológie namiesto hádania

Dve metódy to implementujú. RegisterStructureNamespace vytvorí alebo zrecykluje nepriamy slovník /Type /Namespace a zaradí ho do StructTreeRoot /Namespaces, pričom vráti slovník, aby ste ho mohli znova použiť. AddStructureElementNS vytvorí štruktúrny element, ktorého položka /NS ukazuje na tento slovník, čo je to, čo povoľuje názov role mimo štandardnej množiny. Opakované volania s rovnakým URI znova použijú jeden slovník namiesto hromadenia duplikátov

var
  Root: THPDFDictionaryObject;
begin
  Pdf.PDFUACompliance := True;
  Pdf.PDFUAPart := 2;             // part 2 forces PDF 2.0
  Pdf.Lang := 'en-US';
  Pdf.BeginDoc;
  Root := Pdf.AddStructureElement('Document', nil);
  Pdf.AddStructureElementNS('WidgetGroup',
    'https://example.com/ns/widgets', Root);
  Pdf.EndDoc;
end;

Lang tu nie je dekorácia. Značený dokument bez deklarovaného prirodzeného jazyka necháva čítačku obrazovky hádať výslovnosť a PDF/UA s tým zaobchádza ako s defektom a nie ako s voľbou

Ktoré chyby štruktúry zachytí EndDoc?

Štyri a každá zodpovedá dokumentu, ktorý by inak dorazil k validátoru poškodený. Koreň štruktúry musí obsahovať presne jeden element Document na najvyššej úrovni. Každý slovník priestoru názvov musí byť nepriamy, typovaný ako Namespace a nesie unikátne neprázdne URI. Každá referencia /NS štruktúrneho elementu musí vyriešiť na slovník skutočne uvedený v poli /Namespaces koreňa. A role bez priestoru názvov musí byť buď štandardnou rolou PDF 2.0, alebo sa vyriešiť cez RoleMap

Tieto sa spúšťajú v EndDoc, pretože to je posledný okamih, kedy existuje celý strom v pamäti, a prvý okamih, kedy je úplný. Ich zachytenie skôr by znamenalo odmietnutie platných medzistavov; ich zachytenie neskôr by znamenalo, že by sa nezachytili vôbec. Praktický dôsledok pre váš kód je, že chyba štruktúry sa objaví na konci generovania so správou pomenúvajúcou problém, namiesto toho, aby sa objavila o týždne neskôr ako veraPDF report, ktorý niekto prepošle od zákazníka

Role PDF 2.0, ktoré sa oplatí poznať

Typovaný enum rolí získava DocumentFragment, Aside, Title, FENote, Sub, Em, Strong a Artifact. Tri z nich menia spôsob, akým značíte bežné obchodné dokumenty. Aside konečne dáva bočným panelom a pull citátom domov, ktorý nie je zneužitým Sect. FENote označuje poznámky pod čiarou a koncové poznámky ako to, čím sú, takže čítačka ich môže ponúknuť namiesto toho, aby ich prelínala s telom textu. Em a Strong nahrádzajú sémantické hádanie, ktoré prichádzalo z tagovania dôrazu ako formátovania na úrovni span

Reťazcové preťaženie navyše prijíma otvorený tvar Hn, vrátane H7 a ďalej. PDF 1.7 sa zastavovalo pri H6, čo nútilo hlboké technické dokumenty sploštiť ich osnovu alebo znovu používať úrovne. Ak generujete štandardné dokumenty, právne kódexy alebo katalógy súčiastok, samotné to môže byť dôvod na presun výstupu na PDF 2.0

Čo skontrolovať pred prepnutím produkčného výstupu

PDF 2.0 je zmena hlavičky s dlhým chvostom. Staršie nástroje na archivačný ingest, niektoré tlačové RIP a prekvapivé množstvo biznis prehliadačov prijímajú iba do PDF 1.7 a zlyhávajú na hlavičke namiesto na čomkoľvek, čo ste urobili zle. Pred prepnutím potvrďte konzumujúce systémy a pamätajte, že výber profilu PDF/A-4 vyberá PDF 2.0 bez ohľadu na to, či ste o to stáli

Bezpečná postupnosť je ponechať PDF/A-3 pre dokumenty, ktoré smerujú von k neznámym čitateľom, použiť PDF/A-4f pre interné archívy, kde ovládate ingest, a prijať PDF/UA-2 iba tam, kde ho politika prístupnosti menovite uvádza. Ak sa najprv prebíjate archivačnou stránkou, návody k validácii PDF/A, PDF/X a PDF/UA a k hybridným faktúram ZUGFeRD a Factur-X na PDF/A-3 pokrývajú voľby profilu, na ktorých záleží skôr než na čísle verzie, a poznámky k automatizovanému preflight reportingu ukazujú, ako urobiť verdikt súčasťou vášho buildu namiesto manuálneho kroku

HotPDF dodáva celú autorizačnu plochu PDF 2.0 ako natívny VCL kód pre Delphi a C++Builder, takže výstup PDF/A-4 a PDF/UA-2 nepotrebuje žiadny externý engine ani redistribuovateľný balík — stránka HotPDF komponentu uvádza podporované profily a verzie RAD Studio