PHP, Gerando Arquivos PDF (FPDF)

22 11 2007

A pouco tempo atrás, em uma de minhas aplicações, precisei recorrer ao pdf para gerar notas fiscais (sim notas fiscais) portando precisei rala um pouco para configurar fontes ajustar margens e tudo mais, sendo assim resolvi escrever sobre.

Como minha aplicação foi feita em PHP utilizei uma classe chamada fpdf que hoje considero a mais popular para geração de documentos pdf.

Vamos lá.

1 - Baixando os arquivos necessários

Para isso basta acessar:

http://www.fpdf.org/en/download.php

E escolher a versão mais atual (a versão indicada abaixo verm com a documentação e um tutorial que não tem erro)

No meu caso o arquivo é fpdf153.zip

Extraia o arquivo fpdf153.zip para a pasta de preferência dentro de seu projeto, no meu caso eu extrai para a pasta fpdf.

2 - Meu primeiro arquivo

Para criar seu primeiro arquivo você terá:

require_once("fpdf/fpdf.php");
define(’FPDF_FONTPATH’,'fpdf/font/’);
$pdf = new FPDF(”P”,”cm”,array(17.7,22));
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont(’Arial’,”,10);
$pdf->SetMargins(0,0,0);
$pdf->setY(”2.25″);
$pdf->setX(”11.6″);
$pdf->Cell(0, 0, “nodesign”);
$pdf->Output(”arquivo”,”I”);

Calma que é mais simples do que parece,

require_once(”fpdf/fpdf.php”); = Importa a classe principal do fpdf

    define(’FPDF_FONTPATH’,'fpdf/font/’); = Define qual o diretório onde está centrado os arquivos do fpdf que você baixou.

      new FPDF(”P”,”cm”,array(17.7,22)); = Cria o objeto da classe fpdf, passando como argumentos, a orientação da página (L para Paisagem ou P para Retrato), unidade de medida (cm = centimetro e assim vai), e as dimenções da página que você também poderá passar as default da classe como A4, A3 … ou utilizar um vetor como eu fiz.

        Ufa, até aqui tudo certo, agora vamos começar a escrever:

        SetFont(’Arial’,”,10); = Setando a fonte que será usada a partir de agora no documento. Existe uma penca de fontes já implementadas no fpdf e também tem como adicionar mais fontes (eu tive que fazer isso e é chato demais), para isso basta consutlar o manual.

          SetMargins(0,0,0); = Define as margens que a escrita do documento será iniciado.

            setY(”2.25″); = Define em qual posição de Y será iniciada a escrita em relação a margem (lembrando que foi definido centímetros como unidade de página)

              setX(”11.6″); = Mesma coisa do setY só que em X (x = horizontal, y = vertical)

                Cell(0, 0, “nodesign”); = Aqui finalmente agente escreve, no caso passando como argumento o texto “nodesign” que será impresso no documento, o Cell, representa que o texto será de 1 linha apenas, os argumentos 0,0 definem a label que irá abranger o texto, isso é bom mais no caso de alinhar a esquerda um texto e a direita o outro, imagina que isso será “quanto esse texto vai ocupar na tela” e como voces perceberam foi definido onde esse texto será escrito na tela no setX e setY.

                  Pronto, agora finalizando.

                  Output(”arq.pdf”,”I”); = Está é a função que representa como será a saída do arquivo, se será apenas exibido na tela (use o default Output()) ou como no meu caso eu precisava do arquivo gerado, passei os argumentos “I” que gera o arquivo e “arq.php” como nome de saída do meu arquivo.

                    3 - Inserindo Imagem

                    $pdf->Image('img.jpg',10,10,38,38,jpg);

                    img.jpg’,10,10,38,38,jpg = Nome do arquivo, coordenadas, tamanho da imagem, e formato, quer mais fácil que isso ?

                    4 - Múltiplas Linhas

                    $pdf->Multicell(5, 0.5, "nodesign");

                    5, 0.5, “nodesign” = Tamanho da Label (fundamental para definir aonde o texto irá quebrar e quantas linhas ele terá) e texto a ser exibido.

                    5 - Novas Fontes

                    Realmente eu acho essa parte meio chata,

                    $pdf->AddFont('Lucon','I','lucon.php');

                    Só isso ? Não, tem uma penca de coisas, primeiro além do ttf em mãos é preciso gerar o mapa de caracteres da fonte e logo em seguida utilizar um arquivo que vem junto no pacote do fpdf:

                    ttf2pt1 -b -L luconMap.map c:\font\lucon.ttf lucon

                    Feito isso basta utilizar o AddFont mencionado logo acima.

                    Qualquer dúvida basta reclamar.

                    6 - Converter HTML para PDF

                    Isso eu vi o script recentemente no próprio site do fpdf e ainda não testei mais mesmo assim segue o link pois parece bem tranquilo:

                    http://www.fpdf.org/en/script/index.php
                    Procure por Write HTML

                    7 - Finalizando

                    Como eu iniciei comentando neste post, a minha aplicação precisava gerar notas fiscais, a impressão seria utilizando impressora matricial foi muito complicada (pdf e matricial não combinam), na base da muita porrada eu consegui resolver o problema das fontes no fpdf e acabo todo mundo feliz, segue abaixo dicas fundamentais.

                    Leia a documentação que vem junto ao pacote, ela é SIMPLES DEMAIS.

                    Veja os tutoriais que também vem junto ao pacote.

                    Link Site Oficial.


                    Ações

                    Informações

                    16 respostas para “PHP, Gerando Arquivos PDF (FPDF)”

                    29 11 2007
                    Allyson de Paula (20:34:11) :

                    Olá,

                    Poderia me informar qual foi o TTF que você utilizou e o tamanho?

                    Estou tentando utilizar a fonte Sans Serif da Impressora EPSON LX 300, mas até agora sem sucesso. Adicionei a fonte MS Reference Sans Serif - mas nem de longe o resultado é aceitável.

                    Obrigado!

                    29 11 2007
                    Allyson de Paula (20:35:00) :

                    Esqueci de comentar: pra que não sabe a EPSON LX 300 é matricial e a fonte configurada nela é a Sans Serif

                    30 11 2007
                    Jonathan Isaac (11:24:41) :

                    A impressora que eu estava lidando era a EPSON LX 300-II e a fonte utilizada foram 3, a Times em dois textos longos, a Arial em todos os campos e a Lucon (Lucion) nos números, mais a grande jogada foi na configuração da impressora: Imprimir Paisagem, Preto e Branco e Somente Imagem.

                    24 12 2007
                    André Fabiano (19:32:39) :

                    Bom Dia, eu estou precisando inserir um cabeçalho em cada página do meu arquivo pdf( como no word, insere em 1 aparece em todas).
                    Se alguem puder me ajudar ficarei grato.
                    Att,
                    André Fabiano.

                    14 02 2008
                    Estela (06:33:35) :

                    Olá,

                    Estou precisando inserir uma página de rosto em arquivo pdf.
                    Agradeço muito se alguém puder me ajudar.

                    Att,
                    M. Estela

                    13 03 2008
                    Elton Minetto (12:04:41) :

                    Olá Jonathan, boa dica essa.
                    Estou usando o fpdf mas no momento de imprimir na LX 300 está ficando desconfigurado o papel e não respeita as posições.
                    Que configurações vc precisou fazer na impressora no windows do cliente para ele imprimir corretamente?
                    Obrigado pela ajuda

                    19 03 2008
                    Marcelo (17:20:32) :

                    Copiei o código que aparece acima e fiz o download do fpdf conforme indicado. Mas aparece a seguinte mensagem listada abaixo “Warning: Cannot add header information - headers already sent by (output started at c:\apache\htdocs\everest\pdf.php:5) in c:\apache\htdocs\everest\fpdf\fpdf.php on line 1022
                    FPDF error: Some data has already been output to browser, can’t send PDF file”

                    19 03 2008
                    Jonathan Isaac (17:53:04) :

                    Opa,

                    Antes de mais nada. verifique se o caminho do require_once está correto junto ao caminho do FONTPATH.

                    Normalmente por default o nome da pasta do fpdf tem outro nome tipo fpdf-versão que deverá ser alterado em ambos caminhos.

                    : )

                    19 03 2008
                    Marcelo (18:34:42) :

                    Os caminhos estão corretos. renomiei a pasta. criei um arquivo pdf.php dentro do diretorio fpdf com o código abaixo

                    Open();
                    $pdf->AddPage();
                    $pdf->SetFont(”Arial”,”",10);
                    $pdf->SetMargins(0,0,0);
                    $pdf->setY(”2.25″);
                    $pdf->setX(”11.6″);
                    $pdf->Cell(0, 0, “nodesign”);
                    $pdf->Output(”arquivo.pdf”,”I”);

                    ?>

                    19 03 2008
                    Marcelo (18:40:21) :

                    Open();
                    $pdf->AddPage();
                    $pdf->SetFont(”Arial”,”",10);
                    $pdf->SetMargins(0,0,0);
                    $pdf->setY(”2.25″);
                    $pdf->setX(”11.6″);
                    $pdf->Cell(0, 0, “nodesign”);
                    $pdf->Output(”arquivo.pdf”,”I”);

                    ?>

                    19 03 2008
                    Jonathan Isaac (20:33:18) :

                    Correto,

                    Provavelmente seu erro sera corrigido tendo em vista que:

                    O arquivo que irá gerar o PDF (que inclui o código descrito por você) deverá estar limpo de impressões na tela, exemplo:

                    Se no arquivo contendo as instruções tiver algo como saída HTML ou print “algo” ou echo “algo” ou afins, dará problema na criação do documento, pois nosso output exemplo tem como saída a propria tela de visualização.

                    Resumindo: No arquivo (.php) que voce utilizou para gerar o documento em PDF deverá conter APENAS instruções sem nenhuma saída (impressão na tela).

                    Este problema é resultante da utilização dos headers do fpdf que definem a pagina presente como sendo do tipo PDF (por estar definido assim no output)

                    Espero que tenha compreendido.

                    19 03 2008
                    Jonathan Isaac (20:36:08) :

                    @Elton

                    Utilizei todas as definições em centimetros e o mais importante: o tamanho do documento a ser gerado também definido em centimetros, no meu caso usei como argumento a passagem: array(17.7,22).

                    Só lembrando que também tive problemas SÉRIOS e CHATOS pra *******, passando todas as medidas corretamentes deu tudo certo.

                    24 03 2008
                    Marcelo (12:29:30) :

                    Obrigado pela ajuda.

                    Descobri que haviam 2 enter’s no final do código, após copia-lo de sua página para o dreamwaver.

                    Foi só remover esses espaços e o código funcionou normalmente.

                    Agora é so o trabalho de montar o pdf.

                    Parabens pelo código e pela ajuda

                    19 04 2008
                    Rodrigo (17:55:24) :

                    olá! Minha dúvida é a seguinte consigo transformar um arquivo rtf em pdf com o fpdf?

                    desde já agradeço a todos.

                    16 05 2008
                    Flavio (19:27:35) :

                    a

                    16 05 2008
                    Flavio Oliveira (19:28:20) :

                    awd

                    Deixe um comentário

                    Você pode usar estas tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>