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:
TTMSFNCPDFLibCriando 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


