Linguagem PHP: 2ª Parte (Gerando o PDF) – Gerar um documento em PDF usando a biblioteca FPDF.


Olá pessoal, dando início a 2ª parte que é a criação do script PHP para gerar a página em PDF. Vamos utilizar a biblioteca FPDF, uma das mais conhecidas e usadas, para configurar a página PDF. As ferramentas utilizadas foram: O IDE Netbeans 6.9 (Oracle) e servidor web XAMPP (Apache) para testar e rodar as páginas. Hoje, poderíamos dizer que há mais pessoas usando o NetBeans do que qualquer outro IDE, a comunidade está prosperando, melhorando e crescendo de maneira vertiginosa e sempre com grande adesão por parte dos desenvolvedores. O Apache é um servidor web extremamente robusto, configurável e de alto desempenho, é também o mais bem sucedido servidor livre. Use as ferramentas que achar melhor ou tiver domínio.

Gosto de fazer as coisas bem organizadas, então para começar crie um projeto (pasta) com o nome GerarPdf, adicione os arquivos MetasTags, index.php e estilo.css que foram mostrados no post passado, 1ª parte. Nesse tutorial utilizei 3 imagens, são elas:

Baixe as imagens do tutorial aqui

Agora vamos dar início ao script chamado PaginaPdf.php. Precisará baixar a biblioteca FPDF, click aqui para baixar. Abra um arquivo PHP insira os códigos de abertura , insira um comentário breve sobre título, autor, e-mail e data. Para fazer comentário de múltiplas linhas utilize /**/, por exemplo:

/*
 *******************************************************************************
 *     JBWEBMASTER - Gerar um documento em PDF usando a biblioteca FPDF        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 28/09/2010                                     *
 * *****************************************************************************
 */

Depois de baixar a biblioteca coloque-a no mesmo projeto (pasta) GerarPdf, como ela está em arquivo zip, extraia para a pasta GerarPdf, agora na página PHP insira a biblioteca usando require ‘BibliotecaFPDF/fpdf.php’; , o require é idêntico ao “include” exceto em caso de falha que irá produzir um nível de erro e irá parar o script. Feito isso defina a fonte, define (‘FPDF_FONTPATH’, ‘BibliotecaFPDF/font/’); , se o arquivo que corresponde à fonte solicitada não existir, o erro “Could not include font metric file” (não foi possível incluir o arquivo de fonte) é DISPARADO, para que isso não ocorra defina o caminho a fonte e não esqueça de colocar a barra no final é obrigatória “/”.

Agora vamos capturar os valores do formulário, declare a variável e faça-a receber o conteúdo de $_POST assim:

//numero do processo
//exemplo do numero do processo 08664-001098/2010-09
$numProcesso = $_POST["numeroProcesso"];

Onde $numProcesso é a variável e numeroProcesso é o correspondente valor de “name” no HTML, mais dois exemplos:

//numero da nota fiscal
$numNotaFiscal = $_POST["notaFiscal"];
//nome da <span class="hiddenGrammarError" pre="da ">empresa
$empresa</span> = $_POST["nomeEmpresa"];

No final disponibilizarei o código completo.

Em seguida instanciamos a classe FPDF chamando seu construtor, $pdf = new FPDF (“P”, “mm”, “A4”); , FPDF é o construtor da classe e permite que seja definido o formato da página P=Retrato ou L= Paisagem, mm = tipo de medida utilizada no casso milímetros e tipo de folha = A4, para outras informações acesse o manual FPDF. Agora definimos as margens com a função SetMargins, define as margens esquerda, superior e direita. Por padrão elas são iguais a 1 cm sendo assim chame este método para alterá-las, $pdf->SetMargins(30, 20, 30); , como a medida está em milímetros então usei 30, 20 e 30. Função SetFont define a fonte que será usada para imprimir os caracteres do texto, é obrigatório chamar esse método ao menos uma vez ou o documento resultante não será válido.  A fonte será mantida de uma página para outra, agora sempre que quiser mudar a fonte chame esse método novamente, dessa forma pode mudar a fonte a qualquer momento. Procure usar as fontes padrão ou adicione uma através do método AddFont(). Definindo a fonte a ser usada, estilo e tamanho $pdf->SetFont(‘arial’, ”, 12);. Agora definimos o assunto $pdf->SetSubject(“Gerar PDF com FPDF”);. $pdf->SetY(“-1”); define a abscissa da posição corrente e se o valor passado for negativo, ele será relativo à margem direita da página.  $pdf->SetX(“10”); move a abscissa atual de volta para margem esquerda e define a ordenada. Se o valor passado for negativo, ele será relativo à margem inferior da página.

