Geração de PDFs com Delphi para VCL, FMX, WEB Core e Lazarus

Gerar PDFs diretamente pela aplicação é útil para criar relatórios, comprovantes, contratos e outros documentos.

Neste artigo, vamos usar o TMS FNC PDF para gerar documentos PDF em aplicações Delphi VCL, FMX, WEB Core e Lazarus, inclusive em projetos FMX executados no Android.

Vamos a um exemplo prático de como utilizar:

Uses necessárias

A unit necessária depende do framework utilizado:

uses
  System.SysUtils,
  System.Types,
  
  // USE PARA VCL
  VCL.TMSFNCPDFLib;
  
  // USE PARA FireMonkey
  FMX.TMSFNCPDFLib;
  
  // USE PARA TMS WEB Core
  WEBLib.TMSFNCPDFLib;
  
  // USE PARA Lazarus/LCL
  LCLTMSFNCPDFLib;

A unit System.Types disponibiliza TRectF, PointF e RectF, utilizados para definir posições e áreas dentro da página.

A classe principal permanece a mesma em todos os frameworks:

TTMSFNCPDFLib

Criando um PDF com texto e imagem

No exemplo abaixo, o evento de um botão cria um PDF contendo cabeçalho, texto, imagem e rodapé:

procedure TForm1.btnGeneratePDFClick(Sender: TObject);
var
  LPDF: TTMSFNCPDFLib;
  LHeaderRect: TRectF;
begin
  LPDF := TTMSFNCPDFLib.Create;
  try
    LPDF.BeginDocument('PDF criado pelo Delphi.pdf');
    LPDF.Header := 'Criando PDF com Delphi';
    LPDF.Footer := 'Página 1/1';
    LPDF.NewPage;

    LHeaderRect := LPDF.GetHeaderRect;
    LPDF.Graphics.DrawText('Corpo do PDF', PointF(LHeaderRect.Left, LHeaderRect.Bottom + 20));

    LPDF.Graphics.DrawImageFromFile('C:\Temp\c4d_logo.png',
      RectF(LHeaderRect.Left, LHeaderRect.Bottom + 40, 
      LHeaderRect.Left + 200, LHeaderRect.Bottom + 120)
    );

    LPDF.EndDocument(True);
  finally
    LPDF.Free;
  end;
end;

Entendendo o código

Para facilitar o entendimento, vou apresentar novamente o código-fonte, desta vez com comentários explicando cada etapa da geração do PDF:

procedure TForm1.btnGeneratePDFClick(Sender: TObject);
var
  LPDF: TTMSFNCPDFLib;
  LHeaderRect: TRectF;
begin
  // Cria a biblioteca responsável pela geração do PDF
  LPDF := TTMSFNCPDFLib.Create;
  try
    // Inicia o documento e define o nome ou caminho do arquivo gerado
    LPDF.BeginDocument('PDF criado pelo Delphi.pdf');

    // Configura o cabeçalho e o rodapé
    LPDF.Header := 'Criando PDF com Delphi';
    LPDF.Footer := 'Página 1/1';

    // Adiciona uma página ao documento
    LPDF.NewPage;

    // Obtém a área do cabeçalho para posicionar o conteúdo abaixo dele
    LHeaderRect:= LPDF.GetHeaderRect;

    // Desenha o texto 20 unidades abaixo do cabeçalho
    LPDF.Graphics.DrawText('Corpo do PDF', PointF(LHeaderRect.Left, LHeaderRect.Bottom + 20));

    // Carrega a imagem e a desenha em uma área de 200 × 80 unidades
    LPDF.Graphics.DrawImageFromFile('C:\Temp\c4d_logo.png',
      RectF(LHeaderRect.Left, LHeaderRect.Bottom + 40,
      LHeaderRect.Left + 200, LHeaderRect.Bottom + 120)
    );

    // Finaliza, salva e abre o PDF no leitor padrão do sistema
    LPDF.EndDocument(True);
  finally
    // Libera a biblioteca mesmo se ocorrer alguma exceção
    LPDF.Free;
  end;
