Criar PDF Através do PHP

Uma das perguntas mais procuradas na Internet (e uma das mais temidas) é sobre como criar ficheiros em PDF usando o PHP!

Na prática temos uma grande quantidade de tutoriais, mas até hoje não encontrei nenhum que disponibilizasse uma solução completa disponível para testes.

Hoje falaremos sobre 2 soluções que são as mais usadas e daremos 2 exemplos de seu uso. ok?

No final da matéria você poderá pegar estes ficheiros na íntegra e dar andamento aos seus serviços.

Falando Sobre O FPDF:

O FPDF é a base de vários sistemas existentes para a criação de Ficheiros em PDF.

Apesar de ser mais fácil de mexer, seu conteúdo é mais simples e antigo. Mesmo assim ele ainda é muito usado, pois se você quiser imprimir textos sem grandes formatações, ele poderá fazer!

Caso seja necessário criar algo em HTML ele lhe dará mais trabalho (por isso recomendamos o TCPDF para esta finalidadee).

OBS.: Esse Sistema não dá suporte a versões antigas do PHP (Ex.: Versão PHP 4).

Usando O FPDF:

Conforme falei acima, o uso deste ficheiro é super simples e não lhe exigirá muitos recursos.

Como padrão, você mexerá em 3 ficheiros, que são esses: “ex.php”, “WriteHTML.php” e “fpdf.php”.

Veja abaixo o código fonte do “ex.php”:


<?php

require('WriteHTML.php');

$pdf=new PDF_HTML();
$pdf->AddPage();
$pdf->SetFont('Arial');

$html1 = 'Default <font face="courier">Courier <font face="helvetica">Helvetica <font face="times">Times <font face="dejavusans">dejavusans </font>Times </font>Helvetica </font>Courier </font>Default';
$html2 = '<small>small text</small> normal <small>small text</small> normal <sub>subscript</sub> normal <sup>superscript</sup> normal';
$html3 = "<font size='10' color='#ff7f50'>The</font> <font size='10' color='#6495ed'>quick</font> <font size='14' color='#dc143c'>brown</font> <font size='18' color='#008000'>fox</font> <font size='22'><a href='http://www.tcpdf.org'>jumps</a></font> <font size='22' color='#a0522d'>over</font> <font size='18' color='#da70d6'>the</font> <font size='14' color='#9400d3'>lazy</font> <font size='10' color='#4169el'>dog</font>.";

$html = $html1.'<br>'.$html2.'<br>'.$html3.'<br>'.$html3.'<br>'.$html2;

// output the HTML content
$pdf->writeHTML($html, true, false, true, false, '');
$pdf->Output('materia-PDF.pdf','I');
?>

Obs.: Como padrão o Internet Explorer salva o conteúdo dentro do diretório. Já o Mozilla lhe permite salvar o PDF em seu próprio computador.

Partindo do padrão acima, você pode melhorar a função e criar algo que lhe seja útil.

Quer ver como ficou a impressão em PDF?

Visite na pasta FPDF o ficheiro com nome “materia-PDF.pdf”.

Falando Sobre O TCPDF:

Bem… se você gosta de apresentar qualidade a seu cliente e não se importa em investir tempo no Projeto, o “TCPDF” é para você!

Diferente do FPDF ele é um pouco mais difícil de se usar, mas após descobrir seus segredos, você só vai usar esta solução.

Assim como o FPDF ele também tem seu ficheiro chave (que é o “tcpdf.php”, assim como o tcpdf_config.php).

Configurando esses 2 ficheiros adequadamente, você terá como usá-lo em qualquer Projeto sem qualquer problema.

OBS.: Na Internet e no site oficial você encontra este pacote completo, mas está com erro!

Até para facilitar em sua utilização, efetuei as correções devidas e disponibilizei o pacote completo para download.

Usando O TCPDF:

Abaixo vamos expor o ficheiro “index.php” com as configurações solicitadas em um Projeto.

Até para facilitar, como o ficheiro é um pouco extenso, vou comentar o conteúdo. ok?


<?php
require_once('config/lang/eng.php');
require_once('tcpdf.php');

// cria um novo documento PDF
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// seta as informações do documento (ex. Autor, Título, Assunto e Palavras Chave)
// OBS.: Se você quiser colocar o nome do autor, por exemplo, pode preencher o campo abaixo - dentro da aspas
$pdf->SetCreator(PDF_CREATOR);
//$pdf->SetAuthor('');
//$pdf->SetTitle('');
//$pdf->SetSubject('');
//$pdf->SetKeywords('');

// seta o que entrará dentro de Header (em meu caso, disponibilizei uma imagem)
$pdf->SetHeaderData(PDF_HEADER_LOGO);

// seta as fontes usadas no Header e no Rodapé
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