Exemplo das funções mencionadas até aqui:

$pdf = new FPDF("P", "mm", "A4");
$pdf->SetMargins(30, 20, 30);
$pdf->SetFont('arial', '', 12);
$pdf->SetTitle("Gerar PDF com FPDF");
$pdf->SetSubject("Gerar PDF com FPDF");
$pdf->SetY("-1");

Construindo o cabeçalho:

Pensando em várias páginas, resolvi fazer o cabeçalho em outra página chamada cabeçalho.php. Outras funções usadas: Image coloca uma imagem na página, $pdf->Image(“brasao.gif”); , função Line, que desenha uma linha entre dois pontos, $pdf->Line(70, 48, 70, 23); e MultiCell, função que permite imprimir um texto com quebras de linha, podendo ser alinhado, centralizado ou justificado, $pdf->MultiCell(90, 5, utf8_decode($textoCabecalho), 0, “L”); , largura 90, altura 5, texto e nesse caso utilizei o utf8_decode() para que fosse interpretado os caracteres e acentos, borda 0 que por padrão já é e alinhado a esquerda “L”. Defini o texto que ficará abaixo da imagem e usei o valor da variável nome da empresa, $textoImg = “BRASÃO da {$empresa}”; e adicionei o texto do cabeçalho:

$textoCabecalho = "DESENVOLVIDO POR \n";
$textoCabecalho .= "João Batista Dantas Bezerra Júnior ";
$textoCabecalho .= "JBWEBMASTER - Analista de Sistemas \n";
$textoCabecalho .= "Documento da {$empresa} \n";
$textoCabecalho .= "Processo n° {$numProcesso}";

OBS: “.=” serve para concatenar, juntando todas essas frases.

Dessa forma, usando as funções mostradas até aqui, o cabeçalho já pode ser feito ficando assim:

Nomeie essa página como: Cabecalho.php

<?php
/* 
 * CABECALHO DA PAGINA
 */

//CONFIGURACAO DA IMAGEM - IMAGEM 1
//posiciona horizontal 37mm da imagem
$pdf->SetX("37");
//gerando a imagem na pagina
$pdf->Image("brasao.gif");
//Definir a fonte e o tamanho 6 para o texto da imagem
$pdf->SetFont('arial', '', 6);
//posiciona horizontal 35mm do texto da imagem
$pdf->SetX("35");
//TEXTO DO IMAGEM
$textoImg = "BRASAO da {$empresa}";
/*
 * imprimir um texto com quebras de linhas
 * a largura 26.
 * a altura foi definida como 5 - dando um expasamento entre as linas,
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(26, 5, utf8_decode($textoImg), 0, "L");

//TEXTO DO CABECALHO
$textoCabecalho = "DESENVOLVIDO POR \n";
$textoCabecalho .= "João Batista Dantas Bezerra Júnior ";
$textoCabecalho .= "JBWEBMASTER - Analista de Sistemas \n";
$textoCabecalho .= "Documento da {$empresa} \n";
$textoCabecalho .= "Processo nº {$numProcesso}";
//posiciona verticalmente
$pdf->SetY("23");
//posiciona horizontalmente
$pdf->SetX("70");
/*
 * Desenha uma linha entre dois pontos.
 * cordenadas do ponto 1 e 2 para a linha
 */
$pdf->Line(70, 48, 70, 23);
//Definir a fonte e o tamanho 12 para o texto do cabeCalho
$pdf->SetFont('arial', '', 12);
$pdf->MultiCell(90, 5, utf8_decode($textoCabecalho), 0, "L");
?>

Agora insira o cabeçalho na página usando o include ‘Cabecalho.php’;

Bem, mais quatro funções e você será capaz de desenvolver qualquer página em PDF usando a biblioteca FPDF. Função Cell(), AddPage(), Output() e Ln(). A função Cell imprime uma célula (área retangular) com bordas opcionais, cor de fundo e texto. AddPage(), adiciona uma página nova ao documento, função Output() que envia o documento para o destino informado: string, arquivo local ou browser, nesse tutorial escolhemos enviar para o  browser e a função Ln() que realiza uma quebra de linha.

OBS1: Perceba no código fonte final do script que foi chamada a função setFont algumas vezes, isso acontece pelo fato de que quando você define uma fonte para o cabeçalho essa fonte se estende para todo o script então se precisar de um tamanho de fonte menor precisar chama-lo mais uma vez antes de mandar imprimir o texto que quer. Por exemplo:

