Criar arquivos em pdf com php
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
Melhor post
Felipe
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>"; }
Mais Respostas
Viviane Hess
03/10/2015
http://www.voltsdigital.com.br/labs/gerando-arquivo-pdf-a-partir-de-um-html-com-o-php/
[url]http://www.devwilliam.com.br/php/gerar-pdf-com-php-e-a-biblioteca-mpdf[/url]
Marcio Araujo
03/10/2015
Moisés
03/10/2015
http://www.voltsdigital.com.br/labs/gerando-arquivo-pdf-a-partir-de-um-html-com-o-php/
[url]http://www.devwilliam.com.br/php/gerar-pdf-com-php-e-a-biblioteca-mpdf[/url]
Então Viviane esta é uma das bibliotecas que vi e também uma das maiores a unica desvantagem que achei nela e o tamanho que chega a ser superior a 50mb ou seja acho que é é muita coisa para subir pro servidor apenas agerar uma pagina em pdf, mas muito obrigado pela resposta, se não conseguir outra forma será esta que utilizarei.
Viviane Hess
03/10/2015
Marcio Araujo
03/10/2015
Cleyton Caetano
03/10/2015
http://www.voltsdigital.com.br/labs/gerando-arquivo-pdf-a-partir-de-um-html-com-o-php/
[url]http://www.devwilliam.com.br/php/gerar-pdf-com-php-e-a-biblioteca-mpdf[/url]
Então Viviane esta é uma das bibliotecas que vi e também uma das maiores a unica desvantagem que achei nela e o tamanho que chega a ser superior a 50mb ou seja acho que é é muita coisa para subir pro servidor apenas agerar uma pagina em pdf, mas muito obrigado pela resposta, se não conseguir outra forma será esta que utilizarei.
Mano, já procurei muito mas não encontrei não, a forma melhor e mais fácil que conheço é essa biblioteca aí....
Viviane Hess
03/10/2015
Cleyton Caetano
03/10/2015
Sem falar que 50 megas não é lá muita coisa quando se fala de funcionalidade, afinal praticamente todos os serviços de hospedagem possuem planos com espaço ilimitado no disco
Viviane Hess
03/10/2015
Cleyton Caetano
03/10/2015
Nada limitado é bom kkkk
Viviane estou desenvolvendo um projeto me envia um email 📧 pra nós poder discutir sobre....
Cleyton Caetano
03/10/2015
Savio Leitão
03/10/2015
Viviane Hess
03/10/2015
Cleyton Caetano
03/10/2015
2 estudando kkkk
Viviane Hess
03/10/2015
Moisés
03/10/2015
Muito obrigado pela ajuda de todos, irei usar o mpdf por enquanto, depois se eu conseguir alguma forma substituo.
Viviane Hess
03/10/2015
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.
Marcio Araujo
03/10/2015
Moisés
03/10/2015
Moisés
03/10/2015
Cleyton Caetano
03/10/2015
Moisés
03/10/2015
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; ?>
Moisés
03/10/2015
William
03/10/2015
$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;
Felipe
03/10/2015
*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
Moisés
03/10/2015
*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.
Moisés
03/10/2015
$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.
Felipe
03/10/2015
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
Felipe
03/10/2015
[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; ?>
Felipe
03/10/2015
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; }
Moisés
03/10/2015
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; }
Cara valeu amanham eu irei tentar usar o seu como modelo.
Moisés
03/10/2015
Cara sou novo com PHP e não entendo muito bem ainda, se não for pedir muito será que vc poderia exemplo usando minha situação onde você teria pegar de uma SESSION do tipo Array que já está carregada com duas informações ID e QTD e buscar as outras informações no Banco?
No meu caso eu tenho um SESSION[orca] do tipo array, onde na mesma tenho que capturar a KEY dela que é o ID do protudo e Value que é QTD do meu produto, ou seja terei que usar os ID's ($K) que já estão na session para buscar o produto no banco.
Tentei usar outros laços para fazer isso mas não consegui!
foreach($_SESSION['orca'] as $k=>$v){ //uso para pegar a Key e o Value do Array que é minha SESSION e busco no banco de dados vai imprimindo na tela um por um.
$i = $i + 1;//Apenas um contador para saber quantos itens tenho no orçamento
$query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k"); //Busco o produto banco com onde o ID for igual $K que o id do produto selecionado pelos cliente
$linha = mysqli_fetch_assoc($query);
$descri = $linha['descri_prod'];
$subtotal = $linha['preco_prod'] * $v;
$total = $total + $subtotal;
Desde já muito obrigado pela dedicação de cada um vocês..
Felipe
03/10/2015
de noite posto alguma coisa sobre o seu código, mas pelo que ví que vc não está conseguindo fazer é buscar os dados no banco, pois para inserir no PDF nada mais é do que fazer um loop na hora de imprimir a linha:
Algoritmo:
1 - Busca os dados - (independente da forma)
2 - Define os Valores e/ou Cria funções para o calculo dos valores (não esqueça de definir um valor máximo de linhas)
3 - cria o PDF
4 - configura o arquivo CSS para o PDF
5 - desenha o cabeçalho da pagina PDF
//inicio do LOOP
6 - se (numero de linhas por pagina atingiu o máximo)
6.1 - desenha o cabeçalho da pagina PDF
6.2 - desenha a linha com os dados do banco / se preciso chama a função para calcular
7 - senao
7.1 - desenha a linha com os dados do banco / se preciso chama a função para calcular
//fim do LOOP
8 - envia o MPDF para a pagina PDF
// a variavel $mpdf é um objeto carregado com todas as variáveis e layout para a pagina PDF
A unica razão pela qual eu uso o POST é para receber a forma de ordenar os dados, pois a busca eu faço na tabela
$sql_cli = mysql_query("SELECT * FROM tb_cliente ORDER BY $ordenar $ordem" );
$busca_cli = (mysql_num_rows($sql_cli));
$cliente = mysql_fetch_array($sql_cli);
$busca_cli vai receber o numero de linhas, ou seja, quantos LOOPs devem ser feitos para inserir todas as linhas
$cliente ser a array que vai conter os dados da linha do banco
***no seu caso (veja se estou correto no meu raciocínio quanto ao teu código)
vc recupera da SESSION[orca] o ID e Quantidade
$k = $_SESSION['id'];
$v = $_SESSION['value'];
e procurar o nome do produto no banco
$query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k");
define as variaveis
$linha = mysqli_fetch_assoc($query);
$descri = $linha['descri_prod'];
$subtotal = $linha['preco_prod'] * $v;
$total = $total + $subtotal;
Agora vc vai ter que descobrir o total de itens que tem no orçamento para fazer o Loop (não sei quantos itens vc guarda na session, se é fixo ou não)
1 - manda para o objeto o cabeçalho da pagina e os valores que nao irao mudar com os itens ( nome do cliente, data, validade, endereço)
2 - inicia o Loop
3 - em cada laço do loop vc vai ter que pesquisar no banco o produto e o preço
3.1 - calcula o subtotal
3.2 - guarda em variaveis globais o total, total de itens, total de ICMS, etc. Ex:( $total += subtotal; )
4 - termina o Loop
5 - manda para o objeto os valores que faltaram, ( total geral, total de ICMS, total de itens)
6 - envia o objeto para o PDF
Moisés
03/10/2015
de noite posto alguma coisa sobre o seu código, mas pelo que ví que vc não está conseguindo fazer é buscar os dados no banco, pois para inserir no PDF nada mais é do que fazer um loop na hora de imprimir a linha:
Algoritmo:
1 - Busca os dados - (independente da forma)
2 - Define os Valores e/ou Cria funções para o calculo dos valores (não esqueça de definir um valor máximo de linhas)
3 - cria o PDF
4 - configura o arquivo CSS para o PDF
5 - desenha o cabeçalho da pagina PDF
//inicio do LOOP
6 - se (numero de linhas por pagina atingiu o máximo)
6.1 - desenha o cabeçalho da pagina PDF
6.2 - desenha a linha com os dados do banco / se preciso chama a função para calcular
7 - senao
7.1 - desenha a linha com os dados do banco / se preciso chama a função para calcular
//fim do LOOP
8 - envia o MPDF para a pagina PDF
// a variavel $mpdf é um objeto carregado com todas as variáveis e layout para a pagina PDF
A unica razão pela qual eu uso o POST é para receber a forma de ordenar os dados, pois a busca eu faço na tabela
$sql_cli = mysql_query("SELECT * FROM tb_cliente ORDER BY $ordenar $ordem" );
$busca_cli = (mysql_num_rows($sql_cli));
$cliente = mysql_fetch_array($sql_cli);
$busca_cli vai receber o numero de linhas, ou seja, quantos LOOPs devem ser feitos para inserir todas as linhas
$cliente ser a array que vai conter os dados da linha do banco
***no seu caso (veja se estou correto no meu raciocínio quanto ao teu código)
vc recupera da SESSION[orca] o ID e Quantidade
$k = $_SESSION['id'];
$v = $_SESSION['value'];
e procurar o nome do produto no banco
$query = $mysqli->query("SELECT * FROM cad_prod where id_prod = $k");
define as variaveis
$linha = mysqli_fetch_assoc($query);
$descri = $linha['descri_prod'];
$subtotal = $linha['preco_prod'] * $v;
$total = $total + $subtotal;
Agora vc vai ter que descobrir o total de itens que tem no orçamento para fazer o Loop (não sei quantos itens vc guarda na session, se é fixo ou não)
1 - manda para o objeto o cabeçalho da pagina e os valores que nao irao mudar com os itens ( nome do cliente, data, validade, endereço)
2 - inicia o Loop
3 - em cada laço do loop vc vai ter que pesquisar no banco o produto e o preço
3.1 - calcula o subtotal
3.2 - guarda em variaveis globais o total, total de itens, total de ICMS, etc. Ex:( $total += subtotal; )
4 - termina o Loop
5 - manda para o objeto os valores que faltaram, ( total geral, total de ICMS, total de itens)
6 - envia o objeto para o PDF
Felipe primeiramente muito obrigado pela sua paciência comigo até agora! Irei postar abaixo o meu código da pagina de "orcamento.php" que é que recebe os dados do produto e quem dará origem o arquivo em pdf, talvez este código ajude vc a entender melhor o que estou fazendo e assim facilite para achar uma solução.
Moisés
03/10/2015
<?php session_start(); require_once('phpconfig/conecta.php');//conecto ao banco if(isset($_POST['id'])){ $id = intval ($_POST['id']); //pego o id do produto da pagina anterior //$qtd = intval ($_POST['qtd']); //pego a Qtd também da pagina anterior geralmente este valor é um! //Aqui eu crio a sessesion orca se ela não existir! if(!isset($_SESSION['orca'])){ $_SESSION['orca'] = array(); // transformo a session em Array } if(empty($_SESSION['orca'][$id])){ // se session for vazia o id = 1. este id é a minha será o valeu que será qtd lá frente $_SESSION['orca'][$id] = 1; } else{ $_SESSION['orca'][$id] = $_SESSION['orca'][$id] + 1; // se não for vazia eu apenas adiciono mais um } }//fim isset id ?> <?php //Quando clicado no botão Alt, alterar a quantidade. if(isset($_POST["alterar_newqtd"])){ $valor = intval($_POST["newqtd"]); $id_produto = intval($_POST["alterar_newqtd"]); echo $valor; //Se carrinho estiver vazio if(!empty($_SESSION["orca"]["$id_produto"])){ $_SESSION["orca"]["$id_produto"] = $valor ; } } //Quando clica em deletar produto if(isset($_POST["del_produto"])){ $id_produto = intval($_POST["del_produto"]); if(isset($_POST["del_produto"])){ unset ($_SESSION["orca"]["$id_produto"]); } } //Se clicar em limpar carrinho if(isset($_GET["ac"]) == "limpar"){ unset ($_SESSION["orca"]); } ?> <?php //Verifica se há produtos no Orçamento se não houver mostra uma mensagem na tela. if(empty($_SESSION['orca'])){ echo"Não Produtos no seu orçamento!</br> <a href='produto.php'>Adicionar Prodtutos</a></td>"; } //Se houver motre tudo abaixo até o fim da pagina. else{ ?> <br/> <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> <td width="30">Del.</td> </tr> <?php $total = 0; $i = 0; foreach($_SESSION['orca'] as $k=>$v){// aki eu extrair o key e value da session $i = $i + 1; ?> <form action="" method="post"/> <?php $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"> <input type="number" name="newqtd" value="<?php echo $v; ?>" min="1" max="999"/><?php echo " ". $descri; ?> </td> <td width="15"><input id="alterar_newqtd" type="image" name="alterar_newqtd" value="<?php echo $linha['id_prod']; ?>" src="img/ilustracao/refresh.png"/></td> <td><?php echo "R$ " .$linha['preco_prod']; ?> </td> <td><?php echo "R$ ". number_format ($subtotal,2,",","."); ?></td> <td> <input name="del_produto" id="del_produto" type="image" value="<?php echo $linha['id_prod'];?>" src="img/ilustracao/delete.png" width="25px" height="25px"/> </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> <tr> <td colspan="7"> </td> </tr> <tr> <td colspan="3"> <a id="voltar" href="produto.php">Continuar comprando</a> </td> <td>|</td> <td colspan="3"> <a id="limpar" href="?ac=limpar">Limpar Orçamento</a> </tr> </tr> </table> <?php }?><!-- fim do if que verifica se há produto no carrinho-->
Felipe
03/10/2015
vou ter que fazer umas modificaçoes aqui para poder rodar este código.
minha pergunta é: voce esta conseguindo listar todos os produtos em tela com este código?
se sim,
o que vamos ter que fazer é:
*adicionar um link <a href="endereco_pagina_pdf">GERAR PDF</a>
*na pagina PDF vc vai ter que fazer o mesmo Loop que está fazendo para mostrar na tela (nunca usei foreach para imprimir no PDF, vou ter que testar aqui)
* desenha a tabela da mesma forma que está desenhando em tela
<?php // Cria o PDF $mpdf=new mPDF(); $mpdf->charset_in='windows-1252'; $mpdf->SetDisplayMode('fullpage'); $css = file_get_contents("css/estilo_relatorio.css"); $mpdf->WriteHTML($css,1); $parte1 = ' <table border=1> <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> <td width="30">Del.</td> </tr> </table>'; $mpdf ->WriteHtml($parte1); // envia a primeira parte //inicio do Loop $parte2= ''; // desenha outra tabela com celulas de mesmo tamanho das da tabela anterior e faça como foi feito para listar a pagina anterior $mpdf->WriteHTML($parte2); // ou utilize $mpdf->WriteCell para criar celula por celula e $mpdf->Ln(); para pula uma linha //fim do loop $mpdf->Output("carrinho.pdf","I"); ?>
vou testar o seu codigo, mas vai ficar para amanhã, hoje tenho que entregar um trabalho e nao vou ter tempo
Moisés
03/10/2015
vou ter que fazer umas modificaçoes aqui para poder rodar este código.
minha pergunta é: voce esta conseguindo listar todos os produtos em tela com este código?
se sim,
o que vamos ter que fazer é:
*adicionar um link <a href="endereco_pagina_pdf">GERAR PDF</a>
*na pagina PDF vc vai ter que fazer o mesmo Loop que está fazendo para mostrar na tela (nunca usei foreach para imprimir no PDF, vou ter que testar aqui)
* desenha a tabela da mesma forma que está desenhando em tela
<?php // Cria o PDF $mpdf=new mPDF(); $mpdf->charset_in='windows-1252'; $mpdf->SetDisplayMode('fullpage'); $css = file_get_contents("css/estilo_relatorio.css"); $mpdf->WriteHTML($css,1); $parte1 = ' <table border=1> <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> <td width="30">Del.</td> </tr> </table>'; $mpdf ->WriteHtml($parte1); // envia a primeira parte //inicio do Loop $parte2= ''; // desenha outra tabela com celulas de mesmo tamanho das da tabela anterior e faça como foi feito para listar a pagina anterior $mpdf->WriteHTML($parte2); // ou utilize $mpdf->WriteCell para criar celula por celula e $mpdf->Ln(); para pula uma linha //fim do loop $mpdf->Output("carrinho.pdf","I"); ?>
vou testar o seu codigo, mas vai ficar para amanhã, hoje tenho que entregar um trabalho e nao vou ter tempo
Felipe estou conseguindo sim listar todos os produtos com o Código que postei caso vc queira ver na pratica com está eu hospedei o está pagina para teste no seguinte endereço: http://manafestas.esy.es/orcamento.php
Felipe
03/10/2015
altere conforme precisar, eu sugiro usar assim:
id | qtd
1 | 10
2 | 20
<?php include("mpdf60/mpdf.php"); session_start(); $_SESSION['matriz'] = array(); //inserindo dados na session $_SESSION['matriz']['id'][] = "1"; $_SESSION['matriz']['prod'][] = "produto1"; $_SESSION['matriz']['qtd'][] = "10"; $_SESSION['matriz']['preco'][] = "1.00"; $_SESSION['matriz']['id'][] = "2"; $_SESSION['matriz']['prod'][] = "produto2"; $_SESSION['matriz']['qtd'][] = "20"; $_SESSION['matriz']['preco'][] = "2.00"; $_SESSION['matriz']['id'][] = "3"; $_SESSION['matriz']['prod'][] = "produto3"; $_SESSION['matriz']['qtd'][] = "30"; $_SESSION['matriz']['preco'][] = "3.00"; $i = sizeof($_SESSION['vetor'],1) -4;// a quantidade de itens menos a quantidade de indices // tanto a função sizeof quanto a count retorna todos os valores do array bidimensional inclusive os indices id, prod, qtd e preco por isso o -4 //sabendo o tamanho do array basta fazer o loop //pode usar o FOR //pode usar o While, não esqueça de fazer uma variavel $cont=0 antes do laço e dentro fazer $cont++ //pode usar o do{}while, nao esqueça de faze-lo dentro de um if para ver se o array nao esta vazio senao vai retornar erro, pois ao contrario de while() primeiro ele faz e depois verifica //pode usar o foreach $mpdf=new mPDF(); $mpdf->charset_in='windows-1252'; $mpdf->SetDisplayMode('fullpage'); $css = file_get_contents("css/estilo_relatorio.css"); $mpdf->WriteHTML($css,1); $mpdf->SetTitle("Criando PDF");//titulo da pagina $mpdf->SetHeader('Página 1');//cria o cabeçalho $mpdf->AddPage('A4','L');// Add a pagina A4 em modo paisagem //desenhando o titulo $mpdf->SetFont('sans-serif', 'B', 8); $mpdf->WriteCell(10,5,"ID",1,0,'C'); $mpdf->WriteCell(30,5,"PRODUTO",1,0,'C'); $mpdf->WriteCell(10,5,"QTD",1,0,'C'); $mpdf->WriteCell(20,5,"PRECO",1,0,'C'); $mpdf->Ln(6);//pula uma linha, o valor dentro do parenteses é a distancia $cont = 0; $total = 0; $produtos = 0; //inicio do loop while while($cont<($i/4)){// tamanho do array dividido pela quantidade de indices $mpdf->SetFont('sans-serif', '', 8); $mpdf->WriteCell(10,3,$_SESSION['matriz']['id'][$cont],0,0,'C'); $mpdf->WriteCell(30,3,$_SESSION['matriz']['prod'][$cont],0,0,'C'); $mpdf->WriteCell(10,3,$_SESSION['matriz']['qtd'][$cont],0,0,'C'); $mpdf->WriteCell(20,3,$_SESSION['matriz']['preco'][$cont],0,0,'C'); $total += $_SESSION['matriz']['preco'][$cont]; $produtos += $_SESSION['matriz']['qtd'][$cont]; $mpdf->Ln(6);//pula uma linha, o valor dentro do parenteses é a distancia $cont++; }//fim while $mpdf->SetFont('sans-serif', 'B', 8); $mpdf->WriteCell(40,5,"SUBTOTAL",1,0,'C'); $mpdf->WriteCell(10,5,utf8_encode($produtos),1,0,'C'); $mpdf->WriteCell(20,5,utf8_encode($total),1,0,'C'); // Output("orcamento.pdf","F"); ---- apenas salva o PDF e nao exibe // Output("orcamento.pdf","D"); ---- disponibiliza o PDF para download // Output("orcamento.pdf","I"); ---- exibe o PDF e nao salva $mpdf->Output("orcamento.pdf","I"); ?>
Marcio Araujo
03/10/2015
Felipe
03/10/2015
Felipe
03/10/2015
Conseguiu Márcio Araujo?
sairá o seguinte resultado:
[img]http://arquivo.devmedia.com.br/forum/imagem/458083-20151021-235659.png[/img]
Moisés
03/10/2015
Obs.: o PDF já estou gerando com o dados o problema é apenas os caracteres.
Felipe
03/10/2015
Obs.: o PDF já estou gerando com o dados o problema é apenas os caracteres.
Moisés!
realmente essa parte de acentos eh bem complicadinha...
nas variaveis que vc vai escrever com WriteHtml em vez de saída vc vai escrever sa& iacute ;da
nas palavras que vc pega do Banco vc usa a função utf8_encode() //eu uso o banco utf8_swedish_ci e também dá problema, precisa usar essa função mesmo
nas palavras que vc vai escrever direto no campo como por exmplo $mpdf->WriteCell(20,5,"PREÇO",1,0,'C'); pode ser normal mesmo
se precisar de mais alguma coisa avisa aí..
Moisés
03/10/2015
<!doctype html> <html lang="pt-br"> <head> <meta charset="utf-8"> <title>PDF</title> </head> <body> <?php session_start(); include("mpdf60/mpdf.php"); include("phpconfig/conecta.php"); $total = 0; $i = 0; $sp_ant = 1; $date = date('d/m/Y');// busca a data $hora = date('H:i'); // busca a hora $qtd_prod = 0; $value_zeb = false;// inicialização do zebrado da linha, false inicia em branco true inicia em cinza $row = 0; // Cria o PDF $mpdf = new mPDF(); $mpdf->SetDisplayMode('fullpage'); $css = file_get_contents("css/pdf.css"); $mpdf->WriteHTML($css,1); $mpdf->SetTitle($titulo);//define o tiiulo da pagina --- este será exibido na aba da janela /*foreach($_SESSION['orca'] as $k){ $count = $mysqli->query("SELECT COUNT(*) FROM cad_prod where id_prod = $k"); $row = mysqli_num_rows($count); $qtd_prod+=$row; }*/ $mpdf->SetHeader('<div class="direita">Data e hora de emisão: '.$date.' --- '.$hora.'</div>');//cria o cabeçalho $mpdf->SetHTMLFooter('<hr></hr> Atenção: *Os valores citados acima são válidos apenas enquanto durarem os nossos estoques!');// cria o rodapé $mpdf->AddPage('A4','L'); $logo = '<img src= "img/ilustracao/logolaranja.png"/>'; $html = '<h3>Orçamento de Produtos para Simples Conferência</h3><br/><br/>'; $mpdf->WriteHTML($logo.$html); $mpdf->WriteCell(10,$sp_ant,'Item',0, 0, 'C'); $mpdf->WriteCell(130,$sp_ant,'Produto',0, 0, 'C'); $mpdf->WriteCell(20,$sp_ant,'Qtd',0, 0, 'C'); $mpdf->WriteCell(20,$sp_ant,'Descri.',0, 0, 'C'); $mpdf->WriteCell(40,$sp_ant,'Vl. Unit.',0, 0, 'C'); $mpdf->WriteCell(40,$sp_ant,'Subtotal',0, 0, 'C'); $mpdf->Ln($sp_ant); $mpdf->WriteHTML('<hr></hr>'); $mpdf->Ln($sp_ant); //inicio do Loop 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); $nome = $linha["nome_prod"]; $descri = $linha["descri_prod"]; $preco = $linha["preco_prod"]; $subtotal = $preco * $v; $total = $total + $subtotal; // desenha zebrado if (!$value_zeb){ $mpdf->SetFillColor(255,255,255); $value_zeb = true ; } else { $mpdf->SetFillColor(225,225,225); $value_zeb = false ; } $mpdf->SetX(20); $mpdf->Cell(260,5, '',0,0,'L',true); $mpdf->SetX(20); $i = utf8_encode($i++); $nome = $linha["nome_prod"]; $descri = $linha["descri_prod"]; $qtd = utf8_encode($v); $preco = $linha["preco_prod"]; $mpdf->Ln(3); $mpdf->WriteCell(10,$sp_ant,$i, 0, 0, 'C'); $mpdf->WriteCell(130,$sp_ant,$nome, 0, 0, 'L'); $mpdf->WriteCell(20,$sp_ant,$qtd,0, 0, 'C'); $mpdf->WriteCell(20,$sp_ant,$descri, 0, 0, 'C'); $mpdf->WriteCell(15,$sp_ant,'R$: ',0, 0, 'R'); $mpdf->WriteCell(30,$sp_ant,number_format ($preco,2,",","."), 0, 0, 'L'); $mpdf->WriteCell(15,$sp_ant,'R$: ',0, 0, 'R'); $mpdf->WriteCell(30,$sp_ant,number_format ($subtotal,2,",","."), 0, 0, 'L'); $mpdf->Ln(3); }// fim do forech $mpdf->WriteHTML('<hr></hr>'); $mpdf->WriteCell(10,$sp_ant,'', 0, 0, 'L'); $mpdf->WriteCell(130,$sp_ant,'', 0, 0, 'C'); $mpdf->WriteCell(40,$sp_ant,'',0, 0, 'C'); $mpdf->WriteCell(40,$sp_ant,'Total à Pagar', 0, 0, 'C'); $mpdf->WriteCell(15,$sp_ant,'R$: ',0, 0, 'R'); $mpdf->WriteCell(40,$sp_ant,number_format ($total,2,",","."), 0, 0, 'L'); $mpdf->Ln(1); $mpdf->Output("pdf.php","I"); exit; ?> </body> </html>
Podem encerrar o tópico pois o este caso está resolvido! Felipe você nota 10 Cara valeu mesmo!!!
Marcio Araujo
03/10/2015
Moisés
03/10/2015
Sim, Marcio o código está funcionando normalmente, caso alguém precise testar bastar alimentar a SESSION[orca].