Criar arquivos em pdf com php
03/10/2015
0
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
Post mais votado
21/10/2015
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
Mais Posts
05/10/2015
Moisés
Muito obrigado pela ajuda de todos, irei usar o mpdf por enquanto, depois se eu conseguir alguma forma substituo.
05/10/2015
Viviane Hess
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.
11/10/2015
Moisés
11/10/2015
Cleyton Caetano
11/10/2015
Moisés
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; ?>
14/10/2015
William
$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;
15/10/2015
Felipe
*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
16/10/2015
Moisés
*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.
16/10/2015
Moisés
$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.
16/10/2015
Felipe
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
16/10/2015
Felipe
[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; ?>
16/10/2015
Felipe
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; }
Clique aqui para fazer login e interagir na Comunidade :)