HotXLS esporta una cartella di lavoro o un singolo foglio direttamente in PDF/A da Delphi e C++Builder, senza Excel e senza un driver stampante PDF. Impostate UsePDFA e scegliete un profilo su TXLSPDFExport, e il file esportato porta un profilo ICC sRGB incorporato come output intent, il blocco di identificazione pdfaid nei suoi metadati XMP, e un'intestazione di versione PDF appropriata al livello di conformità
Il requisito arriva di solito da una policy di conservazione dei documenti piuttosto che da uno sviluppatore. Bilanci, risultati di laboratorio, dichiarazioni normative e qualsiasi cosa un ente pubblico debba conservare per decenni deve essere archiviata in un formato che si renderizzi in modo identico tra cinquant'anni, ed è proprio questo che il PDF/A, ISO 19005, esiste per garantire. Un foglio di calcolo è un calcolo vivo; una copia archiviata di un foglio di calcolo deve essere un'immagine fissa di esso
Cosa rende un PDF un PDF d'archivio?
Tre requisiti fanno la maggior parte del lavoro. Il file deve essere autonomo, quindi ogni font che usa è incorporato e non viene referenziata nessuna risorsa esterna. Il suo colore deve essere inequivocabile, il che significa un output intent che nomina lo spazio colore per cui il file è stato preparato. E deve identificarsi, tramite metadati XMP che dichiarano il numero di parte e il livello di conformità
HotXLS fornisce tutti e tre. Il profilo sRGB è incorporato come oggetto stream con tre componenti e DeviceRGB come alternativa, referenziato da un output intent GTS_PDFA1 la cui condizione e identificatore nominano entrambi sRGB IEC61966-2.1. Il pacchetto XMP porta le voci di parte e conformità pdfaid. I byte del profilo sono compilati direttamente nella libreria anziché caricati a runtime, quindi non c'è alcuna fase di deployment né alcuna possibilità che un file mancante trasformi un'esportazione d'archivio in una ordinaria
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 livello 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;
Quale profilo dovreste scegliere?
L'enumerazione dei profili copre PDF/A-1, PDF/A-2 e PDF/A-3, ciascuno in una variante accessibile e una variante base. Le differenze pratiche sono più ridotte di quanto l'elenco suggerisca
Il livello B, la variante base, garantisce che l'aspetto visivo sia riproducibile. Il livello A aggiunge requisiti strutturali e semantici, principalmente un albero di struttura taggato e un ordine di lettura definito, così il documento è accessibile alle tecnologie assistive. La parte 2 allenta alcune restrizioni della parte 1 e permette object stream e JPEG 2000; la parte 3 permette in aggiunta file incorporati arbitrari, che è ciò che i formati di fatturazione elettronica usano per portare XML leggibile da macchina accanto alla pagina leggibile da persone
Per un foglio di calcolo archiviato, PDF/A-2b è la scelta predefinita pragmatica: è ampiamente accettato dagli archivi, non richiede la disciplina di tagging che il livello A impone a una griglia di celle, e permette le strutture compatte che evitano che l'esportazione di una cartella di lavoro di 200 pagine si gonfi eccessivamente. Scegliete la parte 3 quando l'archivio deve portare anche i dati sorgente come allegato, cosa che l'esportatore supporta tramite AddAttachment
La regola sui font in cui inciampano quasi tutti
Ogni glifo che un file PDF/A disegna deve provenire da un font incorporato. Questo è il motivo singolo più comune per cui un'esportazione altrimenti corretta fallisce la validazione, e la modalità di fallimento è sottile: il file appare corretto sulla macchina che lo ha creato, perché quella macchina ha il font installato
HotXLS incorpora sottoinsiemi TrueType per i font che usa, ma il percorso di fallback base-14 esiste per i casi in cui un font non può essere risolto, e un fallback base-14 per definizione non è incorporato. Per l'output d'archivio, configurate un file di font Unicode esplicito così il percorso di fallback non viene mai imboccato. I meccanismi del subsetting e della catena di fallback sono descritti in subsetting dei font TrueType; la regola pratica è testare l'esportazione su una macchina priva dei vostri font aziendali
Cosa garantisce l'esportatore, e cosa non garantisce
Essere precisi qui conta più che sembrare sicuri. L'esportazione produce l'apparato di identificazione del PDF/A — output intent, profilo ICC incorporato, metadati pdfaid, un'intestazione di versione appropriata — e instrada il testo attraverso il percorso di incorporamento. Non esegue un validatore completo sul proprio output, quindi non impone ogni singola proibizione della specifica, come le regole sulla trasparenza, su certi tipi di annotazione e sui contenuti opzionali
In un'esportazione da foglio di calcolo quei costrutti compaiono raramente, il che spiega perché il tasso di successo pratico sia alto. Ma alto non è la stessa cosa di garantito, e per una vera pipeline d'archivio l'architettura corretta è esportare e poi validare con uno strumento indipendente, trattando un fallimento di validazione come un errore della pipeline anziché un avviso. Una suddivisione di responsabilità comparabile per i documenti PDF è descritta in validazione preflight PDF/A
Il layout fa parte della fedeltà d'archivio
Un foglio di calcolo archiviato che è tecnicamente conforme e visivamente illeggibile ha fallito il suo compito reale. L'impostazione di pagina ha un peso maggiore in un'esportazione d'archivio rispetto a una stampa quotidiana, perché nessuno sarà in grado di reimpaginarlo in seguito
Tre impostazioni si ripagano da sole. L'adattamento alla larghezza previene il classico fallimento in cui una tabella larga 14 colonne finisce distribuita su sette pagine di due colonne ciascuna. Le righe di intestazione ripetute mantengono ogni pagina leggibile in isolamento. E le aree di stampa esplicite escludono gli appunti di lavoro che vivono a destra dei dati reali. L'insieme completo dei controlli di stampa e impostazione di pagina è trattato in protezione, impostazione di pagina e stampa
// Impostazione di pagina pronta per l'archivio, applicata prima dell'esportazione
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0; // tante pagine in altezza quante necessarie
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';
// Anche i metadati fanno parte dell'archivio
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';
Una checklist prima di eseguire il primo batch
Confermate che il file si identifica: senza decomprimere nulla, aprite semplicemente il PDF in un editor di testo e cercate le voci di parte e conformità pdfaid e l'output intent GTS_PDFA1. Confermate i font: verificate che ogni font nel documento risulti incorporato. Confermate l'aspetto: confrontate le pagine esportate con una copia stampata, perché un'impostazione di adattamento alla pagina che riduce silenziosamente il testo a quattro punti è conforme e inutile
Poi eseguite un validatore indipendente su un campione rappresentativo e conservate il report. Gli archivi chiedono sempre più spesso la prova di validazione, non solo il file, e generarla al momento dell'esportazione è molto più economico che ricostruirla anni dopo. Per il percorso di esportazione quotidiano, non d'archivio, e le sue opzioni di rendering, vedere esportazione PDF del foglio di lavoro
L'esportazione d'archivio, l'impostazione di pagina e il motore di rendering dietro di esse sono forniti in un'unica libreria per Delphi e C++Builder; l'elenco completo delle funzionalità è disponibile sulla pagina del componente foglio di calcolo HotXLS Delphi