Criar arquivos em pdf com php

03/10/2015

0

PHP

Boa Noite Pessoal!

Hoje me deparei com a necessidade de imprimir dados uma pagina php que possuo, dei uma olhada na internet onde encontrei várias classes para fazer isso tipo: MPDF, html2pdf, tcpdf, etc, mas pelo que vi muitas vezes são arquivos muito grandes de até 50mb e muitas vezes também tem funções bem limitadas, gostaria saber se vcs conhecem alguma classe melhor que seja um arquivo bem pequeno se possível criar o código direto para gerar o pdf e exibir no bowser
Moisés

Moisés

Responder

Post mais votado

21/10/2015

Moises!

dei uma olhada no teu código, não tem problema algum e pelo que ví vc esta conseguindo mostrar os itens com o FOREACH

pelo que ví, vc esta usando uma array simles para a SESSION, se vc utilizar uma array bidimenisonal acho que seria melhor, tipo:

$_SESSION['matriz']['indice']['valor']

ou seja a $_SESSION vai conter algo tipo isso:

id | produto | qtd | preço
1 | prod1 | 10 | 1.00
2 | prod2 | 20 | 2.00
3 | prod3 | 30 | 3.00

o FOREACH{} faz o que esta dentro das chaves para todos os elementos do vetor até acabar-se os elementos, o problema nesse caso é dividir por grupos

usando o FOR ou WHILE ou ainda o DO WHILE conseguimos o seguinte resultado

id: 1
prod: produto1
qtd: 10
preco: 1.00

id: 2
prod: produto2
qtd: 20
preco: 2.00

id: 3
prod: produto3
qtd: 30
preco: 3.00

faça o teste em uma pagina PHP qualquer

session_start();
$_SESSION['vetor'] = array();

$_SESSION['vetor']['id'][] = "1";
$_SESSION['vetor']['prod'][] = "produto1";
$_SESSION['vetor']['qtd'][] = "10";
$_SESSION['vetor']['preco'][] = "1.00";

$_SESSION['vetor']['id'][] = "2";
$_SESSION['vetor']['prod'][] = "produto2";
$_SESSION['vetor']['qtd'][] = "20";
$_SESSION['vetor']['preco'][] = "2.00";

$_SESSION['vetor']['id'][] = "3";
$_SESSION['vetor']['prod'][] = "produto3";
$_SESSION['vetor']['qtd'][] = "30";
$_SESSION['vetor']['preco'][] = "3.00";


$s = sizeof($_SESSION['vetor'],1) -4;// menos a quantidade de indices

print_r ($_SESSION['vetor']);
//print_r ($vetor);

echo "<br><br><strong>Listando SESSION array bidimensional  com FOR</strong><br>";
for ($f =0; $f <(($s)/4); $f++) {// tamanho do array dividido pela quantidade de indices
 echo "id:  ".$_SESSION['vetor']['id'][$f]."<br>";
 echo "prod:  ".$_SESSION['vetor']['prod'][$f]."<br>";
 echo "qtd:  ".$_SESSION['vetor']['qtd'][$f]."<br>";
 echo "preco:  ".$_SESSION['vetor']['preco'][$f]."<br><br>";
 }

Felipe

Felipe
Responder

Mais Posts

05/10/2015

Moisés

Bom Dia pessoal!

Muito obrigado pela ajuda de todos, irei usar o mpdf por enquanto, depois se eu conseguir alguma forma substituo.
Responder

05/10/2015

Viviane Hess

Bom Dia pessoal!

Muito obrigado pela ajuda de todos, irei usar o mpdf por enquanto, depois se eu conseguir alguma forma substituo.


Tudo bem Moises, boa sorte e sucesso.
Responder

05/10/2015

Marcio Araujo

Boa sorte Moises.
Responder

06/10/2015

Moisés

Obrigado Pessoal valeu
Responder

11/10/2015

Moisés

