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”:
AddPage();
$pdf->SetFont('Arial');
$html1 = 'Default Courier Helvetica Times dejavusans Times Helvetica Courier Default';
$html2 = 'small text normal small text normal subscript normal superscript normal';
$html3 = "The quick brown fox jumps over the lazy dog.";
$html = $html1.'
'.$html2.'
'.$html3.'
'.$html3.'
'.$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?
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 = '
WebMaster Criando PDF atraves do PHP
Alguns caracteres especiais: < € € € & è è © > \\slash \\\\double-slash \\\\\\triple-slash
Dicas Interessantes
Alguns desenvolvedores tem dúvidas ao trabalhar com alguns caracteres. Por esse motivo, postamos abaixo alguns exemplos:
- Texto com Negrito
- Texto com Italico
- Texto com Underline
- bLoremLorembib
- link to http://www.qsasolucoescorporativas.com.br
- 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.
- SUBLIST
- row one
- sublist
- row two
- row one
- TEST
line through - font + 3
- small text normal small text normal subscript normal superscript normal
- Carro
- Black hot drink
- Leite
- Branco e Preto
';
$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
17 Responses
Valioso tutorial! Estava procurando algo assim mesmo. Boa explicação também.
mais uma vez parabens!! bue de fish!
Parabens, a classe TCPDF funciona muito bem. Muito obrigado.
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.
Excelente tutorial. Estava tentando converter html com fpdf mas ele não converte tudo. Esse TCPDF esculacha. Meus Parabéns pela matéria.
Parabéns, muito bom o turorial, e adorei o TCPDF!
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
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
$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"';}
$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ÇÃ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>
';
//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;
}
$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');
?>
Vou testar, mas preciso colocar uma marca d'agua na página toda é possível ?
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…
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
basta comentar a linha 11 do index.php ficando assim:
//$pdf->SetCreator(PDF_CREATOR);
Parabéns pelo site, ótimas informações no Scriptcase contem algumas informações sobre.