//Nesse caso foi dado o tamanho 12 para o texto do documento
$pdf->SetFont('arial', '', 12);
//texto principal do documento
// "x .= x" usado para concatenar e tem a mesma funçao que x = x.x
$texto .= "               Juntei ao processo n° $numProcesso a nota fiscal n° $numNotaFiscal da empresa $empresa, e os ";
$texto .= "termos de recebimento provisório e definitivo, passando a compor as folhas ";
$texto .= "de n° $folhas.";
$texto .= "";

OBS2: Veja que já coloquei as variáveis aonde eu queria no texto que quero imprimir, como no caso “processo n° $numProcesso”.

OBS3: Para realizar as quebras de linhas não esqueça de usar o Ln().

OBS4: Usando a função MultiCell, não é necessário quebrar as linhas essa função já faz, ao indicar sua largura com 0 por padrão irá até o limite da margem direita, já a altura precisará ser indicada e vai ser ela a responsável pelo espaçamento entre as linhas do texto.

OBS5: Acesse o Manual FPDF para saber mais sobre as funções mencionadas aqui e outras.

Bom, com toda essa explicação e com os comentários das linhas de código que estão no código fonte, será capaz de entender, construir e aperfeiçoar sua página PDF. O código fonte do script PaginaPdf.php segue abaixo:

Nomeie essa página como: PaginaPdf.php

<?php

/*
 *******************************************************************************
 *     JBWEBMASTER - Gerar um documento em PDF usando a biblioteca FPDF        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 28/09/2010                                     *
 * *****************************************************************************
 */


require 'BibliotecaFPDF/fpdf.php';
define('FPDF_FONTPATH', 'BibliotecaFPDF/font/');

/*
 * CONFIGURANDO A PAGINA
 */

//RECEBENDO VALORES DO FORMULARIO:
//numero do processo
//exemplo do numero do processo 08664-001098/2010-09
$numProcesso = $_POST["numeroProcesso"];
//numero da nota fiscal
$numNotaFiscal = $_POST["notaFiscal"];
//nome da empresa
$empresa = $_POST["nomeEmpresa"];
//numero das folhas
$folhas = $_POST["numeroFolhas"];
//Data do documento
$dataDoc = $_POST["dataDoc"];
//Nome do responsavel pelo documento
$responsavelDoc = $_POST["nomeResponsavel"];
//Tipo do responsavel
$tipoResponsavelDoc = $_POST["TipoResponsavel"];
//Matricula do responsavel
$matriculaResponsavel = $_POST["matricula"];

/*
 * construtor da classe, que permite que seja definido o formato da pagina
 * P=Retrato, mm =tipo de medida utilizada no casso milimetros,
 * tipo de folha = A4
 */
$pdf = new FPDF("P", "mm", "A4");
//Define as margens esquerda, superior e direita.
$pdf->SetMargins(30, 20, 30);
//define a fonte a ser usada, estilo e tamanho
$pdf->SetFont('arial', '', 12);
//define o titulo
$pdf->SetTitle("Gerar PDF com FPDF");
//assunto
$pdf->SetSubject("Gerar PDF com FPDF");
// posicao vertical no caso -1.. e o limite da margem
$pdf->SetY("-1");

//inserir o cabecalho da pagina
include 'Cabecalho.php';

//espacamento
$pdf->Ln(30);
//define a fonte a ser usada, estilo e tamanho
//Nesse caso foi dado o tamanho 14 ao ti­tulo do documento
$pdf->SetFont('arial', '', 14);
//variavel que recebe o texto
$titulo = "Gerar um documento em PDF usando a biblioteca FPDF.";
//imprimi o texto em uma celula
$pdf->Cell(0, 10, $titulo, 0, 0, 'C');
//define a fonte a ser usada, estilo e tamanho
//Nesse caso foi dado o tamanho 12 para o texto do documento
$pdf->SetFont('arial', '', 12);

//texto principal do documento
// "x .= x" usado para concatenar e tem a mesma funcao que x = x.x
$texto .= "               Juntei ao processo nº $numProcesso a nota fiscal nº $numNotaFiscal da empresa $empresa, e os ";
$texto .= "termos de recebimento provisório e definitivo, passando a compor as folhas ";
$texto .= "de nº $folhas.";
$texto .= "";

//margens do texto principal
//medidas das margens
$pdf->SetMargins(30, 20, 30);
//posiciona verticalmente 41mm
$pdf->SetY("41");
//posiciona horizontalmente 10mm
$pdf->SetX("10");
//espacamento
$pdf->Ln(70);
/*
 * imprimir um texto com quebras de linhas
 * a largura sendo 0, serao extendidas ate a margem direita da pagina.
 * a altura foi definida como 7 - dando um expacamento entre as linas,
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(0, 7, utf8_decode($texto));
//espacamento
$pdf->Ln(5);
//data do documento
$textoData = "Em {$dataDoc}.";
/*
 * celular de largura 94, altura 10, texto ja¡ com utf8_decode(), bordas 0,
 * posicionar a direita, texto alinha ao centro
 */
