Artigo Técnico

Exportar Livros do Excel para PDF/A a partir do Delphi

O HotXLS exporta um livro ou uma única folha de cálculo diretamente para PDF/A a partir de Delphi e C++Builder, sem Excel e sem um driver de impressora PDF. Defina UsePDFA e escolha um perfil em TXLSPDFExport, e o ficheiro exportado passa a ter um perfil ICC sRGB incorporado como output intent, o bloco de identificação pdfaid nos seus metadados XMP, e um cabeçalho de versão de PDF adequado ao nível de conformidade

O requisito costuma chegar de uma política de retenção de registos, e não de um programador. Demonstrações financeiras, resultados laboratoriais, submissões regulatórias e tudo o que um organismo público tenha de conservar durante décadas tem de ser armazenado num formato que se apresente de forma idêntica daqui a cinquenta anos, e é isso que o PDF/A, a norma ISO 19005, existe para garantir. Uma folha de cálculo é um cálculo vivo; uma cópia arquivada de uma folha de cálculo tem de ser uma imagem fixa desse cálculo

O que torna um PDF um PDF de arquivo?

Três requisitos fazem a maior parte do trabalho. O ficheiro tem de ser autónomo, pelo que todas as fontes que utiliza estão incorporadas e nenhum recurso externo é referenciado. A sua cor tem de ser inequívoca, o que significa um output intent que identifique o espaço de cor para o qual o ficheiro foi preparado. E tem de se identificar a si próprio, através de metadados XMP que declaram o número da parte e o nível de conformidade

O HotXLS fornece os três. O perfil sRGB é incorporado como um objeto de stream com três componentes e DeviceRGB como alternativa, referenciado a partir de um output intent GTS_PDFA1 cuja condição e identificador designam ambos sRGB IEC61966-2.1. O pacote XMP traz as entradas de parte e de conformidade do pdfaid. Os bytes do perfil são compilados na própria biblioteca em vez de serem carregados em tempo de execução, pelo que não existe qualquer passo de implementação nem a possibilidade de um ficheiro em falta transformar uma exportação de arquivo numa exportação comum

Diagrama dos três requisitos de arquivação PDF/A e do aparato que o HotXLS escreve de Delphi: subconjuntos FontFile2 incorporados, um output intent GTS_PDFA1 sRGB e a identificação pdfaid em XMP
Um ficheiro PDF/A tem de ser autossuficiente, inequívoco em cores e auto-identificativo, e o HotXLS escreve o aparato correspondente a partir do par de propriedades 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 nível 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;

Que perfil deve escolher?

A enumeração de perfis abrange PDF/A-1, PDF/A-2 e PDF/A-3, cada um numa variante acessível e numa variante básica. As diferenças práticas são mais estreitas do que a lista sugere

O nível B, a variante básica, garante que a aparência visual é reprodutível. O nível A acrescenta requisitos estruturais e semânticos, sobretudo uma árvore de estrutura marcada (tagged) e uma ordem de leitura definida, para que o documento seja acessível a tecnologias de apoio. A parte 2 relaxa algumas restrições da parte 1 e permite object streams e JPEG 2000; a parte 3 permite adicionalmente ficheiros incorporados arbitrários, que é o que os formatos de faturação eletrónica usam para transportar XML legível por máquina juntamente com a página legível por humanos

Para uma folha de cálculo arquivada, o PDF/A-2b é a predefinição pragmática: é amplamente aceite pelos arquivos, não exige a disciplina de marcação que o nível A impõe a uma grelha de células, e permite as estruturas compactas que evitam que a exportação de um livro de 200 páginas fique inchada. Escolha a parte 3 quando o arquivo também tiver de transportar os dados de origem como anexo, o que o exportador suporta através de AddAttachment

A regra das fontes que apanha a maioria das pessoas

Todos os glifos que um ficheiro PDF/A desenha têm de vir de uma fonte incorporada. Esta é, isoladamente, a razão mais comum para uma exportação de resto correta falhar na validação, e o modo de falha é subtil: o ficheiro parece correto na máquina que o gerou, porque essa máquina tem a fonte instalada

O HotXLS incorpora subconjuntos TrueType para as fontes que utiliza, mas o percurso de reserva (fallback) para as 14 fontes base existe para os casos em que uma fonte não pode ser resolvida, e uma fonte de reserva das 14 base não é incorporada, por definição. Para a saída de arquivo, configure um ficheiro de fonte Unicode explícito, para que o percurso de reserva nunca seja utilizado. A mecânica da subconjuntação e da cadeia de reserva está descrita em subconjuntação de fontes TrueType; a regra prática é testar a exportação numa máquina que não tenha as suas fontes corporativas instaladas