Pessoal estou tentando usar a mpdf, porém estou tendo dificuldades pois a pagina que preciso criar o pdf está cheia de código em php um monte variáveis, e preciso que o conteúdo delas seja impresso em pdf , mas não estou conseguindo, o mpdf está imprimindo apenas o html, já parte em php, o código esta sendo impresso.
Responder

11/10/2015

Cleyton Caetano

Pessoal estou tentando usar a mpdf, porém estou tendo dificuldades pois a pagina que preciso criar o pdf está cheia de código em php um monte variáveis, e preciso que o conteúdo delas seja impresso em pdf , mas não estou conseguindo, o mpdf está imprimindo apenas o html, já parte em php, o código esta sendo impresso.
Mano explica melhor, posta o código e diz qual erro tá dando, pq eu uso ela e não vejo dificuldades...
Responder

11/10/2015

Moisés

Cleyton Caetano o erro é o seguinte " Parse error: syntax error, unexpected '' (T_ENCAPSED_AND_WHITESPACE), expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in C:\wamp\www\Manafestas\orca_pdf.php on line 19", esta linha corresponde a um laço de repetição.

segue o código:
<?php
	include("mpdf60/mpdf.php");
	session_start();
	$total = 0;
	$i = 0;

	$html = "<table width='620' border='0' id='tabela'>
                            <tr>
                                <td width='20'>#</td>
                                <td width='200'>Nome</td>
                                <td colspan='2'>Qtd / Descri.</td>
                                <td width='120'>Vl.Unit</td>
                                <td width='120'>Subtotal</td>
                            </tr>                   

                        $total = 0;
                        $i = 0; 
                        foreach($_SESSION['orca'] as $k=>$v){
                        $i = $i + 1;
                             $query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k");
                             $linha = mysqli_fetch_assoc($query);
							 $descri = $linha['descri_prod'];
                             $subtotal = $linha['preco_prod'] * $v;
                             $total = $total	+ $subtotal;
                    
                            <tr>
                                <td><?php echo $i; ?></td>
                                <td><?php echo $linha['nome_prod']; ?></td>
                                <td width='150'><?php echo $v; ?><?php echo " ". $descri; ?></td>
                                <td width='15'><?php echo $linha['id_prod']; ?></td>
                                <td><?php echo 'R$ '. number_format ($linha['preco_prod'],2,',','.'); ?> </td>
                                <td><?php echo 'R$ '. number_format ($subtotal,2,',','.'); ?></td>
                            </tr>
                        </form>
                        
                    <?php } ?><!-- fim do forech-->
                             <tr>
                                <td></td>
                                <td></td>
                                <td></td>
                                <td></td>
                                <td>Total:</td>
                                <td colspan="2"><?php echo 'R$ '. number_format($total,2,',','.'); ?></td>
                            </tr>
                         </table>";
						 
	$mpdf=new mPDF(); 
	$mpdf->SetDisplayMode('fullpage');
	//$css = file_get_contents("css/orca_pdf.css");
	$mpdf->WriteHTML($html);
	$mpdf->Output();
	exit;
	
?>
Responder

14/10/2015

Moisés

Alguém me ajuda por favor!!!
Responder

14/10/2015

William

Dentro da variável $html você está misturando código PHP com HTML, linha 19.

