Technický článek

Export sešitů Excel do PDF/A z Delphi

HotXLS exportuje sešit nebo jeden list přímo do PDF/A z Delphi a C++Builder, bez Excelu a bez ovladače PDF tiskárny. Nastavte UsePDFA a vyberte profil na TXLSPDFExport a exportovaný soubor ponese vložený ICC profil sRGB jako svůj výstupní záměr, blok identifikace pdfaid ve svých metadatech XMP a hlavičku verze PDF vhodnou pro danou úroveň shody

Tento požadavek obvykle přichází od zásad uchovávání záznamů, ne od vývojáře. Finanční výkazy, laboratorní výsledky, regulatorní podání a cokoli, co musí veřejnoprávní subjekt uchovávat po desítky let, musí být uloženo ve formátu, který se vykreslí identicky i za padesát let, a přesně to má garantovat PDF/A, ISO 19005. Sešit je živý výpočet; archivovaná kopie sešitu musí být pevným obrázkem jednoho stavu

Co dělá z PDF archivační PDF?

Většinu práce odvedou tři požadavky. Soubor musí být soběstačný, takže je vložen každý použitý font a neodkazuje se na žádný externí zdroj. Jeho barva musí být jednoznačná, což znamená výstupní záměr pojmenovávající barevný prostor, pro který byl soubor připraven. A musí se identifikovat sám sebou, přes metadata XMP deklarující číslo části a úroveň shody

HotXLS dodává všechny tři. Profil sRGB je vložen jako streamový objekt se třemi komponentami a DeviceRGB jako alternativou, odkazovaný z výstupního záměru GTS_PDFA1, jehož podmínka i identifikátor pojmenovávají sRGB IEC61966-2.1. Balíček XMP nese položky části a shody pdfaid. Bajty profilu jsou zkompilovány přímo do knihovny, ne načítány za běhu, takže neexistuje žádný nasazovací krok a žádná šance, že by chybějící soubor proměnil archivační export v obyčejný

Diagram tří archivačních požadavků PDF/A a přístroje, který HotXLS zapisuje z Delphi: vložené podmnožiny FontFile2, output intent GTS_PDFA1 sRGB a identifikace XMP pdfaid
Soubor PDF/A musí být soběstačný, barevně jednoznačný a identifikující sám sebe a HotXLS píše odpovídající apariát z dvojice vlastností UsePDFA
uses
  lxHandleX, lxPDF;

var
  Book: TXLSXWorkbook;
  Exporter: TXLSPDFExport;
begin
  Book := TXLSXWorkbook.Create;
  Exporter := TXLSPDFExport.Create;
  try
    if Book.Open('quarterly-results.xlsx') <> 1 then
      Exit;

    Exporter.UsePDFA := True;
    Exporter.PDFAProfile := xlsPdfA2b;      // ISO 19005-2 úroveň B
    Exporter.DocumentLanguage := 'en-GB';
    Exporter.TagMode := xlsPdfTagsAutomatic;

    if Exporter.SaveAsPDF(Book, 'quarterly-results-archive.pdf') <> 1 then
      raise Exception.Create('archival export failed');
  finally
    Exporter.Free;
    Book.Free;
  end;
end;

Který profil byste měli zvolit?

Výčet profilů pokrývá PDF/A-1, PDF/A-2 a PDF/A-3, každý v přístupné variantě a v základní variantě. Praktické rozdíly jsou užší, než napovídá výčet

Úroveň B, základní varianta, garantuje reprodukovatelný vizuální vzhled. Úroveň A přidává strukturální a sémantické požadavky, především značkovaný strom struktury a definované pořadí čtení, takže je dokument přístupný asistenčním technologiím. Část 2 uvolňuje některá omezení části 1 a povoluje objektové streamy a JPEG 2000; část 3 navíc povoluje libovolné vložené soubory, což je to, co formáty elektronické fakturace používají k přenosu strojově čitelného XML vedle stránky čitelné člověkem

Pro archivovaný sešit je PDF/A-2b pragmatickou výchozí volbou: archivy ho široce přijímají, nevyžaduje disciplínu značkování, kterou úroveň A ukládá na mřížku buněk, a povoluje kompaktní struktury, které brání 200stránkovému exportu sešitu v nabobtnání. Zvolte část 3, když archiv musí nést i zdrojová data jako přílohu, což exportér podporuje přes AddAttachment

Pravidlo o fontech, které chytí většinu lidí