Diagrama da regra de tipos de letra do PDF/A nas exportações HotXLS em Delphi: os tipos de letra resolvidos tornam-se subconjuntos TrueType incorporados que validam em qualquer lado, enquanto o fallback base-14 nunca é incorporado e falha em máquinas sem o tipo de letra
Um tipo de letra não resolvível recua para um tipo de letra base-14 que nunca é incorporado, por isso configure um ficheiro de tipo de letra Unicode explícito e teste numa máquina sem os seus tipos de letra corporativos

O que o exportador garante, e o que não garante

Ser preciso aqui importa mais do que soar confiante. A exportação produz o aparato de identificação do PDF/A — output intent, perfil ICC incorporado, metadados pdfaid, um cabeçalho de versão adequado — e encaminha o texto através do percurso de incorporação. Não executa um validador completo sobre a sua própria saída, pelo que não impõe todas as proibições da especificação, como as regras sobre transparência, sobre certos tipos de anotação e sobre conteúdo opcional

Numa exportação de folha de cálculo essas construções raramente aparecem, razão pela qual a taxa de sucesso prática é elevada. Mas elevada não é o mesmo que garantida, e para um pipeline de arquivo genuíno a arquitetura correta é exportar e depois validar com uma ferramenta independente, tratando uma falha de validação como um erro do pipeline, e não como um aviso. Uma divisão de responsabilidades comparável para documentos PDF está descrita em validação preflight de PDF/A

O layout faz parte da fidelidade de arquivo

Uma folha de cálculo arquivada que seja tecnicamente conforme e visualmente ilegível falhou na sua verdadeira função. A configuração de página tem mais peso numa exportação de arquivo do que numa impressão do dia a dia, porque ninguém poderá voltar a reformatá-la mais tarde

Três definições compensam-se por si próprias. O ajuste à largura (fit-to-width) evita a falha clássica em que uma tabela com 14 colunas de largura chega como sete páginas de duas colunas cada. As linhas de cabeçalho repetidas mantêm cada página legível isoladamente. E as áreas de impressão explícitas excluem as notas de trabalho que ficam à direita dos dados reais. O conjunto completo de controlos de impressão e configuração de página está descrito em proteção, configuração de página e impressão

// Configuração de página pronta para arquivo, aplicada antes da exportação
Sheet := Book.Sheets[0];
Sheet.PageLandscape := True;
Sheet.FitToWidth := 1;
Sheet.FitToHeight := 0;                  // tantas páginas de altura quantas forem necessárias
Sheet.SetPrintArea('A1:N480');
Sheet.PrintTitleRows := '$1:$3';

// Os metadados também pertencem ao arquivo
Book.Title := 'Quarterly results 2026 Q2';
Book.Author := 'Finance';

Uma lista de verificação antes de correr o primeiro lote

Confirme que o ficheiro se identifica: não é preciso descompactar nada, basta abrir o PDF num editor de texto e procurar as entradas de parte e de conformidade do pdfaid e o output intent GTS_PDFA1. Confirme as fontes: verifique se todas as fontes do documento aparecem como incorporadas. Confirme o aspeto: compare as páginas exportadas com uma cópia impressa, porque uma definição de ajuste à página que reduz silenciosamente o texto para quatro pontos é conforme e inútil

Depois, execute um validador independente sobre uma amostra representativa e guarde o relatório. Os arquivos pedem cada vez mais a evidência de validação, e não apenas o ficheiro, e gerá-la no momento da exportação é muito mais barato do que reconstruí-la anos depois. Para o percurso de exportação comum, não de arquivo, e as suas opções de renderização, veja exportação de folhas de cálculo para PDF

A exportação de arquivo, a configuração de página e o motor de renderização por trás delas fazem parte da mesma biblioteca para Delphi e C++Builder; a lista completa de funcionalidades está disponível na página do componente de folha de cálculo HotXLS para Delphi

Diagrama da arquitetura exportar-depois-validar para o output PDF/A do HotXLS em Delphi: o exportador escreve o aparato de identificação e um validador independente encaminha o ficheiro para o repositório ou gera um erro de pipeline
O exportador constrói o aparato de identificação, enquanto um validador independente prova a conformidade, e uma validação falhada pára o lote em vez de registar um aviso