Technical Article

Bibliotecas PDF losLab para Delphi: HotPDF, PDFium VCL, e PDFlibPas Comparadas

Três bibliotecas. Três tarefas distintas. Escolher a errada custar-lhe-á semanas de contornos técnicos e soluções provisórias; escolher as três quando apenas precisa de uma trará custos de manutenção que não previu no seu orçamento. Apresentamos aqui uma descrição direta do que cada biblioteca de PDF da losLab realmente faz, onde se enquadra e onde delega as tarefas para as restantes.

HotPDF: escrever PDFs de raiz em Delphi

O HotPDF é um componente VCL nativo para gerar documentos PDF. O seu modelo é imperativo e centrado na página: o programador instancia um THotPDF, define as propriedades do documento, chama BeginDoc, desenha na CurrentPage, adiciona páginas conforme necessário e encerra com EndDoc. A ordem é importante porque o BeginDoc consolida o dicionário de encriptação e as definições de compressão no momento em que é executado; qualquer atribuição efetuada após esse ponto é ignorada silenciosamente em vez de ser aplicada retroativamente.

A superfície de desenho cobre todo o conjunto de operadores de PDF ao nível do Delphi: TextOut para texto Unicode posicionado, SetFont com incorporação TrueType, primitivas vetoriais (linhas, curvas de Bezier, elipses, retângulos), colocação de imagens a partir de ficheiro ou memória e geração de códigos de barras. As coordenadas são expressas em pontos a partir do canto inferior esquerdo com o eixo Y a crescer para cima, o que costuma confundir inicialmente os programadores. O estado do tipo de letra (font) não sobrevive a AddPage, pelo que é obrigatório chamar SetFont após cada quebra de página.

Os campos AcroForm são tratados como elementos de primeira classe. Pode adicionar campos de texto, caixas de verificação, botões de opção, caixas de combinação, caixas de listagem e botões de comando diretamente a um objeto de página com uma única chamada para cada um. O HotPDF também pode carregar um PDF existente através de LoadFromFile e preencher ou ler valores de campos, tornando-o útil em dois fluxos de trabalho distintos: construção de formulários e automatização do seu preenchimento.

A encriptação também é gerida ao nível do documento. O CryptKeyLength seleciona o esquema (desde RC4 de 40 bits até AES-256), o ActivateProtection ativa-o e o ProtectOptions define as flags de permissão ISO. Os dois modos de revisão AES-256 (R5 e R6, controlados por UseAES256R6) existem porque a revisão 6 corrige uma vulnerabilidade conhecida na revisão 5, mas requer um visualizador compatível com PDF 2.0; escolher entre eles é uma decisão de compatibilidade, e não de conveniência.

O suporte para assinatura digital no HotPDF abrange os perfis de referência PAdES, pelo que é adequado para fluxos de trabalho em que a assinatura deve cumprir os requisitos da norma ETSI EN 319 142. Se a sua necessidade for apenas gerar outputs, o HotPDF é a primeira biblioteca a escolher.

PDFium VCL: renderizar, visualizar e ler PDFs existentes

O PDFium VCL encapsula o motor PDFium da Google como um componente VCL, o que lhe confere um papel fundamentalmente diferente do HotPDF. Onde o HotPDF escreve, o PDFium VCL lê e renderiza. O objeto central é o TPdf, um gestor de documentos que abre um ficheiro definindo FileName e, em seguida, Active := True. As falhas de carregamento não são geradas como exceções; o Active permanece simplesmente como False, pelo que a sua verificação após a atribuição é obrigatória.

A renderização é processada através do TPdfView, um componente visual que coloca num formulário e liga a uma instância de TPdf via PdfView.Pdf := Pdf. O zoom e o modo de ajuste residem na visualização, não no documento. Uma subtileza que costuma confundir os utilizadores: Pdf.PageNumber e PdfView.PageNumber são propriedades independentes. Definir uma não atualiza a outra, e as APIs de extração baseadas na visualização (caixas de palavras, unidades de leitura) utilizam a página atual da visualização, e não a do documento.