$pdf->Cell(94, 10, $textoData, 0, 0, 'C');
//espacamento
$pdf->Ln(15);
//data do documento
$rodape = "$responsavelDoc\n";
$rodape .= "$tipoResponsavelDoc\n";
$rodape .= "Mat. " . $matriculaResponsavel;
//rodape
//posiciona verticalmente 190mm
$pdf->SetY("190");
//posiciona horizontalmente 60mm
$pdf->SetX("60");
/*
 * imprimir um texto com quebras de linhas
 * a largura de 90.
 * a altura foi definida como 7 - dando um expacamento entre as linas,
 * borda 0 - sem bordas, no caso de nao informar o padrao e 0 (zero)
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(90, 7, utf8_decode($rodape), 0, "C");

/*
 * IMPRIMIR A SAIDA DO ARQUIVO
 * nome do arquivo
 * I: envia o arquivo diretamente para o browser,
 * Se o plug-in estiver instalado ele serao usado.
 * mais opcoes no final do artigo ou visite o manual fpdf.
 */
$pdf->Output("PaginaPdf", "I");
?>

Com isso termino esse tutorial, espero que tenha ajudado e até a próxima.

Exemplo das funções mencionadas até aqui:

7 thoughts on “Linguagem PHP: 2ª Parte (Gerando o PDF) – Gerar um documento em PDF usando a biblioteca FPDF.

  1. Primeiramente parabéns pelo post, muito bom. Gostaria de saber como faço para alterar o tamanho da imagem no próprio código ( 25x 25 ), quero redimensioná-la. Tentei colocar assim: logo depois de $pdf->SetX(“30”) – $pdf->Image(“imagens/minha.jpg”,30,20,25,25); não deu certo, pois o que pretendo é colocar a imagem 25×25 no canto esquerdo ( sendo as margens : Esq=30mm / Superior e Direita = 20mm) e logo depois da imagem ( exatos 5 mm ) colocar um texto centralizado, esse seria meu cabeçalho. entao ficariam lado a lado, sem a linha que vc colocou, imagem e texto. Vc pode me ajudar ?

    1. Olá Téo, usando a função Image você terá duas opções para dimensionar a imagem.

      A primeira coisa a ser feita é que na orientação x e y da função Image deixe como null ou simplesmente não coloque nada, dessa forma a função irá pegar a posição que SetX e Y que você passou anteriormente ficando assim: $pdf->Image(“nome.jpg”,null,null); ou não passando nada como eu fiz no tutorial – $pdf->Image(“nome.jpg”);.

      Segunda coisa a ser feita: se quer dimensionar sua imagem, lembre que a unidade utilizada para todo o PDF que eu escolhi nesse tutorial é em milímetros – mm – porém usar se 25×25 corresponder a pixel então terá que saber sua respectiva dimensão em mm, no caso do tutorial a dimensão do brasão em pixel é de 60×70 e seu correspondente em mm é de 21×24 (arredondados), mas se não informar as dimensões a função captura por padrão a dimensão da imagem real, por isso não precisei informar nada apenas o caminho da imagem.

      Agora no caso de seu problema for para redimensionar uma imagem, tipo qualquer imagem que for passada e de qualquer tamanho ela redimensionar para 25×25, você vai precisar de uma função PHP que redimensiona as imagens.

      Valeu!

  2. joao, boa noite!
    antes de mais nada parabenizo-o pela iniciativa e humildade de ajudar quem está começando……..
    por gentileza caso puder me ajudar eu agradeço imensamente…
    estou trabalando com relatórios em pdf a +- 3 meses e já faço alguma coisa…contudo há algo desafiador que até o momento não estou conseguindo resolver…..quero fazer um relatório usando php + mysql + fpdf e eu quero buscar os dados do banco e colocá-los em determinados campos de uma tabela (por exemplo de uma nota fiscal…..etc) há o desenho de uma tabela……contudo já estou há algum tempo pesquisando pela internet para conseguir fazer a tabela como de uma nota fiscal por exemplo e até agora nada…….pergunto: existe algum programa que você conheça que trabalhe com o visual que faça por exemplo a tabela e que eu consiga buscar os dados do banco…..caso puder me dar uma luz agradeço……..nãod esisti não viu..continuo tentando e se conseguir resolver eu posto aqui…desde já agradeço pela ajuda….
    josemar…3j.2010@bol.com.br.
    p.s. com relação a conexão com o banco e busca dos dados com php penso que eu consiga fazer..o problema mesmo e este desenho(tabela..nota fiscal);

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s