end;

Iniciando o documento

O método BeginDocument inicia o processo de geração e recebe o nome ou o caminho do arquivo:

LPDF.BeginDocument('PDF criado pelo Delphi.pdf');

Como foi informado somente o nome, o PDF será salvo no diretório de trabalho da aplicação, para alterar o caminho de salvamento do PDF basta adicionar o caminho antes do nome do arquivo.

Toda chamada a BeginDocument deve ser acompanhada por uma chamada a EndDocument. Também é necessário adicionar ao menos uma página com NewPage antes de desenhar conteúdo no documento.

Configurando o cabeçalho e o rodapé

As propriedades Header e Footer definem os textos exibidos no cabeçalho e no rodapé:

LPDF.Header := 'Criando PDF com Delphi';
LPDF.Footer := 'Page 1/1';
LPDF.NewPage;

A biblioteca também permite personalizar tamanho, margens, alinhamento e fonte dessas áreas.
Os métodos GetHeaderRect e GetFooterRect retornam os retângulos ocupados pelo cabeçalho e pelo rodapé. No exemplo, utilizamos o retângulo do cabeçalho como referência para posicionar o conteúdo da página:

LPageRect := LPDF.GetHeaderRect;

Assim, o texto e a imagem são desenhados abaixo do cabeçalho.

Adicionando texto ao PDF

O conteúdo é desenhado por meio da propriedade Graphics. Para adicionar um texto, usamos o método DrawText:

LPDF.Graphics.DrawText('Corpo do PDF', PointF(LHeaderRect.Left, LHeaderRect.Bottom + 20));

O método PointF define a posição inicial do texto:
LPageRect.Left mantém o alinhamento com a margem esquerda do cabeçalho;
LPageRect.Bottom + 20 posiciona o conteúdo 20 unidades abaixo do cabeçalho.
Além de texto simples, a biblioteca oferece suporte a textos formatados, Unicode, fontes incorporadas e conteúdo HTML.

Adicionando uma imagem

Para carregar uma imagem diretamente de um arquivo, usamos o método DrawImageFromFile:

LPDF.Graphics.DrawImageFromFile(
  'C:\Temp\c4d_logo.png',
  RectF(
    LPageRect.Left,
    LPageRect.Bottom + 40,
    LPageRect.Left + 200,
    LPageRect.Bottom + 120
  )
);

O RectF define os limites utilizados para desenhar a imagem:

RectF(
  Esquerda,
  Superior,
  Direita,
  Inferior
)

No exemplo, a imagem começa 40 unidades abaixo do cabeçalho e ocupa uma área com 200 unidades de largura e 80 unidades de altura.

A biblioteca também permite desenhar imagens carregadas em memória ou armazenadas em um BitmapContainer. Essas opções estão descritas na seção de imagens da documentação oficial.

Finalizando o documento

Após adicionar todo o conteúdo, o PDF é concluído com:

LPDF.EndDocument(True);

O parâmetro True solicita que o arquivo seja aberto no leitor de PDF padrão após sua geração.
A abertura automática acontece quando o arquivo foi criado corretamente e BeginDocument recebeu um nome de arquivo válido.

Conclusão

Com poucas linhas de código, podemos criar um arquivo PDF contendo cabeçalho, rodapé, textos e imagens.
A propriedade Graphics concentra os recursos utilizados para desenhar o conteúdo, enquanto BeginDocument, NewPage e EndDocument controlam o ciclo de criação do arquivo.
A compatibilidade entre diferentes frameworks torna possível reaproveitar grande parte da implementação em projetos VCL, FireMonkey, WEB Core e Lazarus.

🏷️ Cupom de desconto

Use nosso cupom exclusivo e tenha 30% de desconto nos produtos da TMS Software: 2026Code4Delphi30

Links úteis