Articolo tecnico

Esportare cartelle di lavoro Excel in PDF/A da Delphi

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

Diagramma dei tre requisiti di archiviazione PDF/A e dell'apparato che HotXLS scrive da Delphi: subset FontFile2 incorporati, un output intent GTS_PDFA1 sRGB e l'identificazione XMP pdfaid
Un file PDF/A deve essere autocontenuto, inequivocabile nei colori e auto-identificante, e HotXLS scrive l'apparato corrispondente dalla coppia di proprietà 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 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

Diagramma della regola dei font PDF/A negli export HotXLS Delphi: i font risolti diventano subset TrueType incorporati che validano ovunque, mentre il fallback base-14 non viene mai incorporato e fallisce sulle macchine senza il font
Un font non risolvibile ricade su un font base-14 che non viene mai incorporato, quindi configurare un file font Unicode esplicito e testare su una macchina priva dei 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

Diagramma dell'architettura esporta-poi-valida per l'output PDF/A HotXLS Delphi: l'exporter scrive l'apparato di identificazione e un validatore indipendente instrada il file all'archivio o solleva un errore di pipeline
L'exporter costruisce l'apparato di identificazione mentre un validatore indipendente prova la conformità, e una validazione fallita ferma il batch invece di registrare un avviso