Každý glyf, který soubor PDF/A vykreslí, musí pocházet z vloženého fontu. Toto je jediný nejčastější důvod, proč jinak správný export selže při validaci, a způsob selhání je zákeřný: soubor vypadá správně na stroji, který ho vytvořil, protože ten stroj má daný font nainstalovaný

HotXLS vkládá podmnožiny TrueType pro fonty, které používá, ale cesta záložního fontu base-14 existuje pro případy, kdy font nelze rozřešit, a záložní font base-14 z definice vložený není. Pro archivační výstup nastavte explicitní unicodový soubor fontu, aby se cesta záložního fontu nikdy nepoužila. Mechanismus subsettingu a záložní řetězec popisuje článek subsetting fontů TrueType; praktickým pravidlem je otestovat export na stroji, který nemá vaše firemní fonty nainstalované

Diagram pravidla fontů PDF/A v exportech HotXLS Delphi: rozřešené fonty se stanou vloženými podmnožinami TrueType validními všude, zatímco záloha base-14 se nikdy nevkládá a selže na strojích bez fontu
Neřešitelné písmo spadne k písmu base-14, které se nikdy nevkládá; nastavte proto explicitní soubor písma Unicode a testujte na stroji bez firemních písem

Co exportér garantuje a co ne

Přesnost je zde důležitější než sebejistota. Export vytváří identifikační aparát PDF/A — výstupní záměr, vložený ICC profil, metadata pdfaid, vhodnou hlavičku verze — a směruje text přes vkládací cestu. Nespouští úplný validátor nad vlastním výstupem, takže nevynucuje každý zákaz ve specifikaci, jako jsou pravidla o průhlednosti, o určitých typech anotací a o volitelném obsahu

U exportu sešitu se tyto konstrukce vyskytují jen zřídka, což vysvětluje vysokou praktickou úspěšnost. Ale vysoká není totéž co zaručená a pro skutečný archivační pipeline je správnou architekturou export a poté validace nezávislým nástrojem, přičemž selhání validace se zpracovává jako chyba pipeline, ne jako varování. Srovnatelné rozdělení odpovědnosti pro dokumenty PDF popisuje článek preflight validace PDF/A

Rozvržení je součástí archivační věrnosti

Archivovaný sešit, který je technicky vyhovující a přitom vizuálně nečitelný, selhal ve své skutečné úloze. Nastavení stránky nese v archivačním exportu větší váhu než v běžném tisku, protože ho už nikdo nikdy nedokáže přeformátovat

Tři nastavení se vyplatí. Přizpůsobení šířce zabraňuje klasickému selhání, kdy tabulka o 14 sloupcích dorazí jako sedm stránek po dvou sloupcích. Opakující se záhlavní řádky udrží každou stránku čitelnou i samostatně. A explicitní oblasti tisku vylučují pracovní poznámky, které leží mimo skutečná data. Celou sadu ovládacích prvků tisku a nastavení stránky popisuje článek ochrana, nastavení stránky a tisk

// Nastavení stránky připravené pro archiv, aplikované před exportem
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;                  // tolik stránek na výšku, kolik je potřeba
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

// Metadata patří do archivu také
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';

Kontrolní seznam před prvním dávkovým během

Potvrďte, že se soubor sám identifikuje: nic nerozbalujte, jen otevřete PDF v textovém editoru a vyhledejte položky části a shody pdfaid a výstupní záměr GTS_PDFA1. Potvrďte fonty: zkontrolujte, že každý font v dokumentu je hlášen jako vložený. Potvrďte vzhled: porovnejte exportované stránky s vytištěnou kopií, protože nastavení přizpůsobení stránce, které tiše zmenší text na čtyři body, je vyhovující a nepoužitelné

Pak spusťte nezávislý validátor nad reprezentativním vzorkem a uchovejte report. Archivy stále častěji žádají o důkaz validace, ne jen o soubor, a jeho vygenerování v čase exportu je mnohem levnější než jeho rekonstrukce o roky později. Pro běžnou, nearchivační cestu exportu a její možnosti vykreslování viz export listu do PDF

Archivační export, nastavení stránky a vykreslovací engine za nimi jsou dodávány v jedné knihovně pro Delphi a C++Builder; úplný seznam funkcí najdete na stránce komponenty HotXLS Delphi spreadsheet component

Diagram architektury export-pak-validuj pro výstup PDF/A HotXLS Delphi: exportér zapíše identifikační přístroj a nezávislý validátor směruje soubor do archivu nebo vyvolá chybu pipeline
Exportér staví identifikační apariát, zatímco nezávislý validátor dokazuje shodu, a nezdařená validace zastaví dávku místo zalogování varování