Technisch artikel

Excel-werkmappen exporteren naar PDF/A vanuit Delphi

HotXLS exporteert een werkmap of een enkel werkblad rechtstreeks naar PDF/A vanuit Delphi en C++Builder, zonder Excel en zonder een PDF-printerdriver. Stel UsePDFA in en kies een profiel op TXLSPDFExport, en het geëxporteerde bestand draagt een ingebed sRGB ICC-profiel als output intent, het pdfaid-identificatieblok in zijn XMP-metadata, en een PDF-versieheader die past bij het conformiteitsniveau

De vereiste komt meestal uit een beleid voor het bewaren van archieven, niet van een ontwikkelaar. Financiële overzichten, laboratoriumresultaten, wettelijke indieningen en alles wat een overheidsinstantie decennialang moet bewaren, moet worden opgeslagen in een formaat dat over vijftig jaar identiek weergeeft, en dat is precies waarvoor PDF/A, ISO 19005, bestaat. Een spreadsheet is een levende berekening; een gearchiveerde kopie van een spreadsheet moet een vaste afbeelding daarvan zijn

Wat maakt een PDF een archief-PDF?

Drie vereisten doen het meeste werk. Het bestand moet op zichzelf staan, dus elk lettertype dat het gebruikt is ingebed en er wordt geen externe resource aangehaald. De kleur moet ondubbelzinnig zijn, wat betekent dat een output intent de kleurruimte benoemt waarvoor het bestand is voorbereid. En het moet zichzelf identificeren, via XMP-metadata die het onderdeelnummer en het conformiteitsniveau declareert

HotXLS levert alle drie. Het sRGB-profiel wordt ingebed als een stream-object met drie componenten en DeviceRGB als alternatief, aangehaald vanuit een GTS_PDFA1-output intent waarvan zowel de voorwaarde als de identifier sRGB IEC61966-2.1 benoemen. Het XMP-pakket draagt de pdfaid-onderdeel- en conformiteitsvermeldingen. De profielbytes zijn in de library gecompileerd in plaats van tijdens runtime geladen, dus er is geen implementatiestap en geen kans dat een ontbrekend bestand een archiefexport in een gewone export verandert

Diagram van de drie PDF/A-archiveringsvereisten en de apparatuur die HotXLS vanuit Delphi schrijft: ingebedde FontFile2-subsets, een GTS_PDFA1 sRGB output intent en pdfaid XMP-identificatie
Een PDF/A-bestand moet zelfvoorzienend, kleurendubbelzinnig-loos en zelfidentificerend zijn, en HotXLS schrijft de bijpassende uitrusting vanuit het UsePDFA-eigenschappenpaar
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 niveau 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;

Welk profiel moet u kiezen?

De profielenumeratie omvat PDF/A-1, PDF/A-2 en PDF/A-3, elk in een toegankelijke variant en een basisvariant. De praktische verschillen zijn kleiner dan de lijst doet vermoeden

Niveau B, de basisvariant, garandeert dat de visuele verschijning reproduceerbaar is. Niveau A voegt structurele en semantische vereisten toe, voornamelijk een getagde structuurboom en een gedefinieerde leesvolgorde, zodat het document toegankelijk is voor ondersteunende technologie. Deel 2 versoepelt enkele beperkingen van deel 1 en staat object streams en JPEG 2000 toe; deel 3 staat bovendien willekeurige ingesloten bestanden toe, wat elektronische factureringsformaten gebruiken om machinaal leesbare XML naast de door mensen leesbare pagina mee te dragen

Voor een gearchiveerde spreadsheet is PDF/A-2b de pragmatische standaard: het wordt breed geaccepteerd door archieven, het vereist niet de tagging-discipline die niveau A oplegt aan een raster van cellen, en het staat de compacte structuren toe die voorkomen dat een export van een werkmap van 200 pagina's opgeblazen raakt. Kies deel 3 wanneer het archief ook de brondata als bijlage moet meedragen, wat de exporter ondersteunt via AddAttachment

De lettertyperegel waar de meeste mensen op stuiten

Elke glyph die een PDF/A-bestand tekent, moet uit een ingebed lettertype komen. Dit is de meest voorkomende reden waarom een verder correcte export niet door validatie komt, en het faalpatroon is subtiel: het bestand ziet er goed uit op de machine die het maakte, omdat op die machine het lettertype is geïnstalleerd

HotXLS bedt TrueType-subsets in voor de lettertypen die het gebruikt, maar het base-14-fallbackpad bestaat voor gevallen waarin een lettertype niet kan worden opgelost, en een base-14-fallback is per definitie niet ingebed. Configureer voor archiefoutput een expliciet Unicode-lettertypebestand zodat het fallbackpad nooit wordt genomen. De mechaniek van subsetting en van de fallbackketen wordt beschreven in TrueType-lettertypesubsetting; de praktische regel is om de export te testen op een machine waarop uw huisstijl-lettertypen niet zijn geïnstalleerd

Diagram van de PDF/A-fontregel in HotXLS Delphi-exports: geresolvde fonts worden ingebedde TrueType-subsets die overal valideren, terwijl de base-14-terugval nooit wordt ingebed en faalt op machines zonder het font
Een onoplosbaar lettertype valt terug op een base-14-font dat nooit wordt ingesloten, dus configureer een expliciet Unicode-fontbestand en test op een machine zonder je bedrijfslettertypen

Wat de exporter garandeert, en wat niet

Hier precies zijn is belangrijker dan zelfverzekerd klinken. De export produceert het identificatie-apparaat van PDF/A — output intent, ingebed ICC-profiel, pdfaid-metadata, een passende versieheader — en leidt tekst via het inbeddingspad. Het draait geen volledige validator over zijn eigen output, dus het handhaaft niet elk verbod in de specificatie, zoals de regels rond transparantie, bepaalde annotatietypen en optionele inhoud

Voor een spreadsheet-export komen die constructies zelden voor, wat verklaart waarom het praktische slagingspercentage hoog is. Maar hoog is niet hetzelfde als gegarandeerd, en voor een echte archiefpijplijn is de correcte architectuur om te exporteren en vervolgens met een onafhankelijke tool te valideren, waarbij een validatiefout als een pijplijnfout wordt behandeld en niet als een waarschuwing. Een vergelijkbare taakverdeling voor PDF-documenten wordt beschreven in PDF/A-preflightvalidatie

Lay-out is onderdeel van archiefgetrouwheid

Een gearchiveerde spreadsheet die technisch conform is en visueel onleesbaar, heeft zijn eigenlijke taak niet gehaald. Paginainstellingen wegen zwaarder in een archiefexport dan in een alledaagse afdruk, omdat niemand het later opnieuw kan laten reflowen

Drie instellingen betalen zichzelf terug. Passend op breedte voorkomt de klassieke fout waarbij een tabel van 14 kolommen breed als zeven pagina's van elk twee kolommen aankomt. Herhalende koprijen houden elke pagina afzonderlijk leesbaar. En expliciete afdrukgebieden sluiten de werknotities uit die rechts van de echte data staan. De volledige set afdruk- en pagina-instellingen wordt behandeld in beveiliging, pagina-instellingen en afdrukken

// Archiefklare pagina-instellingen, toegepast vóór de export
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;                  // zoveel pagina's hoog als nodig
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

// Metadata hoort ook in het archief thuis
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';

Een checklist voordat de eerste batch draait

Bevestig dat het bestand zichzelf identificeert: pak niets uit, open gewoon de PDF in een teksteditor en zoek naar de pdfaid-onderdeel- en conformiteitsvermeldingen en de GTS_PDFA1-output intent. Bevestig de lettertypen: controleer dat elk lettertype in het document als ingebed wordt gerapporteerd. Bevestig de verschijning: vergelijk de geëxporteerde pagina's met een afgedrukte kopie, want een fit-to-page-instelling die tekst stilzwijgend krimpt tot vier punten is conform en nutteloos

Voer daarna een onafhankelijke validator uit over een representatieve steekproef en bewaar het rapport. Archieven vragen steeds vaker om het validatiebewijs, niet alleen het bestand, en het genereren daarvan op exportmoment is veel goedkoper dan het jaren later reconstrueren. Voor het alledaagse, niet-archiefexportpad en de renderopties ervan, zie PDF-export van werkbladen

Archiefexport, pagina-instellingen en de rendering-engine erachter zitten in één library voor Delphi en C++Builder; de volledige functielijst staat op de HotXLS Delphi spreadsheetcomponent-pagina

Diagram van de exporteer-dan-valideer-architectuur voor HotXLS Delphi PDF/A-uitvoer: de exporteur schrijft de identificatieapparatuur en een onafhankelijke validator stuurt het bestand naar het archief of werpt een pijplijnfout op
De exporter bouwt de identificatie-uitrusting terwijl een onafhankelijke validator conformiteit bewijst, en een mislukte validatie stopt de batch in plaats van een waarschuwing te loggen