Publicado por: diogobesson | 28/12/2009

mPDF PHP e PDF

Este Post mudou para: http://diogobesson.com.br/1/mpdf-php-e-pdf/

Mais ou menos por volta do dia 21/12, eu estive conversando sobre a geração de documentos portáteis (PDF) com o sr. Janes Roberto da Costa, analista de sistemas da Secretaria de Estado de Educação de Mato Grosso.

Ele comentou que possuía uma experiência significativa com uma classe em PHP chamada mPDF que poderia ser a solução da maioria dos problemas comuns e avançados na geração de PDF para a web.

Assim fomos discutindo e, com alguns exemplos que ele me forneceu, consegui desvendar o funcionamento da classe. Aproveito para compartilhar com vocês alguns desses assuntos neste weblog.

Primeiramente, faça o download da classe.

Os arquivos para download estão em http://mpdf.bpm1.com/download . Este é o website oficial do mPDF.

Sugiro que faça o download do pacote de Core do mPDF e também das Fontes Extras para um melhor aproveitamento futuro, porém somente o Core é realmente necessário para utilizar a classe.

A versão atual do pacote no momento de elaboração deste artigo é a 4.1.1

Já baixei. E agora?

Descompacte o pacote do Core. Se você baixou também as fontes extras, descomprima-as dentro da pasta /unifont/ da estrutura do Core.

Essa pasta com todos os arquivos do Core, que aqui ficou com o nome de /MPDF411/ possui toda a estrutura utilizada pela classe principal (mpdf.php) e deve ser acessível pelo seu sistema web.

No meu modo de ver, não estando trabalhando com MVC, o ideal é que ela fique localizada na raiz do seu sistema ou em uma pasta de trabalho de classes de terceiros, portanto, se você tem uma intranet e a pasta raiz se chama /intranet/, poderá instalar o Core dentro de /intranet/MPDF411/ ou intranet/classes/MPDF411/, porém isso fica a critério livre, lembrando que é muito importante apenas que os arquivos e a estrutura de pastas de dentro da pasta do Core não sejam de maneira alguma modificados.

O manual diz também que você deve certificar-se de obter permissão de escrita na pasta raiz da classe e na pasta de trabalho /graph_cache/

Para ter certeza de que tudo foi feito conforme os trâmites convencionais, vá no browser até a pasta /examples/ da sua instalação e rode o arquivo index.php. Ele contém uma série de exemplos que também servem de testes de funcionamento. Lá você pode obter informações de debug e consertar algumas particularidades como fontes que estão faltando, outras permissões necessárias e etc.

Alo Mundo com mPDF

Vamos então fazer um alô mundo pra começar a brincar com o mPDF