$total = 0;
$i = 0; 
foreach($_SESSION['orca'] as $k=>$v){
$i = $i + 1;
$query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k");
$linha = mysqli_fetch_assoc($query);
$descri = $linha['descri_prod'];
$subtotal = $linha['preco_prod'] * $v;
$total = $total    + $subtotal;
Responder

15/10/2015

Felipe

para que as variáveis sejam impressas faça assim:

*antes do $html vc recolhe todos os dados do banco e recupera as variavais recebidas via POST ou GET
*depois vc coloca elas em outras variaveis e exibe no html.

Ex:.

$id = $_POST['id'];

query("SELECT * FROM tabela where id = $id");
$linha = mysql_fetch_assoc($query);

$nome = linha['nome'];
$idade = linha['idade'];

$html ='<p>Eu sou <strong>'.$nome.'</strong></p>
       <p>Tenho <strong>'.$idade.'</strong></p>';

$mpdf=new mPDF("A4","L");// aqui o formato e a orientação da folha
$mpdf->charset_in='windows-1252';//aqui o tipo de codificação,OBS: sem esta etapa acima pode ficar alguns caracteres estrahos quando retirados do banco
$mpdf->SetDisplayMode('fullpage');
$css = file_get_contents("estilo.css");//aqui o endereço da folha de estilos
$mpdf->WriteHTML($css,1);//aqui vc envia o CSS para o PDF
$mpdf->WriteHTML($html);//aqui vcc envia o HTML para o PDF
$mpdf->Output();// aqui é a saida HTML, neste formato apenas mostra o PDF sem salvá-lo



para mais informaçoes consulta a documentação do mpdf http://mpdf1.com/manual/index.php
Responder

16/10/2015

Moisés

para que as variáveis sejam impressas faça assim:

*antes do $html vc recolhe todos os dados do banco e recupera as variavais recebidas via POST ou GET
*depois vc coloca elas em outras variaveis e exibe no html.

Ex:.

$id = $_POST['id'];

query("SELECT * FROM tabela where id = $id");
$linha = mysql_fetch_assoc($query);

$nome = linha['nome'];
$idade = linha['idade'];

$html ='<p>Eu sou <strong>'.$nome.'</strong></p>
       <p>Tenho <strong>'.$idade.'</strong></p>';

$mpdf=new mPDF("A4","L");// aqui o formato e a orientação da folha
$mpdf->charset_in='windows-1252';//aqui o tipo de codificação,OBS: sem esta etapa acima pode ficar alguns caracteres estrahos quando retirados do banco
$mpdf->SetDisplayMode('fullpage');
$css = file_get_contents("estilo.css");//aqui o endereço da folha de estilos
$mpdf->WriteHTML($css,1);//aqui vc envia o CSS para o PDF
$mpdf->WriteHTML($html);//aqui vcc envia o HTML para o PDF
$mpdf->Output();// aqui é a saida HTML, neste formato apenas mostra o PDF sem salvá-lo



para mais informaçoes consulta a documentação do mpdf http://mpdf1.com/manual/index.php


Felipe, o problema é que este dados eu pego de uma SESSION[] que é um Arry nela eu recebo duas informações nela o Id e a qtd, não tenho como pegar isso por POST ou GET pois não é um formulário, e de qualquer maneira eu precisarei do laço de repetição nesta pagina pois vai vai trazendo de um por um os produtos da base pelo id e seta a qtd.
Responder

16/10/2015

Moisés

Dentro da variável $html você está misturando código PHP com HTML, linha 19.

$total = 0;
$i = 0; 
foreach($_SESSION['orca'] as $k=>$v){
$i = $i + 1;
$query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k");
$linha = mysqli_fetch_assoc($query);
$descri = $linha['descri_prod'];
$subtotal = $linha['preco_prod'] * $v;
$total = $total    + $subtotal;



William, sim estou misturando mesmo, como você pode observar este neste trecho de código faço uma query trazendo trazendo de um por um os produto e loço vai imprimindo na tela, sem este laço não vou conseguir imprimir os produtos.
Responder

16/10/2015

Felipe

Moisés!
PHP e HTML são linguagens diferentes Não tem como misturar os códigos pois o programa nao vai entender, o que vc pode fazer é:

* escrever o código em html e inserir o código PHP dentro de <?php ... ?>
* escrever o código em PHP e inserir o HTML dentro do echo ' ....';

no caso da biblioteca mpdf é PHP entao o que vc tem que fazer é escrever o HTML dentro do echo e quando precisar escrever alguma variavel em PHP vc fecha a aspa e concatena a variável com o ponto.
EX.:
$nome = "Felipe"
echo '<p>meu nome é: '.$nome; // saída será: meu nome é: Felipe

$nome = "Felipe";
$idade = "x";
$html = '<p>meu nome é '.$nome.' e minha idade é '.$idade.' anos';
echo $html; //saída será: meu nome é Felipe e minha idade é x anos


quanto ao laço de repetição vc pode fazer sem problema algum, porém faça tudo antes (cuidando para nao misturar o HTML e o PHP) e por ultimo faça o $mpdf->output();

** agora nao estou em casa, mas de noite eu posto um relatório de clientes que eu fiz em PDF, inclusive com laço de repetição do{}while, linhas zebradas, identificação do usuário que recebe da SESSION e numeração das paginas no cabeçalho...

mas se quiser ir dando uma antecipada no assunto veja um simples modelo de recibo neste site: http://www.devwilliam.com.br/php/gerar-pdf-com-php-e-a-biblioteca-mpdf
Responder

16/10/2015

Felipe

[img]http://arquivo.devmedia.com.br/forum/imagem/458083-20151016-231910.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/458083-20151016-230756.png[/img]

ai tem um print do relatorio,

em uma pagina anterior eu defino a ordem se será ASC ou DESC, se irá exibir por COD, por NOME ou por CIDADE e se os campos que serao exibidos serão ATIVOS, INATIVOS, BLOQUEADOS ou TODOS e encaminho via POST

abaixo esta o codigo do relatorio simples de clientes, espero que seja útil, fiz o loop com a array recolhida do banco mas nada impede que seja feita com a da sessão... qualquer dúvida posta ai que estamos ai pra se ajuar..

<?php

header("Content-Type: text/html; charset=ISO-8859-1", true); 

	include("mpdf60/mpdf.php");
	include 'sessao.php'; 
	include 'open_db.php'; // aqui eu icluo a conexão com o Banco de dados
	$login = $_SESSION['login']; // recebe o login do usuario
	
//recebe os dados via POST		
	$ordenar =$_POST['ordenar'];// ordenar por COD, NOME ou CIDADE
	$ordem = $_POST['ordem'];// ordem crescente = ASC ou decrescente = DESC
	$situacao = $_POST['situacao']; // situação A = ATIVO, I = INATIVO, B = BLOQUEADO e T = TODOS
	
// seleciona os dados da tabela usuario usuario
	$sql = mysql_query("SELECT * FROM tb_usuario WHERE login='$login'");
   $usuario = mysql_fetch_array($sql);
   
// seleciona os dados da empresa apenas para exibir o logo no cabeçalho da pagina
   $sql = mysql_query("SELECT * FROM tb_empresa WHERE ativo='1' " );
   $empresa = mysql_fetch_array($sql);
   
// seleciona os dados no banco  ( se T escreve todos senao escreve conforme a situação--- situação recebida via POST)
   if($situacao =='t'){
   $sql_cli = mysql_query("SELECT * FROM tb_cliente ORDER BY $ordenar $ordem" ) or die(mysql_error());
   $busca_cli = (mysql_num_rows($sql_cli));
   $cliente = mysql_fetch_array($sql_cli);
   }else {
   
   $sql_cli = mysql_query("SELECT * FROM tb_cliente WHERE situacao='$situacao' ORDER BY $ordenar $ordem ") or die(mysql_error());
   $busca_cli = (mysql_num_rows($sql_cli));
   $cliente = mysql_fetch_array($sql_cli);	

   }
   
     
  
// configurações do relatorio
   $clientes_por_pag = 25;//quantidade de registros por pagina
   $value_zeb = false;// inicialização do zebrado da linha, false inicia em branco true inicia em cinza
   $qtd_clients = 0;// inicialização do contador de clientes
   $pagina = 0;// inicialização do numero da pagina
   $sp_ant = 6;//espaçamento entre linhas
   $titulo = "Relatório de Clientes - Simples";// titulo do relatorio
	date_default_timezone_set('America/Sao_Paulo');// define o relógio 
   $date = date('d/m/Y');// busca a data
   $hora = date('H:i'); // busca a hora
   $item = 1;
   
//funçao para que se nao tiver numero de telefone seleciona o celular

function situacao($situacao) { // função para escrever por extenso a situação, desta forma uso menos espaço no banco de dados
	
	if($situacao == "A") { return "Ativo";}
	if($situacao == "I") { return "Inativo";}
	if($situacao == "B") { return "Bloqueado";}
}

function telefone($telefone,$celular) {// função para escrever o telefone, se nao tiver telefone fixo escreve o celular
	
   $telefone = trim($telefone);  
   
   if(empty($telefone)){
   $telefone = $celular;
   }
   
   return $telefone;
	
	}
	
// desenha a pagina PDF
	
	$html = '
	<h3> Relatório de Clientes - Simples</h3><br>
	<div class="direita texto">Data do Relatório: '.$date.' --- Hora do Relatório: '.$hora.'</div>';


	$linha_dupla = '<div class="linha">=====================================================================================================================================</div>';

	
  $rodape = '<hr><table width="800px" border="0"><tr><td width="50%"><p class="rodape">Total de registros: '.$busca_cli.'</p></td>
  <td width="50%"><p class="rodape direita">Usuário: '.$usuario['nome'].'</p></td></tr></table>';

//------------------------------------inicio do PDF------------------------------------------------
   $mpdf=new mPDF();//cria o PDF
	$mpdf->charset_in='windows-1252';//define a codificação dos caracteres
	$mpdf->SetDisplayMode('fullpage');//define o tamanho da pagina
	$css = file_get_contents("css/estilo_relatorio.css");//busca o CSS na pasta
	$mpdf->WriteHTML($css,1);//envia o CSS para o PDF
	$mpdf->SetTitle($titulo);//define o tiiulo da pagina --- este será exibido na aba da janela


if($busca_cli > 0){	
	//calcula quantas paginas serão necessárias para imprimir todos os resultados
	$total_pag = ceil($busca_cli / $clientes_por_pag);
	
//Loop para mostrar os dados
do
{
   //utilizo o operador MOD para verificar se a pagina atingiu o limite max de linhas se sim entao cria uma pagina nova e escreve o cabeçalho novamente senao apenas pula para linha debaixo
	$cli_max = $qtd_clientes % $clientes_por_pag;	
	if($cli_max == 0){
		
	$pagina++;
	$mpdf->SetHeader('Página '.$pagina.' de '.$total_pag);//cria o cabeçalho
   $mpdf->SetHTMLFooter($rodape);// cria o rodapé
	$mpdf->AddPage('A4','L');

//primeira parte do relatorio
	$mpdf->Image($empresa['logo'], 25, 20, 20, 12,'PNG');// desenha o LOGO da empresa
	$mpdf->SetY(15);	
	$mpdf->WriteHTML($html);
	$mpdf->Ln(3);
	$mpdf->WriteHTML($linha_dupla);
	$mpdf->Ln(1);
	$mpdf->SetFont('sans-serif', 'B', 8);
	$mpdf->WriteCell(10,3,"  ITEM");
	$mpdf->WriteCell(10,3,"COD", 0, 0, 'C');
   $mpdf->WriteCell(50,3,"NOME");
	$mpdf->WriteCell(20,3,"TELEFONE");
	$mpdf->WriteCell(25,3,"CIDADE");
	$mpdf->WriteCell(15,3,"ESTADO");
	$mpdf->WriteCell(50,3,"E-MAIL");
	$mpdf->WriteCell(20,3,"SITUAÇÃO");
	$mpdf->WriteCell(20,3,"CADASTRO");
	$mpdf->Ln(4);
	$mpdf->WriteHTML($linha_dupla);
	$mpdf->Ln(1);
	
	$mpdf->SetFont('sans-serif', '', 8);// formata a fonte do relatorio

	}else {
	
//pula linha
	$mpdf->Ln($sp_ant);
	 }  



// desenha zebrado

   if (!$value_zeb){
     $mpdf->SetFillColor(255,255,255);
     $value_zeb = true ;
   } else {
      $mpdf->SetFillColor(225,225,225);
     $value_zeb = false ;
   }   
   $mpdf->SetX(15);
   $mpdf->Cell(265,$sp_ant, ' ',0,0,'L',true);
   $mpdf->SetX(15);
   
// formata os dados do banco em utf-8
   $item_cli = utf8_encode($item++);
   $id_cli = utf8_encode($cliente['id']);
   $nome_cli = utf8_encode($cliente['nome']);
   $fone_cli = utf8_encode(telefone($cliente['telefone'],$cliente['celular']));
   $cidade_cli = utf8_encode($cliente['cidade']);
   $estado_cli = utf8_encode($cliente['estado']);
   $email_cli = utf8_encode($cliente['email']);
   $situacao_cli = utf8_encode(situacao($cliente['situacao']));
   $data_cli = utf8_encode($cliente['data']);
   
//envia para o PDF a celula com os dados
   $mpdf->WriteCell(10,$sp_ant,$item_cli, 0, 0, 'C');
   $mpdf->WriteCell(10,$sp_ant,$id_cli, 0, 0, 'C');
   $mpdf->WriteCell(50,$sp_ant,$nome_cli);
	$mpdf->WriteCell(20,$sp_ant,$fone_cli);
	$mpdf->WriteCell(25,$sp_ant,$cidade_cli);
	$mpdf->WriteCell(15,$sp_ant,$estado_cli, 0, 0, 'L');
	$mpdf->WriteCell(50,$sp_ant,$email_cli);
	$mpdf->WriteCell(20,$sp_ant,$situacao_cli);
	$mpdf->WriteCell(20,$sp_ant,$data_cli);
	 
$qtd_clientes++;

}while ($cliente = mysql_fetch_array($sql_cli));// enquanto tiver linhas no banco para serem exibidas o do While vai fazer o Loop
}//fim do if


	// Output("relatorio.pdf","F");  ---- apenas salva o PDF e nao exibe
	// Output("relatorio.pdf","D");  ---- disponibiliza o PDF para download
	// Output("relatorio.pdf","I");  ---- exibe o PDF e nao salva
	       
	$mpdf->Output("relatorio.pdf","I");    //gera o PDF
 
 
 include 'close_db.php';// aqui eu incluo a desconexao com o banco

	exit;

?>
Responder

16/10/2015

Felipe

se quiserem usar o mesmo modelo de relatorio ai esta o CSS, tem algumas configurações a mais porque uso para mais de um relatorio

lembre se que ele está configurado dentro da pasta CSS ($css = file_get_contents("css/estilo_relatorio.css");)

fieldset.bd_black{
	width:  800px;
	margin: 10px auto;
	color: #444;
	border: 2px solid #000;
	font-family: Helvetica;
	padding: 15px;
}

h3{
	text-align: center;
}

.texto{
	font-size: 10px;
	font-family: sans-serif;
}

hr{
    color: #000000;

}

p.rodape{
    font-size: 12px;
    font-weight: bold;
    font-style: italic;
    font-family: serif;
    color: #000000;
    
}

div.linha{
   font-size: 10px;
	font-family: sans-serif;
	line-height:10%;
}

div.relatorio{
   font-size: 10px;
	font-family: sans-serif;
	line-height:10%;
}

.direita{
	text-align: right;
}

.center{
	text-align: center;
}
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar