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
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
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