Gerando arquivos PDF com PHP 
Escrito por Fabio Centenaro • Feb 1st, 2008 • Categoria: PHP, Programação
Introdução
Os arquivos PDF se transformaram ao longo do tempo em um padrão para troca de documentos. Desde relatórios até contratos, este formato tem sido usado em larga escala devido a sua portabilidade - é possível abrir arquivos deste tipo em qualquer sistema operacional - além de, geralmente, ser um arquivo pequeno. Isso sem falar que um arquivo PDF não pode ser modificado, garantindo, desta forma, que o arquivo irá sempre manter o mesmo conteúdo. Eu arriscaria dizer, ainda, que passa uma aparência mais profissional enviar um arquivo em formato PDF, ao invés de outros formatos, como DOC, por exemplo.
Neste artigo iremos conhecer os fundamentos da criação de um arquivo PDF utilizando a linguagem PHP. Para tal, será usada a biblioteca FPDF, responsável pela criação do arquivo. O download pode ser feito aqui.
Conhecendo as principais funções
Abaixo estão relacionadas as principais funções que serão utilizadas para a criação do arquivo, com a respectiva descrição.
SetFont - Define a fonte que será usada para imprimir o texto. É obrigatório setar ao menos uma vez a fonte que será utilizada no documento.
SetTitle - Define o título do documento.
SetSubject - Define o assunto do documento.
SetX - Define a abscissa da posição corrente. A grosso modo podemos dizer que informa a posição a partir da margem esquerda do documento.
SetY - Explicando de uma forma simples, indica a linha (posição vertical).
Cell - Imprime uma célula (área retangular) com bordas opcionais, cor de fundo e texto. O canto superior-esquerdo da célula corresponde à posição atual. O texto pode ser alinhado ou centralizado. Depois de chamada, a posição atual se move para a direita ou para a linha seguinte. É possível pôr um link no texto. Se a quebra de página automática está habilitada e a pilha for além do limite, uma quebra de página é feita antes da impressão.
Ln - Faz uma quebra de linha. A abscissa corrente volta para a margem esquerda e a ordenada é somada ao valor passado como parâmetro.
MultiCell - Este método permite imprimir um texto com quebras de linha. Podem ser automática (assim que o texto alcança a margem direita da célula) ou explícita (através do caracter n). Serão geradas tantas células quantas forem necessárias, uma abaixo da outra.
Image - Permite inserir uma imagem no documento. Os tipos permitidos são JPG e PNG.
AddPage - Acrescenta uma página ao documento.
PageNo - Informa a página atual.
AliasNbPages - Define um apelido para a impressão do número total de páginas.
Header e Footer - Estes métodos inserem automaticamente o cabeçalho e rodapé das páginas do documento. Porém, para utilizá-las, é necessário criar uma subclasse para sobrepor os métodos originais.
Output - Envia o documento para o destino informado. Pode-se abrir o arquivo no navegador, fazer o download ou mesmo salvar o arquivo no disco.
OBSERVAÇÃO:
Sempre que for necessário setar a posição X e Y, sete primeiro o Y e depois o X.
Criando nosso primeiro documento
Agora vamos ver como criar um arquivo simples, contendo algum texto e uma imagem.
<?
require_once(”fpdf/fpdf.php”);
$texto = “Os arquivos PDF se transformaram ao longo do tempo em um padrão para troca de documentos. Desde relatórios até contratos, este formato
tem sido usado em larga escala devido a sua portabilidade - é possível abrir arquivos deste tipo em qualquer sistema operacional - além de, geralmente, ser um arquivo pequeno.
Isso sem falar que um arquivo PDF não pode ser modificado, garantindo, desta forma, que o arquivo irá sempre manter o mesmo conteúdo. Eu arriscaria dizer, ainda, que passa uma
aparência mais profissional enviar um arquivo em formato PDF, ao invés de outros formatos, como DOC, por exemplo.”;//defininfo a fonte !
define(’FPDF_FONTPATH’,'fpdf/font/’);//instancia a classe
//uso: FPDF(orientacao - retrato ou paisagem), unidade de medida, tamanho do papel)
$pdf = new FPDF(”P”,”mm”,”A4″);//define a fonte a ser usada
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)
$pdf->SetFont(’arial’,”,10);//define o titulo
$pdf->SetTitle(”Criando nosso primeiro arquivo PDF !”);// seta a posicao vertical e horizontal
$pdf->SetY(”-1″);//assunto
$pdf->SetSubject(”Criação de arquivos PDF com PHP!”);//escreve o texto
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)
$pdf->Cell(0,5,”Criando arquivos PDF com PHP”,0,0,’L');
$pdf->Cell(0,5,’http://fdweb.com.br’,0,1,’R');
$pdf->Cell(0,0,”,1,1,’L');
$pdf->Ln(8);//Seta a fonte do texto do documento
$pdf->SetFont(’arial’,”,8);// insere a imagem
//uso: Image(caminho, posicao X,posicao Y,altura, largura)
//$pdf->Image(”http://fdweb.com.br/downloads/logo.jpg”, $pdf->GetX(), $pdf->GetY(), 20, 20);
$pdf->Image(”logo.jpg”,10,30);//posiciona horizontalmente
$pdf->SetY(”30″);
$pdf->SetX(”50″);//Insere o texto do documento
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)
$pdf->MultiCell(0,5,$texto,0,”L”,0);$pdf->Output(”arquivo pdf”,”I”);
?>
Este exemplo mostra como criar um arquivo simples, com texto e uma imagem.
Implementando cabeçalho e rodapé
Para que todas as páginas possuam cabeçalho e rodapé padrão, temos que estender a classe FPDF e sobrepor os métodos Header e Footer. Note que a partir desse momento, ao invés de chamarmos a classe FPDF para gerarmos os documentos iremos passar a chamar a nossa classe estendida. Observe:
<?
require_once(”fpdf/fpdf.php”);
class PDF extends FPDF
{// sobrepõe o método header
function Header()
{
//escreve o texto
//uso: Cell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado)
//$this->SetY(-1);
$this->SetFont(’arial’,”,8);
$this->Cell(0,5,”Criando arquivos PDF com PHP”,0,0,’L');
$this->Cell(0,5,’http://fdweb.com.br’,0,1,’R');
$this->Cell(0,0,”,1,1,’L');
$this->Ln(8);}
// sobrepõe o método footer
function Footer()
{
//Vai para 1.5 cm da parte inferior$this->SetY(-15);
//Seleciona a fonte Arial itálico 8
$this->SetFont(’Arial’,'I’,8);
//Imprime o número da página corrente e o total de páginas
$this->Cell(0,10,’Página ‘.$this->PageNo().’ de {total}’,0,0,’C');
}
}$texto = “Os arquivos PDF se transformaram ao longo do tempo em um padrão para troca de documentos. Desde relatórios até contratos, este formato
tem sido usado em larga escala devido a sua portabilidade - é possível abrir arquivos deste tipo em qualquer sistema operacional - além de, geralmente, ser um arquivo pequeno.
Isso sem falar que um arquivo PDF não pode ser modificado, garantindo, desta forma, que o arquivo irá sempre manter o mesmo conteúdo. Eu arriscaria dizer, ainda, que passa uma
aparência mais profissional enviar um arquivo em formato PDF, ao invés de outros formatos, como DOC, por exemplo.”;//defininfo a fonte !
define(’FPDF_FONTPATH’,'fpdf/font/’);//instancia a classe
//uso: PDF(orientacao - retrato ou paisagem), unidade de medida, tamanho do papel)
$pdf = new PDF(”P”,”mm”,”A4″);$pdf->AliasNbPages( ‘{total}’ );
$pdf->AddPage();
//define a fonte a ser usada
//uso: SetFont(nome da fonte, estilo (branco = normal, b = negrito, i = italico, u = sublinhado), tamanho da fonte)
$pdf->SetFont(’arial’,”,10);//define o titulo
$pdf->SetTitle(”Criando nosso primeiro arquivo PDF !”);//assunto
$pdf->SetSubject(”Criação de arquivos PDF com PHP!”);//Seta a fonte do texto do documento
$pdf->SetFont(’arial’,”,8);// insere a imagem
//uso: Image(caminho, posicao X,posicao Y,altura, largura)
//$pdf->Image(”http://fdweb.com.br/downloads/logo.jpg”,$pdf->GetX(),$pdf->GetY(),20,20);
$pdf->Image(”logo.jpg”,10,30);//posiciona horizontalmente
$pdf->SetY(”30″);
$pdf->SetX(”50″);//Insere o texto do documento
//uso: MultiCell(largura, altura, conteudo, borda, quebra de linha, alinhamento (L = esquerdo, R = direito, C = centralizado, J = justificado)
$pdf->MultiCell(0,5,$texto,0,”L”,0);$pdf->Output();
?>
Podemos notar que o código sofreu três alterações:
Declaramos $pdf = new PDF() ao invés de $pdf = new FPDF().
Acrescentamos as linhas : $pdf->AliasNbPages( ‘{total}’ ); e $pdf->AddPage();
O código que montava o cabeçalho foi para dentro da função Header, saindo do corpo do documento.
Considerações Finais
Antes de finalizar é bom ressaltar alguns itens:
- Não esquecer de informar a fonte antes de imprimir qualquer texto. Caso contrário a página ou o texto anterior ao primeiro SetFont não aparecerá no documento;
- Setar sempre a posição Y primeiro. Primeiro Y depois X, e não o contrário.
- Se for necessário colocar algum texto no final de cada página, como por exemplo a soma total de um campo, basta usar a função GetY é para determinar a posição da impressão dentro do documento. Isso pode ser verificado dentro de um loop for ou while. Por exemplo, o código abaixo imprime o número de linha de 1 a 150. Ao chegar no final da página (ou seja, a 27cm) ele escreve a palavra total e continua a impressão da linha seguinte na próxima página:
for($i=1;$i<=150;$i++)
{if ($pdf->GetY() >= 270)
{
$pdf->Cell(0,5,”total: “,0,0);
$pdf->AddPage();
$pdf->Cell(0,5,”Line $i - ” . $pdf->GetY() ,0,1);
}
else
{
$pdf->Cell(0,5,”Line $i - ” . $pdf->GetY() ,0,1);
}}
Concluindo
Vimos que criar arquivos PDF pode ser uma tarefa bem simples. Claro que documentos ou relatórios mais bem elaborados e/ou complexos podem dar um pouco mais de trabalho, mas o resultado final fica com aspecto mais profissional e elegante.
Confira ofertas de: DVD, filmes, celular, notebook, livros, jogos, Wii, PS3, MP4


Bicho preciso saber se daria pra enviar o PDF via email anexado sem gravar em pastas e sem chamar o download.
Fabio, gostaria de saber se no PAPEL, quando você está instaciando o objeto $pdf = new PDF(”P”,”mm”,”A4?);, quais os tipo de papel que pode usar. Estou precisando usar um papel continuo desse tamanho 201 x 305 mm ou 21 x 30,5 cm
Você sabe me dizer se dá para criar o papel neste tamanho?
Aguardo sua resposta!
Grato,
Anderson
Fabio, gostaria de saber como faço para puxar os dados cadastrados no banco de dados e imprimilos em um relatorio de em pdf.
Pois não estou conseguindo fazer com os dados cadastrados no bd sejam impressos no relatorios no arquivo pdf.
Se voce saber me dizer, me da uma luz ai.
Aguardo resposta.
Obrigada,
Vanessa Pains Fonseca
A minha pergunta é a mesma da número 1 postada pelo villas?
Muito obrigado!
Renato
Tive um problema aqui com esse código, testei aqui em dois browsers e no Internet Explorer 7 não está funcionando.
no Mozilla funcionou mais os caracteres especiais ficaram loucos…
você poderia me apresentar uma solução?
Fabio… bacana, muito bom !!! Parabens.