// seta as fontes que entraram como monospace
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

//seta as margens
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

//seta o break automático feito na página
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

//set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

//set some language-dependent strings
$pdf->setLanguageArray($l);

// ---------------------------------------------------------

// seta a fonte usada no documento (em meu caso, estou usando a Helvetica tamanho 10)
$pdf->SetFont('helvetica', '', 10);

// Adiciona uma página
$pdf->AddPage();

// Texto usado na página
$html = '<h1>WebMaster Criando PDF atraves do PHP</h1>
Alguns caracteres especiais: &lt; € &euro; &#8364; &amp; è &egrave; &copy; &gt; \\slash \\\\double-slash \\\\\\triple-slash

<h2>Dicas Interessantes</h2>

Alguns desenvolvedores tem dúvidas ao trabalhar com alguns caracteres. Por esse motivo, postamos abaixo alguns exemplos:

<ol>
  <li><b>Texto com Negrito</b></li>
  <li><i>Texto com Italico</i></li>
  <li><u>Texto com Underline</u></li>
  <li><b>b<i>Lorem<u>Lorem</u>bi</i>b</b></li>
  <li><a href="http://www.qsasolucoescorporativas.com.br" dir="ltr">link to http://www.qsasolucoescorporativas.com.br</a></li>
  <li>Lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor, lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum dolor lorem ipsum  dolor.</li>
  <li>SUBLIST
    <ol>
      <li>row one
        <ul>
          <li>sublist</li>
        </ul>
      </li>
      <li>row two</li>
    </ol>
  </li>
  <li><b>T</b>E<i>S</i><u>T</u> <del>line through</del></li>
  <li><font size="+3">font + 3</font></li>
  <li><small>small text</small> normal <small>small text</small> normal <sub>subscript</sub> normal <sup>superscript</sup> normal</li>
</ol>

<dl>
  <dt>Carro</dt>
  <dd>Black hot drink</dd>
  <dt>Leite</dt>
  <dd>Branco e Preto</dd>
</dl>

<div style="text-align:center">VISUALIZANDO UM MAPA<br />
<img src="imagens/mapa_peq.jpg" border="0" />
</div>';

$html2 = utf8_encode($html);

// Imprime o conteúdo do documeto
$pdf->writeHTML($html2, true, false, true, false, '');fpdf, PDF, PHP, tcpdf

// Reseta a partir deste ponto, para partir para a outra página
$pdf->lastPage();

// Fecha o documento e imprime o PDF
$pdf->Output('webmaster.pt.pdf', 'I');

?>

Quer ver como ficou a impressão em PDF?

Visite na pasta TCPDF o ficheiro com nome “webmaster.pt.pdf”.

E aí, gostou da matéria?

Espero que você se adapte bem a estes sistemas…

Na internet você encontra várias dicas específicas sobre sua utilização, mas partindo desses modelos, você conseguirá fazer qualquer impressão. Seja ela de um relatório ou documento.

Faça download do código usado neste tutorial: Criando PDF Através do PHP

pdf

Be Sociable, Share!