A extração de texto é a área onde o PDFium VCL não tem concorrência direta no catálogo da losLab. O ReadablePageContent devolve texto estruturado com deteção da ordem de leitura, o PageWordBoxes fornece retângulos delimitadores ao nível da palavra e o DocumentReadingUnits percorre o documento inteiro. Para trabalho de acessibilidade, o IsTagged indica se existe uma árvore de estrutura e o ValidatePdfUa executa uma verificação de conformidade com PDF/UA. Estas APIs tornam o PDFium VCL a escolha óbvia para qualquer fluxo de trabalho que necessite de compreender o conteúdo de um PDF existente, em vez de produzir um novo.

O preenchimento de formulários também funciona no PDFium, através da mesma camada AcroForm que o motor subjacente expõe. É apropriado quando o documento de origem já existe e o utilizador está a automatizar a sua conclusão, em vez de construir os campos de formulário de raiz.

PDFlibPas: manipulação, assinatura de conformidade e acesso direto a ficheiros

O PDFlibPas (versão 3.73.0) situa-se no outro extremo do espetro de complexidade. Expõe três camadas de API sobre o mesmo modelo de documento: uma fachada plana baseada em handles (TPDFlib) compatível com a convenção de chamada do Quick-PDF, uma camada completa de árvore de objetos (TPDFDocument) e um parser de streaming (TSmartPDFReader / TSmartPDFWriter) que opera diretamente nos bytes do ficheiro sem carregar o gráfico completo de objetos.

A camada de streaming é o que torna o PDFlibPas a escolha correta para documentos de grandes dimensões. O TSmartPDFWriter pode anexar uma atualização incremental a um ficheiro no disco sem reconstruir toda a tabela de referências cruzadas, que é o mecanismo que serve de base tanto para a gravação eficiente como para carimbos de validação de longo prazo PAdES. Para fluxos de trabalho de assinatura de nível de conformidade, em que o hash assinado deve cobrir um intervalo específico de bytes e a assinatura é aplicada sem reescrever o documento, esta camada é a única via viável.

A manipulação de documentos ao nível do TPDFDocument inclui a junção com Merge, a cópia seletiva de páginas via CopyPagesFromDoc com uma string de intervalo e a gestão de versões através de SetMinimumVersion e LockSaveVersion. O bloqueio de versão gera o erro 602 se tentar guardar uma funcionalidade que empurre o output para lá da versão bloqueada, o que é útil quando necessita de garantir que o output permanece dentro de uma revisão de PDF específica para conformidade de arquivo.

O suporte para PDF/A (ISO 19005) reside no painel de conformidade do PDFlibPas. Note que a encriptação e o PDF/A são mutuamente exclusivos por especificação: não pode ter ambos no mesmo ficheiro. Os fluxos de trabalho que necessitam de uma cópia de distribuição encriptada e de uma cópia de arquivo PDF/A devem produzir dois artefactos distintos.

Escolher entre as bibliotecas

A árvore de decisão típica é curta. Se está a gerar um novo documento a partir de dados, utilize o HotPDF. Se está a renderizar ou a extrair texto de um documento existente numa aplicação Delphi VCL, utilize o PDFium VCL. Se está a manipular, juntar ou a assinar com nível de conformidade PDFs existentes à escala ou com semântica de gravação incremental, utilize o PDFlibPas. Muitos sistemas de produção utilizam duas das três: por exemplo, o HotPDF para gerar o output e o PDFlibPas para lhe aplicar um carimbo de validação de longo prazo antes do arquivo, ou o PDFium VCL para pré-visualizar o que o HotPDF produziu antes de o enviar para o fluxo seguinte.

As três são distribuídas como código-fonte Pascal nativo para Delphi e C++Builder, sem dependências de execução além da VCL. O PDFium VCL inclui adicionalmente a DLL do PDFium, que processa o trabalho de renderização e análise (parsing) do motor. A página de produto de cada biblioteca contém a sua referência de API completa e o histórico de versões atual.

Detalhes sobre as bibliotecas individuais: Componente HotPDF, Componente PDFium VCL e PDFlibPas.