define('MPDF_PATH', 'classes/mpdf411/');
include(MPDF_PATH.'mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('Alo Mundo');
$mpdf->Output();
exit();

Bem simples, não?

Na primeira linha você define o caminho da classe e na segunda você inclui.

Na terceira você cria um objeto mPDF

Na quarta você escreve o HTML diretamente no seu arquivo PDF, lembrando que ele só aceita UTF-8, por isso, caso você queira escrever “Alô Mundo”, terá que fazer algo do tipo $mpdf->WriteHTML(utf8_encode(“<p>Alô Mundo</p>’”)); , ok?

As outras duas linhas que seguem são a apresentação do que foi montado via WriteHTML().

Muito fácil.

Vamos avançar um pouco mais

Você pode montar o HTML separadamente e incluir TUDO com WriteHTML() via buffer, usando ob_start().

Vamos testar?

<?php
ob_start();  //inicia o buffer
?>

<b>Um Html Qualquer</b>
<h1>Título</h1>
<p>Funciona!!! </p>

<?php
$html = ob_get_clean();
// pega o conteudo do buffer, insere na variavel e limpa a memória

$html = utf8_encode($html);
// converte o conteudo para uft-8

define('MPDF_PATH', 'classes/mpdf411/');
include(MPDF_PATH.'mpdf.php');
// inclui a classe

$mpdf = new mPDF();
// cria o objeto

$mpdf->allow_charset_conversion=true;
// permite a conversao (opcional)
$mpdf->charset_in='UTF-8';
// converte todo o PDF para utf-8

$mpdf->WriteHTML($html);
// escreve definitivamente o conteudo no PDF

$mpdf->Output();
// imprime

exit();
// finaliza o codigo

?>

Isso é um pouco mais complicado, porém nada tão assustador assim.

E isso dá margem para várias outras coisas

Você pode bufferizar por exemplo, o resultado de uma consulta do banco de dados, assim seu PDF terá um conteúdo dinâmico.

O sr. Janes havia me fornecido um exemplo com uma consulta bem completa e o PDF gerado tinha o valor de relatório formatado para saída de impressora, mas isso não foi o mais impressionante.

Percebi que, além de incluir as imagens que eram linkadas no html gerado, o relatório tinha o poder de interpretar as folhas de estilo CSS.

Ele fez a seguinte mágica:

<?php
session_start();
header("Content-type: text/html; charset=iso-8859-1");
ob_start(); // Inicia o fluxo
?>

<!-- tables, DIVs, consultas no banco de dados, blablabla, imagens e todo o conteudo PHP com HTML -->

<?php
ob_end_clean(); // Finaliza o fluxo
define('_MPDF_PATH', 'classes/mpdf411/');
include(_MPDF_PATH.'mpdf.php');

// cria um novo container PDF no formato A4 com orientação customizada
$mpdf=new mPDF('pt','A4',3,'',8,8,5,14,9,9,'P');

// muda o charset para aceitar caracteres acentuados iso 8859-1 utilizados por mim no banco de dados e na geracao do conteudo PHP com HTML
$mpdf->allow_charset_conversion=true;
$mpdf->charset_in='iso-8859-1';

//Algumas configurações do PDF
$mpdf->SetDisplayMode('fullpage');
// modo de visualização
$mpdf->SetFooter('{DATE j/m/Y&nbsp; H:i}|{PAGENO}/{nb}|SEDUC / SIGETI');
//bacana este rodape, nao eh mesmo?

// carrega uma folha de estilo - MAGICA!!!
$stylesheet = file_get_contents('./stylesheets/estilosPDF.css');

// incorpora a folha de estilo ao PDF
// O parâmetro 1 diz que este é um css/style e deverá ser interpretado como tal
$mpdf->WriteHTML($stylesheet,1);

// incorpora o corpo ao PDF na posição 2 e deverá ser interpretado como footage. Todo footage é posicao 2 ou 0(padrão).
$mpdf->WriteHTML($html,2);

// define um nome para o arquivo PDF
$arquivo = date("ymdhis").'_projeto_li.pdf';

// gera o relatório
$mpdf->Output($arquivo,'D');

exit();

?>

chorei… Muito bom mesmo!

Quem quiser se aprofundar ainda mais, pode dar uma olhada no Manual do mPDF, que é bem completo e cheio de truques.

Agradeço ao Janes pela dica e vamos continuar estudando essa classe para aprender mais novidades.

um abraço e até a próxima.


Respostas

  1. [...] http://diogobesson.wordpress.com/2009/12/28/mpdf-php-e-pdf/ [...]

    • Cara,
      Gostei do post mas não consegui fazer nada funcionar aqui, sou bem leigo no assunto. Vou te falar oq fiz:
      baixei o pacote Core do mPDF (criou a pasta MPDF411) e as fontes, queria ver como funcionava e coloquei dentro do servidor essa pasta e tentei rodar o exemplo na qual vc se refere neste post (MPDF411/examples/index.php), porém quando clico nos links de exemplos, nada acontece.
      por favor, você poderia me ajudar???

      Grato,

      Ricardo

  2. Excelente post.

    • Valeu pela visita ao blog, Daniel!
      Esse mPDF é um barato, mesmo.
      abraço!

  3. [...] dompdf, busquei alguma outra solução. Para minha sorte, encontrei um post do Diogo Besson “mPDF PHP e PDF” que fala sobre a biblioteca [...]

  4. [...] http://diogobesson.wordpress.com/2009/12/28/mpdf-php-e-pdf/ Categories: PHP Tags: mPDF, pdf, PHP Comentários (0) Trackbacks (0) Deixar um comentário Trackback [...]

  5. Bom dia Diogo…
    Sou iniciante em php… e estou tentando gerar um pdf…
    O sistema gera uma página html e salva em uma pasta temporária e passava o endereço desta e era gerado o pdf, eu estava usando dompdf…
    agora com o mPdf não estou conseguindo, ele gera o pdf e mostra porém não carrega as informações…
    tem como me dar uma mãozinha?

    • Vilson, te mandei um email
      Deu certo ai?
      abraço!

      • Sou iniciante em php, estou com o mesmo problema do Vilson, ele gera o pdf e mostra, porem não carrega as informações (abre uma pagina em branco, aparece apenas o rodapé), pode me ajudar?

      • Salve Inácio!

        Hj estou me sentindo o Bozo! (http://www.bozometro.com.br) Deve ser pq fiz aniversário dia 25 e ainda sinto reflexos dos meus 28 anos de experiência… risos!
        Fico feliz em saber que o php tá bem cotado! Já estamos com mais de 1200 visitas a este único post.

        Sobre o problema, eu tenho algumas perguntas a fazer, tanto a você como a outros visitantes que constantemente estão me enviando as mesmíssimas dúvidas recorrentes e repetitivas, que podem auxiliar bastante no processo do “aprendizado” e da “debugagem”:

        1-) O mais importante de todos, principalmente se você é mesmo um iniciante na linguagem: Leu as outras dúvidas e as outras respostas? Procurou casos parecidos no google? O processo de “fuçar” na internet é o que faz de você um pesquisador competente. Mostra interesse, independência, vontade de construir uma opinião própria e um perfil de iniciativa que chama a atenção dos colegas da área!
        2-) O mais comum de todos, que acontece a todo momento no caso de “páginas em branco”: Tentou codificar convertendo para utf8? é tão fácil… $html = utf8_encode($html); só isso!!!!
        3-) O mais absurdo de todos: Ajustou a memória? às vezes seu relatório tem tantas páginas que o servidor abre o bico e não avisa… Lembra que eu tive que alocar DOIS GIGAS pra um relatório de 22 páginas? um lixo!!!
        4-) O mais desesperador de todos: Simplificou o código realizando testes sem css, tabelas, divs, imagens e etc? Conselho do mestre Albano Mouta: “Simplicidade é tudo”.
        5-) O mais barulhento de todos: Procurou ajuda no grupo de discussão PHP Google? Nossa comunidade, junto com os Jedis, é uma das mais colaborativas de todas. Aproveite essa oportunidade que a humanidade te oferece.

        Caso nenhuma dessas coisas ajude, sugiro a leitura da documentação que encontra-se no site do mPDF e, em último caso, a contratação de uma consultoria de alguém que seja mais familiarizado à essa classe do que eu, pois meus conhecimentos não serão suficientes pra isso :)

        abraço!
        Dio
        .

  6. Funcionou perfeitamente!!

    Obrigado pela dica!!!

    • Eu que agradeço, Niler!
      volte sempre.
      abraço!

  7. cara baixei a versão atual mPDF44 e a partir dai nao precisa baixar o core né?

  8. ta dando esse erro

    sabe o que ta dando errado

    Fatal error: Call to undefined function: iconv() in /home/cmcarati/public_html/mpdf44/mpdf.php on line 11495

  9. to tetando usar na minha maquina com servidor startado e ta dando esse erro

    Error – mPDF requires mb_string functions. Ensure that PHP is compiled with php_mbstring.dll enabled.

    issu pode ter aver com o que ocorre no servidor real?

    me ajude por favor

    • vc deve observar se os módulos requiridos estão ativos no php.ini

  10. onde coloco a versão core do mpdf44, pois as fonts vc disse unicode e o core?

  11. Diogo
    Parabéns pelo blog e pelo post, o mPdf eh excelente, funcionou perfeitamente no meu ambiente de desenvolvimento, mas está aparcendo uns problemas de formatação no ambiente final do sistema, o meu relatorio ficou comprimido no lado esquerdo do arquivo pdf gerado. Tem alguma deia de como sanar isso?

    Obrigado desde já

    • Olá Jefferson,

      Me parece que isso tem a ver com a formatação do layout mesmo.
      Teve uma vez que um amigo estava com um problema parecido e qdo ele montou uma versão sem CSS funcionou melhor, sem problemas de margens.
      Tenta aí e depois me conta pra eu dar um toque no meu amigo tb.

      abraço!

      • Obrigado pela dica!
        Consegui resolver o problema tirando o width=”100%” da table. Infelizmente o pdf gerado não está pegando nenhuma formatação css via tag style

        Vlw

      • Resolvi tb!
        O mais chato é que o problema só acontece no servidor definitivo. Quando o css possue referencia a #id o mpdf n está identificando.. então formatei o relatorio pela tags mesmo

  12. Show de bola esta dica. Parabéns.
    Estava atras de algo simples e eficiente
    e garimpando no google cai aqui e muito
    bom. fácil instalação e funcionou 100%.
    O mais legal é que o mpdf é recheado de
    recursos, é só ver os exemplos.
    Abraços a todos.

  13. Diogo, tudo massa agora com este seu post. Mas eu estou com uma bronca que queria saber se você ou alguem saberia. Estou com uma TABLE, que o mPDF não consegue quebra-la e por em 2 folhas. Ele diminui para caber, mas essa forma não é a minha desejada. Vc que sabe mais do mPDF, ja viu algum caso assim.?? Sabes como resolver????

    • Valeu Diogo, mas já consegui reolver o problema.
      Foi só a formatação da tabela…

    • Opa. Fico feliz, Nolram.
      Às vezes é complicado pra eu responder as mensagens.
      Acabo tendo que criar em meu micro um ambiente parecido com o seu (imaginando da minha cabeça doida como seria…) pra reproduzir o mesmo problema em casa e tentar responder. Isso demora um bocado e o tempo está curto.
      A correria dos dias não me permitiu dessa vez. Desculpa se fiquei te devendo essa. :)
      Sugiro ao pessoal que tiver dúvidas que necessitem de uma emulação, que entrem no grupo de php do google pra gente discutir melhor. Lá tem phpstas profissionais com milhões de anos de linguagem que podem ajudar tb.
      O link da lista é: http://groups.google.com.br/group/listaphp?hl=pt-BR
      Leiam as regras e façam o subscribe.
      Um abraço a todos.

  14. Bom dia Diogo,
    Sou iniciante em php e nunca gerei um pdf na minha vida!
    Tenho testado outras bibliotecas que geram o pdf, so que em branco, e a mpdf nem isso ela da erro de memoria, mas e outro detalhe…
    você pode me ajudar?

    Desde ja, muito obrigada

    • Oi Lusyana, qual a mensagem de erro e em qual momento ela se dá?

      • Diogo, Cada hora aparece uma coisa…
        Todas as mensagens a respeito da conf. do PHP. Até ai td bm, meu problema é que com alguns dos métodos que usei, o pdf fica em branco e com outros ele nem chega a gerar o arquivo.

        O fato é que preciso converter os relatórios rápido, a quantidade de dado que trafega é muito grande, então nem sei por onde começar denovo, ja que todas as bibliotecas que tentei nao deram o resultado esperado.

        Voce pode me ajudar?

      • Olá, Luzyana e outros colegas que me enviaram email solicitando ajuda,

        Tem duas coisas:

        Uma é que o mPDF come uma memória absurda do servidor. Como vc disse que a quantidade de dados é muito grande, talvez seja melhor repensar se a geração de um PDF é mesmo a melhor solução.

        Pra vc ter uma idéia, pra gerar um PDF simples com 20 páginas aqui, eu tive que usar a função ini_set(“memory_limit”,”1G”); , ou seja, aumentar o limite de memória pra UM GIGA!

        Na minha situação, qualquer coisa acima disso seria inviável, pois meu servidor é compartilhado com outras aplicações e às vezes qdo a gente puxa o cobertor pra cobrir a cabeça, acaba descobrindo a b… To errado?! Jamais sacrificaria aplicações que já estão funcionando corretamente para atender a uma vaidade de requisito de quem quer que seja.

        Dois é que na utilização do mPDF eu recomendo que SIMPLIFIQUE O MÁXIMO POSSÍVEL.

        Quando a coisa dá errado, é hora de limar as imagens, o css e qualquer outra FIRULA que possa deixar o relatório mais bonitinho.

        Lembre-se que isso aqui é web e existem limitações de web para uso de web.

        É tentativa, erro e acerto:
        Deu errado? Use utf8_encode().
        Deu errado? Arranca o css.
        Deu errado? Arranca as divs.
        Deu errado? Arranca as opções de dentro das tags.

        Não desafie o difícil antes de ter tentado o fácil.

        Só mais uma coisa. Eu SEMPRE falo aqui da lista de PHP do Google e nunca vi ninguem que assina esse blog por lá.
        Então, entrem!
        http://groups.google.com/group/listaphp

        um abraço,

        Diogo Besson
        .

  15. Grande Diogo! Cara ha uns 3 meses que procuro uma biblioteca que realmente funcione atendendo as minhas necessidades. Pelo que vi no post, essa deve me servir (vou testar). Ja utilizei uma porrada de biblioteca e todas demoram muito na conversão do html para pdf. me envia um email para trocar-mos ideias. abs.

  16. Hey! Quem aqui já ouviu falar em AGATA REPORT ?

    http://www.agata.org.br/

  17. Olá Diogo,

    Já utilizo esta classe desde 2009, porém tive que fazer atualização do meu sistema, e houve a necessidade de no meio do arquivo colocar algumas imagens, até aí tudo bem. No entanto, notei que quando a imagem é grande (largura x altura) o PDF não é gerado, vc já passou por algo semelhante?

    • cara… Segundo o site, o mPDF tem as seguintes limitações:

      - Script mais lento que o original FPDF e html2fpsf por causa do unicode.
      - Dimensões somente em milimetros para margens e tamanho de páginas, embora o css possa usar unidades
      - DIV, P (tags de bloco de um modo geral) e listas dentro de tabelas são suportadas, mas somente em partes… Se você quer alguma coisa muito diferente da tag limpa, geralmente para de funcionar
      - Blocos definidos como posição absolute, fixed e float também possuem o mesmo problema… Qualquer frescurinha a mais e tudo para de funcionar.

      Não conheço nenhuma limitação com imagens – até porque não tenho usado o mPDF com frequencia -, mas creio que se a coisa pára de funcionar pode ser devido a 2 problemas comuns: limitações conhecidas ou memória do servidor, como observei nos comentários anteriores.

      abraço!

  18. Olá, cara muiiito boa essa classe, salvou a patria…

    mas vlw mesmo digo por disponibilizar essa informação conosco..
    abraços…

    • Eu é que agradeço a tua visita neste blog tão (mal) atualizado. risos.
      To há umas 3 semanas querendo colocar aqui um estudo de caso e não consigo tempo…
      Valeu, camarada! Volte em breve e volte sempre.
      abraço!!!

  19. Tem exemplo pra qm utiliza MVC??

    • Olá Ariane,
      Desculpe, mas vou ficar te devendo essa

      • ta me devendo essa.. me devendo o cachorro..
        mas td bem ehheheh
        obrigada.

      • :D
        Encontraram dois filhotinhos de viralatas abandonados aqui na empresa. Vou encaminhar as fotos para seu email.
        Eles estão procurando um lar e vivem dizendo: “Ariane, me adote, por favoooor =0.0= ”
        hehehe
        =*

  20. Diogo,
    Baixei o codigom instalei, os exemplos funcionam.
    Mas os códigos que vc colocou só o Alô Mundo funciona, o próximo, que eu mais preciso, não funciona de jeito de nehum. Me ajuda!!!
    Obrigada,
    Ana Paula

    • Oi Ana Paula,

      Você deve considerar um desconto aos códigos de exemplo, pois eles foram feitos bem antes de 28/12/2009. A versão do MPF deve ter mudado e isso pode gerar algumas incompatibilidades e imprevistos.

      Além de não estar mais trabalhando com ele há quase um ano, não sou desenvolvedor nem sponsor desse código, por isso às vezes fico por fora das novidades.

      No mais, diga-me qual é o erro que está dando pra vc e tentaremos ajudar aqui do serviço no que for possível.

      Outra dica (novamente…) é entrar no “LISTA PHP GOOGLE” (http://groups.google.com/group/listaphp?hl=pt-BR) e jogar a dúvida no fórum. É um lugar excelente pra fazer amigos, contatos profissionais e dedilhar códigos interessantes.

      um abraço!

  21. Oi Diogo, antes não aparecia nem msg de erro, mas agora aparece essa “mPDF error: Some data has already been output to browser, can’t send PDF file”.

    Obrigada.

  22. Olá Diogo, acho que estou usando o mpdf de forma errada… pois, queria usá-lo para gerar um PDF do artigo que está sendo lido, sem ter que criar dois arquivos, um para o ler e outro para gerar o pdf do artigo. Mas parece que ele não aceita isso. Obrigada.

    • Ah sim, Ana! Com certeza!!!
      Para utilizar essa classe, você deve ter um arquivo separado justamente para a geração do pdf.
      Como a Ariane havia comentado, esta seria a parte view do seu sistema, que, inevitavelmente, se misturaria com uma boa parte de programação bruta… Um probleminha chato pra quem gosta de ARQUITETURA de software.
      =*

  23. vc já utilizou com .classname???
    se sim manda um exemplo q eu to me quebrando aqui

  24. Olá Diogo, voltei…rs
    Bom, agora estou utilizando o mPDF para gerar relatórios. Porém são todos de consulta ao banco, mas o PDF gerado sai em branco. Poderia ajudar?
    Obrigada.

    • geralmente é problema de encode… vc tem que passar tudo pra UTF8 e deixar a apresentação mais simples possível. Comece eliminando css, imagens e etc e depois vá acrescentando as estruturas complicadas aos poucos para ver o que está comprometendo a geração. No mais, creio que o utf8_encode() já vai te ajudar.

  25. Estou usando igual ao seu exemplo:

    $mpdf->allow_charset_conversion=true;
    $mpdf->charset_in=’iso-8859-1′;

    Não é isso?

    • Na versão 4.1.1 funcionava através do uso de fluxo. Como o mPDF já está na 4.6, não creio que seja totalmente igual.

      Mas, de qualquer forma, acho que vc deve tentar passar tudo pra utf8 pra ver se funciona independentemente do charset do pdf que vc quer gerar.

      depois do buffer, vc guarda o conteúdo numa variável html, lembra?
      (pega o conteudo do buffer, insere na variavel e limpa a memória)
      $html = ob_get_clean();

      após guardar, vc tem que encodar pra utf8:
      $html = utf8_encode($html);

      se der problema de acentuação, aí já é outra história… teríamos que ler a documentação e ver o que dá pra ser feito.

      Em problemas assim, simplificar é sempre a melhor maneira de encontrar a falha. Meu mestre Albano Mouta diria que “simplicidade é tudo” e a cada dia que passa eu vejo mais verdade nessa ilação.
      :)

  26. Boa tarde!

    Estou usando o mPDF, e tenho algumas duvidas:

    – Quando baixo o PDF, ele vem “corrompido”, dando a mensagem “Format erro: not a PDF or corrupted”

    – Preciso gerar esse PDF (com conteúdo dinâmico) e envia-lo por e-mail. Teria algum exemplo? Ou sabe se isso é possível?

    Grato desde já,

    Oswaldo Acauan

    • primeira dúvida (é claro): alguma coisa está impedindo o pdf de ser formatado corretamente e isso pode incluir zilhões de variáveis… debuga a geração e vc vai encontrar o problema.

      segunda duvida: gera o pdf, salva ele numa pasta do servidor, anexa ele à uma mensagem e envie! não tem segredo ¬¬ Não entendi a sua dificuldade, mas se for quanto ao envio, eu recomendo a classe PhpMailer pra fazer isso: http://phpmailer.worxware.com/

      abraço.

      • Grato, porem estou passando apenas uma palavra ao conteudo do PDF. Segue o codigo:

        define(‘MPDF_PATH’, ‘../../classes/MPDF45/’);
        include(MPDF_PATH.’mpdf.php’);
        // cria um novo container PDF no formato A4 com orientação paisagem
        $mpdf=new mPDF(‘pt’,'A4′,3,”,15,15,16,16,9,9,’L');
        // muda o charset para aceitar caracteres acentoados
        $mpdf->allow_charset_conversion=true;
        $mpdf->charset_in=’iso-8859-1′;
        //Algumas configurações do PDF
        $mpdf->SetDisplayMode(‘fullpage’); // modo de visualização
        $mpdf->SetFooter(‘{DATE j/m/Y}|{PAGENO}/{nb}|Certificado – Encontro Gaúcho do Terceiro Setor’);
        $mpdf->use_kwt = true;
        $showImageErrors = true;
        // carrega uam folha de estilo
        //$stylesheet = file_get_contents(‘./stylesheets/stylePDF.css’);
        // incorpora a folha de estilo ao PDF
        // O parâmetro 1 diz que este é um css/style
        //$mpdf->WriteHTML($stylesheet,1);
        // incorpora cabeçalho
        $mpdf->SetHTMLHeader(‘teste’);
        // incorpora o corpo ao PDF
        $mpdf->WriteHTML(‘teste’,2);
        // define um nome para o arquivo PDF
        $arquivo = ‘certificado_’.friendly_url($ds_nome_participante).’.pdf’;
        // gera o relatório
        $mpdf->Output($arquivo,’I');
        exit;

  27. Mesmo utilizando o código basico “$mpdf=new mPDF();
    $mpdf->WriteHTML(‘Alo Mundo’);
    $mpdf->Output();
    exit();”

    O arquivo gerado vem corrompido.

    • Como eu já havia dito, este código foi feito para a versão 4.1.1

      com a versão que vc está usando (450) eu consegui gerar o PDF com a seguinte codificação (espero que o wordpress entenda isso aqui):

      <?php

      session_start();
      header("Content-type: text/html; charset=iso-8859-1");
      ob_start(); // Inicia o fluxo
      ?>

      <!– tables, DIVs, consultas no banco de dados, blablabla, imagens e todo o conteudo PHP com HTML –>

      <h1>TESTE</h1>

      <?php
      $html = ob_get_clean(); // Finaliza o fluxo
      define(‘_MPDF_PATH’, ‘mpdf450/MPDF45/’);
      include(_MPDF_PATH.’mpdf.php’);

      // cria um novo container PDF no formato A4 com orientação customizada
      $mpdf=new mPDF(‘pt’,'A4′,3,”,8,8,5,14,9,9,’P');

      // muda o charset para aceitar caracteres acentuados iso 8859-1 utilizados por mim no banco de dados e na geracao do conteudo PHP com HTML
      $mpdf->allow_charset_conversion=true;
      $mpdf->charset_in=’iso-8859-1′;

      //Algumas configurações do PDF
      $mpdf->SetDisplayMode(‘fullpage’);

      // modo de visualização
      // passa html para utf8
      $html = utf8_encode($html);

      // incorpora o corpo ao PDF na posição 2 e deverá ser interpretado como footage. Todo footage é posicao 2 ou 0(padrão).
      $mpdf->WriteHTML($html,2);

      // define um nome para o arquivo PDF
      $arquivo = date("ymdhis").’_projeto_li.pdf’;

      // gera o relatório
      $mpdf->Output($arquivo,’D');

      exit();

      ?>

  28. Oi Diogo, deu certo!!! :o)

    Porém, estou com problemas de acentuação e formatação.

    Obrigada!

  29. [...] que atingimos mais de 1200 visitas ao post “mPDF PHP e PDF“, percebo que devo apontar dois fatos [...]

  30. como é que eu devo fazer para um arquivo .php que tem uma consulta no banco de dados?

    • usando buffer, oras bolas!
      qual parte da mágica que você não entendeu?
      leia o artigo de novo, principalmente na parte que diz em letras garrafais: “E isso dá margem para várias outras coisas”. Tenho certeza que você vai entender.

  31. Diogo, todos estão fazendo de vc o GURU do mPdf. kkk.
    Olá cara, alguem por ai, já viu se há algum bug no mPdf que não gera no Win7 ???

    • Uma excelente pergunta! Vou testar no final de semana e te conto.

      Se não funcionar temos que ver o ambiente.

      No XP eu testo com o xampp, mas no windows 7 só dá pra testar com o IIS… Dá medo só de imaginar…

      abraço!

    • Em tempo… O guru é o sr. Janes! hehehe
      Ele que começou essa história.

  32. Olá Diogo,

    Faz um tempo que achei essa sua solução aqui e passei a usa-la como base para todos os meu os projetos que necessitassem de uso da conversão HTML to PDF, ja fiz diversos projetos aprendi muito com o uso da classe e realmente concordo com tudo que você relatou sobre a prória, mas esta semana ao finalizar um ERP para um cliente, e este envolve NF-e, Relatórios e muito mais, deparei-me com um erro que sinceramente esta me comendo o juízo, o que procede:
    è uma tabela de preços, pelo usuário estar habituado com o uso de seu Sistema Client-Side fiz uma adpatação no Programa dele em Delphi(Não sei quase nada e o que sei só deu pra fazer dessa forma) consegui manipular os dados dele para que todos os produtos fossem enviados via FTP para o server onde fica o ERP que estou desenvolvendo, quando isso é feito o php checa a pasta onde estão os arquivos enviados pelo programa abre-os e depois insere todos estes dados na tabela onde ficam gravados os produtos, até ai tranquilo, blzinha, para finalizar o serviço ele me pediu uma tabela de preços que fosse gerada a partir dos produtos que ele cadastra no sistema dele, ate aí tranquilo, fiz todo o processo e para imprimir a tabela no final ia usar como de costume a MPDF, mas aí veio meu problema, até então nao tinha forçado a classe a usar laços gigantes, neste caso o laço chega a pegar 15.000 itens, como funciona a lógica das rotinas que utilizei:
    Como os produtos são dividos por categoria e por linha, criei uma tabela com a identificação para relacionar os produtos e a linha, a categoria já esta relacionada a linha para que uma automaticamente mostre a outra, neste caso seleciono a categoria e exibo as linhas.

    Categorias -> Linhas

    Tabela de Preços – > Categorias->Linhas->Produtos,

    quando vou gerar o pdf mando a id da tabela de preços por sessão, no arquivo de conversão pego a id da tabela e começo as buscas,

    inicialmente pego os dados da tabela de preços que estão no bd e depois venho fazendo as buscas:

    Executo a Query que seleciona todas as categorias.
    Jogo os dados em Array
    Executo a query que verifica pela id das categorias quais categorias tem uma linha relacionada.
    se tiver ele permite a impressão do nome da categoria após isso faço o laço para imprimir todas as linhas relacionadas com a categoria em que o indexador for diferente de 0

    após isso executo uma nova query para buscar os produtos pela id da categoria e pela id da linha e pela id da tabela, dessa forma esse laço so mostrará os produtos que tiverem em comum a id da tabela, a id da linha e a id da categoria, sempre que o indexador for diferente de 0,

    UFA.. chequei ao problema, quando em html tudo funciona perfeitamente bem, agora quando mando processar o script , jogar no buffer e depois recuparar simplesmente ele não retorna nada, página em branco, para usar o buffer de saida uso a função ob_start(){ Proceso o php bem como o html}pego tudo de volta com a ob_get_clean()pego os dados e depois limpo o buffer, depois disso jogo o html gerando numa variavel: $html=ob_get_clean();
    depois uso a função WriteHTML($html) da classe, bom se errei não sei onde, acho que fiz tudo certo já que quando tiro o loop que mostra os produtos o html é gerado perfeitamente, já aumentei a memória temporária do php com a ini_set, e só da pau quando incluo o loop dos produtos, quando gero a tabela por html fica blz só o problema são so cabeçalhos e rodapés, que não consigo incluir em todas as páginas.

    Bom se você não entendeu, não te culpo, mas se entendeu e tiver um luz para me mostrar te agradeço, se eu conseguir resolver antes, posto todo o código aqui com a solução para ajudar outros que tenham um problema parecido.

    PS: Ando dormindo com o google atrás de alguma solução para isso.

    abraços e parabéns pelo site.

    Atenciosamente
    Uermeson Pinto

    • Hey Uemerson!
      Que bom saber que esse blog está ajudando em projetos tão grandes! rs

      Seguinte… Se não tiver em utf8, vai imprimir um pdf em branco.

      então:

      $html = utf8_encode($html);
      WriteHTML($html);

      tenta aí e me conta.

      abraço!

  33. Diogo, bom dia, parabéns pela ajuda prestada e pelo post. É bom saber que existem pessoas que tem prazer em ajudar outras pessoas. Deus se alegra com isto.

    Estou com problemas para gerar o pdf com uma imagem (Ela não é mostrada no PDF). VOcê sabe como devo proceder para resolver?

    Grato,

    Agamenon

    • Olá Agamenon,

      Para colocar uma imagem no PDF eu uso a tag img do html.

      Devo lembrar que o mPDF aceita somente utf8, e além disso algumas recomendações são importantes quando falamos de imagem no pdf gerado:

      - sempre usei caminhos relativos. funcionou perfeitamente até hoje.
      - o nome do arquivo de imagem deve ser simples. Use apenas letras e números, sem caracteres especiais, ok?
      - use somente jpg ou gif. Ainda não testei qual é a reação do mPDF para os diferentes renders de png, portanto ainda não posso recomendar.
      - a tag img aceita somente 3 parâmetros: width, height e rotate (90, -90 e 180) qualquer coisa diferente disso pode dar problema.
      - se mesmo padronizando assim você não conseguir, tente setar a variável do seu objeto mPDF que mostra erros de imagens como TRUE (ex.: $mpdf->showImageErrors = true)

      Em todo caso, a documentação pode proporcionar uma variedade maior de situações, como o uso de file_get_contents() e etc…
      A página de referência é http://mpdf1.com/manual/index.php?tid=245

      boa sorte!

  34. Boa tarde Diogo,

    Encontrei seu blog em uma busca ávida por uma biblioteca que funcionasse melhor que o DOMPDF e ainda bem que encontrei, a mPDF se apresentou melhor em muitos aspectos, porém estou tendo um problema com “colspan”, simplesmente a que possui o atributo não se extende através da tabela, ela está adotando o tamanho da primeira coluna da linha posterior.
    Pelo que já li nos outros posts você não mexe com a biblioteca a um bom tempo já, mas como não custa tentar, você teria idéia do que pode ser? Não encontrei muita ajuda pela documentação.

    Baixei a última versão que é 5.0.

    Obrigado.

    • pelo que eu vejo aqui na documentação, as tags e suportam colspan numa boa, desde que o valor seja um INTEGER.
      realmente é muito estranho.
      Vou te enviar um email e você me passa uma parte do código pra eu tentar debugar qdo tiver um tempinho, ok?
      valeu pelo toque da table
      abraço!

  35. Descobri qual era o problema!!!

    Vou resumir a história: O HTML que deve ser convertido para PDF é a resposta de uma consulta que o cliente faz no sistema e, para não ter que refazer a consulta, uma vez que ela é cobrada por terceiros, a cada vez que fosse gerar o PDF, eu armazeno o resultado em um campo input hidden através do javascript e envio para a página de geração do documento via POST. Era aí que estava o problema o POST estava indo “escapado” automaticamente pelo PHP e isso estava fazendo com que o mPDF se perdesse!
    Para descobrir converti os elementos por [ e ] antes de gerar o PDF e assim ele me mostrou o HTML que estava recuperando e quando vi lá estavam as benditas “\”.
    Daí foi só utilizar o stripslashes antes e.. tadá.. funcionou!!

    • E não foi só isso:

      O André descobriu hoje também que a biblioteca se perde caso as tags estejam em maiúsculo, por exemplo “DIV” ela não encontra, tem que utilizar “div”.

      Boa dica!

      valeu.

  36. diogo estou com um probleminha, tô tentando exibir uma imagem no pdf só q a imagem ñ carrega, busco ela através de uma consulta no BD, se vc puder me ajudar agradeço.

    ps: mpdf é melhor q fpdf.

    • Hei Sidnei,
      Procure ver se a imagem aparece em um html normal, ou seja, ANTES da geração do PDF.
      Isso me parece caminho errado para a imagem – caso seja caminho armazenado no banco; Ou imagem corrompida – caso ela esteja completamente armazenada em binário no banco.

  37. Diogo

    Achei ótima a mPDF porém eu não consigo fazer aparecer imagem no PDF.

    Tenho a seguinte situação:

    Na pasta raiz do sistema, tenho a pasta “mpdf50″, “images” e “cadastro”.

    De dentro da pasta “cadastro”, eu invoco o mPDF usando um conteúdo de HTML que possui a tag “img src”, justamente essa tag está apontando para a pasta “images”, (estou usando img src=”../images/imagem.jpg” dentro do HTML). O mPDF não acha esse arquivo, e o pior é que eu já tentei de várias formas, inclusive colocando um img src=http://www.meusite.com/images/imagem.jpg (que no browser funciona normal) e mesmo assim o mPDF dá erro de “Cannot find the image”.

    Eu não achei nenhum exemplo desse tipo, mostrando como se usa caminhos relativos para imagens. Só tem exemplo de utilização mais simples..com a imagem estando no mesmo diretório do mPDF.

    Se puder me ajudar, ficarei muito grato!

    Obrigado desde já!

    • Você já tentou importar os dados da imagem como variável?

      Dá uma olhada em “Image data as a Variable” na página “http://mpdf1.com/manual/index.php?tid=245″ da documentação do mPDF.

      abraço.

      • Olá Diogo

        Vou até tentar usar como variável, mas, não vai resolver meu problema, pois a minha funcionalidade é assim:

        -Na tela de “cadastro” tenho um editor HTML (aqueles do typo WYSIWYG) onde o usuário “monta” o HTML dinamicamente, usando quaisquer imagens que ele queira.

        Inserir imagem no PDF é algo básico. Deve haver uma forma de usar o “img src” que funcione! Isso é básico!

        Você disse que usa o “img src” com caminho relativo né? Como vc coloca isso no HTML? Seria algo como ?

        Abraço!

    • Algo exatamente como vc colocou no seu exemplo. Por isso estou estranhando o não funcionamento.
      Se funciona no mesmo HTML que você usa pra gerar o PDF, deveria funcionar no pdf tb (desde que tudo esteja convertido pra UTF8, claro…).

  38. Diogo, achei a solução:

    Eu estava pegando o conteúdo HTML diretamente do Editor HTML, que estava substituindo as aspas pelo código " e com isso o mPDF não encontrava o arquivo de imagem!

    A solução que usei foi essa:

    $mpdf->WriteHTML(htmlspecialchars_decode($_POST["contrato"]));

    Agora ficou show!

    Obrigado!
    Abraço

  39. Boa noite a todos.

    Diogo, achei muito legel o codigo, porem, estou com um problema de adiocionar fotos. Eu ja tentei de todo jeito adicionar uma foto e não consigo. Importar dados do banco de dados para pdf tudo bem, mais quando eu adiciono uma foto, não da certo, não aparece erro, simplesmente não aparece nada.
    segue abaixo o codigo que estou utilizando.

    A respeito da solução da foto do colega acima

    estou usando ela assim:
    $mpdf->WriteHTML(htmlspecialchars_decode($html,2));

    Você poderia me da uma ajuda

    segue abaixo o codigo que estou utilizando

    Teste

    allow_charset_conversion=true;

    $mpdf->charset_in=’iso-8859-1′;

    $html = utf8_encode($html);

    //Algumas configurações do PDF

    $mpdf->SetDisplayMode(‘fullpage’);

    // modo de visualização

    $mpdf->SetFooter(‘{DATE j/m/Y  H:i}|{PAGENO}/{nb}|SEDUC / SIGETI’);

    //bacana este rodape, nao eh mesmo?

    $mpdf->use_kwt = true;
    $showImageErrors = true;

    // carrega uma folha de estilo – MAGICA!!!

    $stylesheet = file_get_contents(‘estilo.css’);

    // incorpora a folha de estilo ao PDF

    // O parâmetro 1 diz que este é um css/style e deverá ser interpretado como tal

    $mpdf->WriteHTML($stylesheet,1);

    // incorpora o corpo ao PDF na posição 2 e deverá ser interpretado como footage. Todo footage é posicao 2 ou 0(padrão).

    $mpdf->WriteHTML(htmlspecialchars_decode($html,2));
    // define um nome para o arquivo PDF

    $arquivo = date(“ymdhis”).’_projeto_li.pdf’;
    // gera o relatório
    $mpdf->Output($arquivo,’D');
    exit();

    ?>

  40. Achei a solução..

    utilizei o mesmo codigo original proposto pelo diogo, no entando peguei a versão 5 do mpdf e funcionou.

    A versão 411 não tava aceitando acrescentar foto.

    Agora ta show de bola.

    Excelente código cara. Parabéns!

    • Opa!
      As novas versões são muito melhores mesmo.
      Vários problemas são evitados com uma simples atualização.
      abraço!

  41. Ola Diogo,
    O post é muito legal e comecei a utilizar normalmente. Fiz uns testes e consegui gerar o PDF, certinho e todo padronizado, mas hoje, de uma hora para outra so gera o PDF em branco.
    Poderia me dar uma luz….
    Obrigado,
    Guga

    • de uma hora pra outra não, né? algo mudou… dá uma perguntada pra sua gerência de configuração que com certeza teve um impacto.

      no mais, você tem dentre os comentários deste post, muitas pessoas com casos parecidos com o seu.

      Dá uma lida e tenta de tudo. Sempre anotando essas alterações pra acompanhar

      abs!

  42. Poxa Diogo! Nao consigo resolver mesmo!
    O que estou tentando converter é um html que vai por email, que tem tabela e estilos e o link do PDF que é gerado. Como te disse fiz todos os testes e funcionou, mas hoje ja estava gerando em branco. Agora atualizei para a versao 5.1 e nada, somente folha em branco. Se coloco uma variavel simples no WriteHTML gera normalmente, mas o html cheio de variáveis nao mais. Será alguma atualizaçao de PHP onde o site está hospedado? Ah.. tentei me inscrever na lista php mas nao acho onde, qual o caminho para inscriçao? Abraço
    guga

  43. Outro problema… converti tudo em UTF-8, beleza.. eliminei a tabela e os estilos, mas se uso um por exemplo, aparecem as mensagens:

    Warning: Wrong parameter count for class_exists() in D:\Domains\stefaniseguros.com.br\wwwroot\mpdf\mpdf.php on line 7934

    Warning: Wrong parameter count for class_exists() in D:\Domains\stefaniseguros.com.br\wwwroot\mpdf\mpdf.php on line 7934

    Fatal error: Cannot redeclare class ttfontfile in D:\Domains\stefaniseguros.com.br\wwwroot\mpdf\classes\ttfontsuni.php on line 39

    And now?
    Abraço, Guga

    • Guga-san,

      Faz o seguinte… Gera um arquivo em HTML simples e me envia o código gerado por email. Vou ver o que dá pra fazer qdo tiver um tempinho.

      abraço!

  44. Simplesmente a melhor das que já ultilizei, parabéns.!!

    []‘s

  45. Estava precisando justamente de uma classe assim para gerar orçamentos em PHP! Vou baixar e testar, parabéns pelo post Diogo! Valeu!

  46. Besson, muito bom seu post, já estou usando mpdf e curti bastante, estou querendo inserir uma quebra de página no pdf gerado, sabe como fazer ?
    Abraço, e até!

    • Oi Sostenesgomes,

      A ferramenta está na versão 5.2.

      Você pode criar a quebra de página via PHP ($mpdf->AddPage();) ou HTML mesmo ()

      Qualquer dúvida que tiver, basta dar uma olhada nessa parte da documentação -> http://mpdf1.com/manual/index.php?tid=108

      Abraço!

      • não saiu a tag do html (o wordpress arranca tudo…), mas vc pode ver na documentação :D #lol

  47. Cara me ajudou bastante esta dica, vlw.

  48. Amigo achei o mPDF show de bola, porem to tendo grande problema em gerar o pdf no formato paissagem, estou usando a versao 5.3 do mPDF, segue abaixo um teste simples que fiz e nao rodou:

    Ola Mundo
    WriteHTML($html);
    // escreve definitivamente o conteudo no PDF

    $mpdf->Output();
    // imprime

    exit();
    // finaliza o codigo

    ?>

    • Olá Dias,

      Seu código chegou incompleto.

      a variável html recebe o valor “Olá Mundo”?

      Posso te enviar um email pra esclarecermos melhor esse código?

      abraço.

      • Amigo consegui deixar no formato paissagem da seguinte forma:
        $mpdf=new mPDF(”, array(297,210));
        porem ficou em branco, tem como vc me mandar um email para eu lhe enviar o meu codigo para vc me da uma ajuda.
        abs

  49. Opa amigo pode sim

  50. Amigo acho que o problema estar na tabela onde mostra as informações vinda do banco, vou fuçar ak ver se consigo corrigir e compartilhar o conhecimento. abs

    • leia todos os comentários deste post e do outro sobre mpdf. geralmente página em branco é problema de charset.
      abs!

  51. como posso gravar o pdf no mysql sem ele ser exibido na página?! por exemplo! tenho um formulário e o cliente preenche o formulário e ao clicar no submit do form ele gera o pdf e salva em banco de dados?
    o cliente não precisa vizualizar o pdf gerado

  52. http://mpdf1.com/manual/index.php?tid=125

  53. Acho que isso já vai te ajudar, Rapha.

    Se precisar mais que isso, vou começar a cobrar pela consultoria.

    :D

    abraço.

  54. Muito obrigado vou ver se consigo! caso sim eu posto aqui

  55. encontrei a solução e ia postar aqui mas pelo jeito vc ja fez
    hehe
    muitissimo obrigado!
    e ve ai quanto ta a conta da consultoria
    rs
    Valeu cara muito obrigado
    só faltava isso para finalizar o sistema (e a busca né mas isso é tranquilo) abraço

  56. Boa tarde Diogo
    tem como botão um botão para funcionar o sistema de conversão ou somente com um página mesmo?

    • Rapha, os scripts PHP só rodam dentro de páginas php.

      Uma dica de lógica pra isso que vc quer fazer:

      1-) pegue o conteúdo a ser convertido e grave numa variável de sessão.
      2-) crie um botão que direcione você para a mesma página, porém passando por GET um parâmetro de marcação, por exemplo: #?action=imprimirPDF
      3-) faça uma condição na página. Se o parametro passado por GET for igual a imprimirPDF, procede ao script de gravação do PDF utilizando-se do que estiver armazenado na variável de sessão, caso contrário, ignore o script de gravação do PDF.

      certo?

  57. Diogo, beleza?
    Carinha.. html para PDF ta perfeito, agora vc teria uma dica para criar o PDF de uma pagina PHP? É uma pagina que traz um select no banco…

    Valeu,
    At.
    Guga

    • guga, vc leu lá em cima onde tem o título “E isso dá margem para várias outras coisas”???
      dá pra fazer numa boa com stream usando ob_start();

  58. Diogo, boa tarde.
    Sou desenvolvedor de PHP a algum tempo… e sempre tive problemas qto a impressão de documentos, tanto em web qto em pdf… já usei o fpdf e agora estou usando o mpdf, conforme sua orientação… Só que meus problemas continuam… O problema é que mesmo definindo as margens, sempre da diferente na impressão em diferentes impressoras e diferentes navegadores. Gostaria de saber se existe algum coisa a fazer nesse problema. Minhas impressões são sempre etiquetas, boletos entre outros, onde realmente eu defino as margens e tal…
    Poderia me auxiliar nessa solução.
    Desde já obrigado.

    • Isso é estranho, Adriano. O PDF é gerado no servidor e você baixa o arquivo fechado para seu micro via web. Não tem interferência alguma do navegador no processo de geração do PDF pelo interpretador do PHP. Sugiro que você passe esse problema diretamente aos criadores da classe, pois é uma descoberta relevante. abraço!

    • Adriano, tente definir o tipo de papel e as margens ao instanciar a classe.

      $mpdf = new mPDF(”, ‘A4′, 0, ‘Arial’, 15, 15, 15, 15, 8, 8);
      Os últimos parâmetros são as margens em milimetros: left-margin, right-margin, top-margin, bottom-margin, header-margin, footer-margin.

      Como o Diogo disse, com o PDF usar navegadores diferentes não faz diferença pois quem gera o PDF é o PHP.

      http://mpdf.bpm1.com/forum/comments.php?DiscussionID=28

  59. Boa tarde Eduardo.
    eu já faço esse procedimento. Veja abaixo:
    $mpdf=new mPDF(‘pt’,'A4′,”,”,31,0,29,10,9,9,’P');
    Eu não sei se esse problema pode ser na impressora (conf dela mesmo), mas para vc ter uma idéia. Nessa configuração que passei, eu coloquei left-margin 31, e na verdade impresso deu 25mm ou 2,5cm, isso em várias impressoras e em uma saiu tudo fora… então por isso que falo que nao bate. Sempre tenho que chegar no resultado final pelo método de tentativa e erro. Eu realmente gostaria de passar uma configuração e ser feita exatamente como passado, como Por exemplo no Word… ou impressões como sistema Desktop…
    Assim, a geração do PDF aparentemente é igual em ambas máquinas. O problema ocorre somente na impressão… só isso.
    Mas fica aí somando na experiência no conteúdo… realmente fiz o PDF somente com os exemplos do Diogo
    Abraços.

  60. Diogo, volto aqui novamente… Estou com o seguinte problema.
    Fiz a página estática para geração de boleto, até aí normal….. para testar… tudo certinho… quando coloquei a programação para abastercer os campos… o rel agora sai em branco.. Para verificar se existia alguma problema de página, comentei apenas a parte que gerava o boleto, e está sendo impresso (gerado) normal… sem erros… Saberia me dizer o que pode ser?

    • Suponho que seja problema de imagem quebrada com caminho ou binário vindo do banco E/OU charset dos dados vindos do banco.

      Se, mesmo depois que você passar tudo pra UTF8, continuar em branco, vc vai ter que fazer debug ítem por ítem até ver qual está retornando um caracter não aceito pela classe.

      Qdo conseguir gerar, dê um retorno pro povo aqui, pois algumas pessoas estão desesperadas pra gerar boleto com mPDF e não estão conseguindo devido à formatação do HTML e CSS. Você poderia dar uma grande ajuda pra nossos colegas com a solução desse problema.

      Abraço,

      Diogo.

  61. consegui resolver o problema. boleto gerado. em pouco tempo posto a solução.

  62. Sensacional, perfeito

    • Valeu, Breno!
      Ainda to esperando a solução do Adriano por aqui… rs

  63. Ola Diogo, Parabens pelo post! passei a usar o Mpdf. consegui fazer tudo certinho, porem a unica coisa que esta pegando é o seguinte.

    Esta trazendo a acentuação no banco e da pagina certinho, porem tudo que esta acentuado dentro do fica desconfigurado, ja tentei varias coisas utf8_encode, etc. alguem ja passou por isso?

    Obrigado

  64. quis falar “” nao sai no post acima

    • então… rs… continua não saindo.
      dentro do pdf?
      bom… geralmente, os problemas principais de encoding são resolvidos nessa página da documentação -> http://mpdf1.com/manual/index.php?tid=293
      tenta postar um exemplo da falha pro pessoal te ajudar.

  65. Ola diego o que nao esta acentuando é o que esta dentro da tag htmlpageheader e htmlpagefooter.

    Vamos ver se agora aparece ai no post… hehe

  66. Diogo consegui resolver. Criei uma variavel pegando todo o conteudo do html que estava dentro da tag htmlpageheader e passei a chamar o cabecalho assim:

    $cabecalho = … codigo html do cabeçalho aqui …

    $mpdf->SetHTMLHeader($cabecalho);

    Agora os acentos aparecem perfeitamente no meu cabecalho e rodape.

    Fica ai a dica para todos!

    Abraços.

  67. Diogo, não sendo repetitivo, mas já sendo… excelente tópico.

    Me permita compartilhar com os demais sobre o “ob_get_contents”. Você comenta sobre mostrar dados do banco na parte “E isso dá margem para várias outras coisas”, cara… pastei pra conseguir entender e, se eu consegui, certamente os outros vão (risos)!

    Não estava conseguindo mostrar os dados do banco, então pesquisei… pesquisei e achei o “ob_get_contents”, ou seja, imprima o seu PHP normalmente, antes do “ob_end_clean()” coloque “$variavel = ob_get_contents()”.

    Quem estiver com dúvidas sobre mostrar dados do banco, leia no manual do PHP sobre essa função, vai ajudar muito.

    Diogo, se ver algo incorreto ou outra forma de mostrar os dados do banco, diz aí.

    falou… valeu.

    • eu que agradeço, Eduardo!
      o blog ta meio morto, mas eu não abandonei a causa. rs
      volte sempre!
      abraço!!!

  68. E ai galera, alguem sabe como se chama alguma função no mpdf? abraço

  69. Fala Diogo blza cara? Dexa eu te falar, quando um fiz um loop na minha tabela:

    <tr bgcolor=>

    ele pulou de página automaticamente. Agora quando coloquei um conteudo estático que ultrapassava uma página ele colocou um por cima do outro? Como vou resolver isso? Abraço

    • como assim, “um por cima do outro” ???
      pulou de página automaticamente ????
      tem alguma coisa errada com seu código, Breno. tr não é tag de mudança de página. Ele não devia se comportar dessa forma.
      Sugiro que você abra uma conta em algum blog e poste os problemas… ou então entre em algum grupo de discussão, como o PHP Google, por exemplo, pro pessoal tentar te ajudar, porque via comentários fica bem difícil de entender a dificuldade.

  70. Sei que muitos já lhe agradeceram, mas não poderia deixar de fazê-lo também. Parabéns Diogo, muito bom seu texto! Há muito tempo procurava por uma classe para geração de pdf’s que funcionasse dessa forma. Me ajudou muito, estarei a aplicar nos meus projetos. Obrigado.

    • essa classe não é perfeita… muita gente encontra problema com ela, mas o pessoal atualiza bastante e resolve 95% dos pepinos. É uma boa programação! eu que agradeço tua visita, Herivelto. Grande abraço!

  71. Cara, este seu post me ajudou muito mesmo. Parabéns por compartilhar.

    • Que bom! Fico feliz. Eu é que agradeço sua visita. Volte sempre. abraço.

  72. Boa tarde Diego DiOgo, estou tendo esse erro será que pode me ajudar

    Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 184960 bytes) in /home/rhemaedu/public_html/paineladm/classe/mpdf/mpdf.php on line 13831

    • Olá Tatianne,

      O pdf gerado extrapolou o limite de memória da sua aplicação.

      Mensure o total máximo de memória que vc vai precisar usar, depois, se seu servidor tiver memória suficiente pra fazer isso sem explodir, use ini_set(‘memory_limit’,’TAMANHO-DA-MEMORIA-MAXIMA-EM-USO’); // set memory to prevent fatal errors
      Já vou avisando que em alguns servidores, principalmente os compartilhados, esse tipo de recurso é considerado abusivo e não permitido pelo php.
      Mas não custa tentar…

      A Lusyana teve o mesmo problema que você: http://diogobesson.wordpress.com/2009/12/28/mpdf-php-e-pdf/#comment-83

      abraço,

      Diogo

  73. [...] mPDF PHP e PDF (8.173) 2º) Formulários no WordPress (2.220) 3º) Brutal Diferença Java x PHP ** deprecated post [...]

  74. Não conhecia essa classe até ler esse post, fiquei muito satisfeito com os resultados da MPDF.

    Todos os recursos que costumo usar na FPDF acabei encontrando no manual, muito bom mesmo.

    http://mpdf1.com/manual/index.php

  75. muitom o post ,eu sou novato com mpdf ,consegui colocar pra funcionar mas não sei como interagir com o banco de dados pra trazer resultados e colocar para exibir no mpdf.tipo tenho uma tabela no mpdf que tem um torpo e umas celulas de titulo o resto preciso completrar com um for ou while que trazem o resultado do bando dentro de outras celuas da tabela mas não consigo ,tem como postar um exemplo o mais detalhado possivel ,grato

    • Oi Renato, me desculpe, porém mais detalhado do que está no post, impossível! Só se eu fizer o script pra você, o que, no caso, geraria uma pequena fatura. risos

      brincadeiras à parte:

      Leia de novo o texto que diz -> “E isso dá margem para várias outras coisas”. Lá ensina a usar uma coisa maravilhosa do PHP chamada FLUXO. É com ele que você consegue puxar os dados do banco e jogar no pdf.

      Pra resolver os problemas de acento e página em branco lembre-se sempre de usar o utf8_decode().

      Tome cuidado também com CSS e tags sem fechamento. Isso mata a criação do PDF na execução; Uma outra dica é validar com http://validator.w3.org/ , ok?

      espero ter ajudado.

      abraço e boa sorte!!!

  76. Estou com um problema come ssa classe, preciso gerar um pdf, dinamico, onde estou buscando os dados no bd utilizando Mysql, só que está gerando mais de 5.000 resultados e a classe trava. o que devo fazer???

    • Olá Tati Negri,

      O blog mudou para http://www.diogobesson.com.br. Atualize seus bookmarks, por favor.

      Bom…
      Tem coisas que só um sistema desktop resolve, viu.

      Imagine que você tem 2 problemas aqui:
      O primeiro é o limite de memória do servidor. Dependendo do tamanho dos dados em cada resultado, fatalmente você vai consumindo recursos do servidor a cada geração de PDF até que ele alcança o limite.
      O segundo é o tempo de execução. Se seu script roda até o limit timeout, ele pára.

      Imaginei uma solução simples de geração de pdfs em blocos, utilizando uma paginação simples a cada 500 resultados, onde o loop se encarregaria de gerar o pdf e salvar em uma pasta ou enviar por email sem onerar a memória ram do servidor, mas ela cai na situação do timeout.

      Uma solução porca, mas que resolveria: você poderia brecar a execução do script nos 500 resultados e gravar essa paginação na $_SESSION ou em cookies. Um javascript chama a página novamente e o script PHP gera um novo pdf a partir da paginação da sessão, regravando os novos valores em um novo pdf. Assim vai indo até o final dos 5 mil resultados. O produto seria uma pasta com diversos pdfs, cada um com 500 resultados.

      Espero que te dê uma luz.

      Abraço,
      Diogo

  77. Olá Diogo!

    Após muita pesquisa e várias tentativas de configuração resolvi te pedir ajuda.
    Tenho um relatório que gera uma tabela de inscritos em determinados cursos. O PDF fica OK quando cabe em uma única página, mas quando precisa ser feita uma quebra, sendo que apenas duas páginas seriam o suficiente para o relatório, é gerado um arquivo com mais de 40 páginas, a maioria com uma ou duas linhas da tabela e a penúltima totalmente preenchida e a última em branco. Você tem alguma sugestão para corrigir esse problema?

    • Bom, vamos lá.

      Primeiro, obrigado pela visita. Vou aproveitar a deixa pra uns recados:

      1- Este post mudou para http://diogobesson.com.br/1/mpdf-php-e-pdf/

      2- O site oficial do MPDF mudou para http://www.mpdf1.com/mpdf/

      é sempre bom atualizar os bookmarks.

      Jorge, se esse é um problema que tá te tirando o sono, eu sugiro que vc simplifique (daqui a pouco vão me chamar de “o rei da gambiarra” se eu continuar dando essas dicas… rs).

      Especifique o volume máximo de linhas da sua tabela de resultados para uma página… Isso pode ser 5, 10, 20… depende de quanta informação você quer colocar, ok?

      Após definir isso, no looping que gera essa tabela, você vai:

      a) abrir a tag <table>
      b) abrir, linha <tr> , coluna <td> e listar os resultados seguindo a regra do limite que você especificou antes por página
      c) fechar tabela
      d) quebrar a página manualmente com os pagebreaks (http://mpdf1.com/manual/index.php?tid=108)
      e) repaginar a query e proceder recriando as tabelas até acabarem os registros.

      Não é muito complicado, pois se você consegue paginar no html, por que não paginar também no pdf? certo?

      Taca o pau aí e depois conta pra gente o que rolou.

      abraço!

      Diogo.

      • Obrigado pela dica Diogo!

        criei um loop dentro de outro e na query limitei o resultado para 40 no máximo. para um melhor entendimento dos demais leitores colocarei o código abaixo:

        Listagem de Inscritos

        <?PHP $sql_visualizar = mysql_query("SELECT * FROM inscricoes where curso='$curso' and abertura='$abertura' ORDER BY nome"); $total= mysql_num_rows ($sql_visualizar);
        echo "Total de Inscritos = " .mysql_num_rows ($sql_visualizar)."”;
        echo $curso; ?>


        RGV
        Nome
        Inscrição em:

        <?PHP
        while($inicio

        <?PHP
        }
        echo "”;
        }
        ?>

      • Que bom que deu certo!

        VIVA A GAMBI!!!! KkKkKkkkk

        brincadeiras, à parte, obrigado pela visita!

        abraço.

  78. Reblogged this on Diogo Besson :: Web Tecno Loge comentado:

    Testando o rebloguing do wordpress.
    ;)


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Categorias

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.