17 Comentários

  1. Valioso tutorial! Estava procurando algo assim mesmo. Boa explicação também.

  2. morfhos

    mais uma vez parabens!! bue de fish!

  3. Wagner

    Parabens, a classe TCPDF funciona muito bem. Muito obrigado.

  4. Wagner

    Cara, tudo certo aqui.
    Teria como você postar, como posso colocar um array de produtos dentro do conteudo.
    No meu caso estou tentando criar um relatório de produtos cadastrados no banco de dados.
    Os dados do cliente como é unico não tem problema, mas não estou conseguindo listar os produtos do pedido dentro do arquivo PDF.

  5. NOTLE

    Excelente tutorial. Estava tentando converter html com fpdf mas ele não converte tudo. Esse TCPDF esculacha. Meus Parabéns pela matéria.

  6. Roberto

    Parabéns, muito bom o turorial, e adorei o TCPDF!

  7. Cauê

    Muito bom mesmo o tutorialzinho.

    Foi muito conciso na explicação, ótima.

    E tbem obrigado por disponibilizar já os arquivos.

    Abraço e bons estudos

  8. Bruno Melo

    segue o código q estou usando para gerar o pdf com a tcpdf.

    só q ele cria o pdf mais sem dados algum, qual seria o problema

    // seta a fonte usada no documento (em meu caso, estou usando a Helvetica tamanho 10)

    $pdf->SetFont('helvetica', '', 10);

    // Adiciona uma página

    $pdf->AddPage();

    // Texto usado na página

  9. Bruno Melo

    $html ='<<<EOD
    <link href="../css/visual.css" rel="stylesheet" type="text/css">
    <style rel="stylesheet" type="text/css" media="print">

    #imprimir{display:none}
    #excel{display:none}

    </style>
    <style type="text/css">
    <!–
    body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
    }
    .style1 {color: #333333}
    .style2 {
    color: #FF3300;
    font-style: italic;
    }
    .style3 {color: #990000}

    .titulo_relatorio{
    background:#747474;
    color:#FFFFFF;
    }

    .dados_oge{
    text-align:center;
    background:#B0B0B0;
    color:#fff;
    font-weight:bold;
    }

    .dados_empresa{
    padding-right:10px;
    text-align:right;
    color:#000;
    font-weight:bold;
    background:#F2F2F2;
    }

    .dados_contrato{
    font-weight:bold;
    text-align:right;
    background:#FFFFFF;
    color:#000000;
    }

    .dados_fatura{
    text-align:center;
    background:#FFFFFF;
    padding-left:10px;
    color:#000000;
    }

    .dados_total_geral{
    text-align:right;
    background:#9D9D9D;
    font-weight:bold;
    color:#000000;
    }

    .dados_total{
    text-align:right;
    background:#FFFFFF;
    font-weight:bold;
    color:#000000;
    }
    –>
    </style>
    EOD;';

    if($_GET["id_moeda_dolar"] == "on"){$cssDolar ='style="padding:10px;"';}else{$cssDolar ='style="display:none"';}
    if($_GET["id_moeda_kwanza"] == "on"){$cssKwanza ='style="padding:10px;"';$cambio_kwanza = $_GET["cambio_kwanza"];}else{$cssKwanza ='style="display:none"';}
    if($_GET["id_moeda_euro"] == "on"){$cssEuro ='style="padding:10px;"';$cambio_euro = $_GET["cambio_euro"];}else{$cssEuro ='style="display:none"';}

  10. Bruno Melo

    $html .='<<<EOD
    <p class="text_titulo">
    <tr>
    <td height="60" colspan="3" class="text_titulo"><img src="'. $logo .'" width="80" height="40"></td>
    </tr>

    <tr class="text10">
    <td height="30" colspan="1" class="text_titulo style3"><font color="#000000"> RELA&Ccedil;&Atilde;O DE OGE – EMPRESA / CONTRATO</font></td>
    </tr>

    <table width="100%" border="1" align="center" cellpadding="0" cellspacing="0">
    <tr class="text10" bgcolor="#99CCFF">
    <td width="100%" class="text10" colspan="3" bgcolor="#CCCCCC">
    <table border="0" width="100%">
    <thead>
    <tr class="text10 titulo_relatorio" align="center">
    <td width="10%" height="15">N.OGE/N.CONTRATO/N.FACTURA</td>
    <td width="30%"> OGE / OBJECTO CONTRATO / DATA FACTURA</td>
    <td width="5%"'.$cssDolar.' > CONTRATO USD</td>

    <td width="5%" '.$cssDolar.' > FACTURADO USD</td>

    <td width="5%" '.$cssDolar.' > PREVISTO USD </td>

    <td width="5%" '.$cssDolar.' > PAGO USD </td>

    <td width="5%" '.$cssDolar.' > SALDO USD </td>

    <td width="5%" '.$cssKwanza.' > CONTRATO AKZ </td>

    <td width="5%"'.$cssKwanza.' > FACTURADO AKZ </td>

    <td width="5%"'.$cssKwanza.' > PREVISTO AKZ </td>

    <td width="5%" '.$cssKwanza.' > PAGO AKZ </td>

    <td width="5%" '.$cssKwanza.' > SALDO AKZ </td>

    </tr>
    </thead>
    ';

    if ($_GET["oge"]){ $filtro .= " id = ".$_GET["oge"]." AND "; }
    if ($_GET["ano"]){ $filtro .= " EXTRACT(YEAR FROM data) = ".$_GET['ano']." AND "; }
    $controladorContratoOGE = new ControladorOrcamentoGeral();
    $listaContratoOGE = $controladorContratoOGE->listarOGEEmpresa($filtro);

    if($listaContratoOGE){
    foreach($listaContratoOGE as $objContratoOGE){
    $html.='
    <tr class="text10 dados_oge">
    <td height="10">'.$objContratoOGE->numero.'</td>

    <td>'.$objContratoOGE->nome.'</td>

    <td colspan="5" style="padding-right:10px;" '.$cssDolar.'>
    '.Valor($objContratoOGE->valor_fe_dolar + $objContratoOGE->valor_rot_dolar).'
    </td>

    <td colspan="5" style="padding-right:10px;" '.$cssKwanza.'>
    '.Valor($objContratoOGE->valor_fe_kwanza + $objContratoOGE->valor_rot_kwanza).'
    </td>

    <td colspan="5" style="padding-right:10px;" '.$cssEuro.'>
    '.Valor($objContratoOGE->valor_fe_euro + $objContratoOGE->valor_rot_euro).'
    </td>

    </tr>
    ';

  11. Bruno Melo

    //lista as empresas
    $controladorFornecedor = new ControladorFornecedor();
    $listaFornecedor = $controladorFornecedor->listarEmpresaPorOGEeContrato($objContratoOGE->id);

    if($listaFornecedor){
    foreach($listaFornecedor as $objFornecedor){

    $filtro = "tb_cont.*";
    $controladorPrevisaoPagamento= new ControladorPrevisaoPagamento();
    $controladorPagamento = new ControladorPagamento();
    $controladorContrato = new ControladorContrato();
    $listaContrato = $controladorContrato->listarOGEPorContratoeEmpresa($objFornecedor->id,$objContratoOGE->id,$filtro);
    $filtro = "";

    if($listaContrato){
    foreach($listaContrato as $objContrato){

    $controladorFatura = new ControladorFatura();

    if ($_GET["ano"]){ $filtro['data'] = " EXTRACT(YEAR FROM data) = ".$_GET['ano']." AND "; }else{ $filtro = "";}

    $totalFatura = $controladorFatura->buscarTotalPorContrato($objContrato->id,$filtro);
    $totalFaturaEmpresa += $totalFatura["total_dolar"];

    $totalPagamento = $controladorPagamento->listarPorContrato($objContrato->id,$filtro);
    $totalPagamentoEmpresa += $totalPagamento["valor_dolar"];

    $totalPrevisto= $controladorPrevisaoPagamento->BuscarTotalContrato($objContrato->id,$filtro);
    $totalPrevistoEmpresa += $totalPrevisto["valor_dolar"];

    $valor_contrato_dolar += $objContrato->valor_dolar;
    $valor_contrato_kwanza += $objContrato->valor_kwanza;
    $valor_contrato_euro += $objContrato->valor_euro;

    $controladorAditivo = new ControladorAditivo();
    $listaAditivo = $controladorAditivo->buscarTotalPorContrato($objContrato->id,NULL);

    $valor_aditivo_dolar += $listaAditivo->valor_dolar;
    $valor_aditivo_kwanza += $listaAditivo->valor_kwanza;
    $valor_aditivo_euro += $listaAditivo->valor_euro;

    }
    $valor_empresa_dolar += $valor_contrato_dolar + $valor_aditivo_dolar;
    $valor_empresa_kwanza += $valor_contrato_kwanza + $valor_aditivo_kwanza;
    $valor_empresa_euro += $valor_contrato_euro + $valor_aditivo_euro;
    }

  12. Bruno Melo

    $html2 = utf8_encode($html);

    // Imprime o conteúdo do documeto

    $pdf->writeHTML($html2, true, false, true, false, '');//fpdf, PDF, PHP, tcpdf

    // Reseta a partir deste ponto, para partir para a outra página

    $pdf->lastPage();

    // Fecha o documento e imprime o PDF

    $pdf->Output('relatorio_oge_print_pdf.pdf', 'D');
    ?>

  13. Vou testar, mas preciso colocar uma marca d'agua na página toda é possível ?

  14. Christiano

    Estou usando o tcpdf mas o código abaixo está levando umas duas horas para gerar o arquivo (700 tabelas de Nota Fiscal). É isso mesmo? Demora tanto assim? Na minha máquina eu posso setar o limit timed out para zero mas no servidor não.

    <?php 
    // create new PDF document
    $tcpdf = new XTCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

    // set document information
    $tcpdf->SetCreator(PDF_CREATOR);
    $tcpdf->SetAuthor('Virtual Telecom');
    $tcpdf->SetTitle('Nota Fiscal de Telecomunicações – PED');
    $tcpdf->SetSubject('Emissão Nota Fiscal de Telecomunicações – PED');
    $tcpdf->SetKeywords('Nota Fiscal de Telecomunicações, PED, emissão');

    // remove default header/footer
    $tcpdf->setPrintHeader(false);
    $tcpdf->setPrintFooter(false);

    // set default monospaced font
    $tcpdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    //set margins
    $tcpdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);

    //set auto page breaks
    $tcpdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

    //set image scale factor
    $tcpdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

    // set font
    $tcpdf->SetFont('freesans', '', 10);

    continua…

  15. João

    Eu configurei o TCPDF numa pasta fora do website que estou a construir e quando o passei para a pasta do restante website ele deu o seguinte erro: 

    TCPDF ERROR: Some data has already been output, can't send PDF file

    O que fasso para o corrigir?
    Desde já muito obrigado

  16. ricardopcarvalho1

    Parabéns pelo site, ótimas informações no Scriptcase contem algumas informações sobre.

Participa! Comenta...