Convertendo HTML para PDF em PHP

Hoje vamos entender como efetuar a conversão de um documento (X)HTML padrão para um documento PDF válido utilizando a biblioteca DOMPDF.

Instalando o DOMPDF

1. Faça o download do DOMPDF no site oficial da biblioteca. A versão que vou utilizar neste tutorial é a versão 0.5.1

2. Descompacte os arquivos do DOMPDF em um local acessível pelo seu servidor web.

3. Abra e edite o arquivo dompdf_config.inc.php.

  • Se você deixar o DOMPDF_PDF_BACKEND com o valor `auto`, o dompdf vai utilizar a extensão PDFLib se ela estiver instalada no seu servidor, caso contrário o dompdf vai utilizar a R&OS CPDF class (é uma biblioteca para criação de documentos PDF sem a necessidade da instalação de uma extensão adicional).
  • Dê permissão de escrita no caminho que aponta a variável DOMPDF_FONT_DIR (lib/fonts é o padrão).

4. Pronto!

Utilizando o DOMPDF

Vou dar um exemplo simples de utilização da biblioteca. Seguindo este exemplo, você consegue fazer tudo o que precisa para geração de arquivos PDF.

[php]
<?php
$html = ‘
<html>
<head></head>
<style>
h1 {color:#333; size:20px; margin-bottom:5px;}
h3 {color:#222;}
</style>
<body>

<h1>IgorEscobar.com</h1>
<h3>Desenvolvimento, Tecnologia e Informação, na ponta do lápis.</h3>

</body>
</html>’;

require_once("dompdf/dompdf_config.inc.php");

$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->set_paper(‘letter’, ‘landscape’);
$dompdf->render();
$dompdf->stream("exemplo-01.pdf");
?>
[/php]

  • O objeto load_html é responsável por receber o conteúdo HTML e fazer a conversão.
  • O objeto set_paper é responsável pela configuração do papel (formato) do arquivo pdf. No primeiro argumento, você escolhe o tamanho de cada folha; no segundo argumento, você escolhe se quer cada folha em paisagem ou fotografia.
  • No Parâmetro 1 você pode preencher com:4a0, 2a0, a0…a10, b0…b10, c0…c10, ra0…ra4, sra0…sra4, letter, legal, ledger, tabloid, executive, folio, commerical #10 envelope, catalog #10 1/2 envelope, 8.5×11, 8.5×14 e11x17.
  • No Parâmetro 2 você pode preencher com: portrait ou landscape.
  • O objeto render é responsável por imprimir, no documento, o código correspondente ao PDF e exibi-lo no browser.
  • O objeto stream é opcional. Se ele for setado, vai forçar o download do documento com o nome que você passar, caso contrário o documento será exibido na tela.

Resultado Final

DOMPDF 01DOMPDF 01

Dicas

  • Caso você precise gerar um documento PDF muito grande, é provável que o apache reclame do limite de memória. Para contornar este problema, basta aumentar a capacidade de memória alocada. Para isso é preciso alterar o memory_limit com a função ini_set do php. (ex: ini_set(“memory_limit”, “16M”); ).
  • O DOMPDF não funciona com todas as fontes. As fontes que são suportadas por ele podem ser encontradas em lib/fonts. Caso necessite instalar novas fontes, no site do oficial da biblioteca você pode encontrar maiores informações.
  • Caso você não consiga que as suas folhas de estilo sejam carregadas no corpo do pdf, coloque as regras diretamente no corpo do documento. Se mesmo assim não funcionar, coloque as regras utilizando a propriedade style em cada tag do html setando as mesmas, diretamente.

É isso, pessoal!

26 thoughts on “Convertendo HTML para PDF em PHP

  1. Olá! Vc conhece algum método que funcione igual a esse do PDF, mas ao invés de gerar PDF gere uma imagem (qualquer formato) do HTML?
    Muito Obrigado…

    Like

  2. Meu camarada, não to conseguindo baixar a biblioteca não, ta dando acesso negado.

    Forbidden

    You don’t have permission to access /dompdf/ on this server.
    Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.7 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g Server at http://www.digitaljunkies.ca Port 80

    Like

  3. Igos estou tentando fazer o inverso, abrir um pdf e exibir em html, parecido com o google faz, so que em php e se possivel com o minimo de bibliotecas externas, voce tem alguma ideia de como posso fazer isso, to desesperado já.

    vlw

    Like

  4. caro Daniel jhonatan
    Jeito tem sim , o que vc tem que fazer é gerar toda a sua pagina tudo para o buffer
    primeria linha da sua pagina
    // jogando tudo para o buffer
    ob_start();

    depois a ultima linha vc faz assim

    //pegando oresultado
    $html = ob_get_contents();

    // encerrar o buffer e limpar tudo que há nele.
    ob_end_clean();

    e agora aplica a variável no DOM

    have fun!

    Like

  5. Blz! Funcionou certinho. Mas e pra incluir cabeçalho e rodapé? Como o número da página/total de páginas, por exemplo. Já tô p da vida tentando fazer isso! rsrs Obrigado!

    Like

  6. Estou com um problema, qdo gera o meu arquivo pdf, todo o conteúdo fica amontoado no início da página.

    //HTML QUE SERÁ ESCRITO
    $_SESSION[‘html’] = “body{margin:50px;}”.$pdf.””;

    //PÁGINA QUE GERA O PDF
    load_html($html);

    $dompdf->set_paper(‘A4′,’landscape’);

    $dompdf->render();
    $dompdf->stream(“impressao.pdf”);
    ?>

    Alguém me ajuda??

    Like

  7. Buenas noches:
    es primera vez que participo en un foro…les escribo porque tengo un problema con css y el dompdf.. tengo que hacer un formulario y mostrarlo por pdf..he seguido todo al pie de la letra y si se genera el pdf pero sin el formato que debe tener el formulario, es decir, no me reconoce el css, lo he probado llamando desde otro archivo, ingresando el codigo directo en el tag del html y nada… otra cosa es que tengo varias tablas o anidados en el formulario y cuando convierte no los muestra como son sino de manera desordenada… parte del css empleado es el siguiente:

    .lineaabajoyderecha{
    border-top:none;
    border-right:1px solid #000000;
    border-left: none;
    border-bottom:1px solid #000000;
    }

    este css es para darle formato a los de las tablas y utilizo varios dependiendo de la celda.

    lo he probado de esta manera:
    <? php
    $ html = '

    .lineaabajoyderecha{
    border-top:none;
    border-right:1px solid #000000;
    border-left: none;
    border-bottom:1px solid #000000;
    }

    aqui va mi codigo con todas las tablas
    contenido

    Agradezco su colaboración por favor y gracias de antemano..

    Like

  8. igor, primeiro muito obrigado pelo tutorial, salvou a minha pele, eu aproveitei o dompdf pra criar um pdf e incluir como anexo no meu e-mail. Eu só estou tendo um probleminha, na hora de quebrar a linha ele não move a palavra incompleta pra baixo, ele deixa metade da palavra na linha de cima e a outra metade da palavra na linha de baixo. Você faz ideia do que pode ser?

    Obrigado,
    Márcio.

    Like

  9. Estou tentando instalar o DOMPDF no meu pc (Windows 7 e Xampp), mas quando tento gerar um pdf aparece o seguinte erro: Unable to stream pdf: headers already sent

    Alguém tem alguma orientação para me passar?

    Like

  10. Bom dia!

    Igor,
    Estou tendo problemas com limite de memória.
    Tenho um sistema administrativo de funcionários. Nele o pessoal insere dados e gera etiquetas em PDF.
    Estou utilizando o Dom PDF conforme seu tutorial.
    Há uns dias atrás ocorre que ao gerar etiquetas com 160 cadastros o sistema apresenta o erro abaixo.

    Fatal error: Allowed memory size of 157286400 bytes exhausted (tried to allocate 7680 bytes) in /home/r1029319/public_html/sistema_sintur/dompdf/include/text_frame_reflower.cls.php(374) : runtime-created function on line 1

    Abri um chamado, a memória foi aumentado para 150Mb e o problema foi solucionado.

    Neste instante, o sistema está com 187 cadastros.
    Ao gerar etiquetas o sistema apresenta o mesmo erro.
    Ressalto que localmente, o sistema funciona normalmente, sem apresentar erro nenhum.
    Segundo o pessoal do provedor, a memória já foi aumentado ao máximo permitido no plano revenda.
    Eles me sujeriram um cloud.
    Você conhece alguma outra alternativa que consuma menos memória?

    Like

    1. @Lasaro,

      De fato, voce nao tem muitas alternativas. Recomendo voce mudar para um servidor onde voce tem mais flexibilidade para configurar este tipo de coisa. Esse processo de conversao HTML -> PDF usa muita memoria mesmo. Faz uns meses que saiu uma versao nova do DOMPDF, certifique-se de estar utilizando a versao mais recente: http://code.google.com/p/dompdf/

      Like

  11. boa noite galera. pessoal gostaria de pedir a ajuda dos amigos se possível, estou usando a biblioteca e fiz todo o “CSS” para quando o arquivo for gerado ficar tudo no seu lugar, meu problema é o seguinte, queria gerar um relatorio de umas 10 paginas de resultado de uma consulta de imoveis, dividi os resultados em blocos, cada bloco representa um imovel, queria travar o resultado da consulta em 3 blocos de resultados por pagina, para que ao final do relatorio, nenhum bloco fique quebrado entre uma pagina e outra. desde já agradeço galera. Abraço.

    Like

  12. essa porcaria de biblioteca DOMPDF é uma merda … ela não converte grandes codigos em HTML da um bug que em vez de aparecer o HTML formatado converte o código em PDF…

    Like

  13. Ao orientar de landscape para portrait, ocorre o erro abaixo. Sabe como saio dessa???
    Catchable fatal error: Argument 1 passed to Frame_Decorator::copy() must be an instance of DOMNode, boolean given, called in C:\xampp\htdocs\propline\dompdf\include\text_frame_decorator.cls.php on line 132 and defined in C:\xampp\htdocs\propline\dompdf\include\frame_decorator.cls.php on line 118

    Like

  14. Fala Igor! Excelente tutorial, eu estava tendo problemas para imprimir a conversão com funções PHP, vi sua dica de jogar em buffer mas na realidade não usava bd, alocava a variável direto pelo método $_GET(), e pro pessoal que precisa do mesmo é só concatenar a variável, armazenando o valor e imprimindo em html ai roda direitinho 🙂

    Valeu pela ajuda!
    Abraço!

    Like

  15. O dompdf está perfeito aqui, (com excessão de trabalhar com bootstrap onde o background sai pintado somente metade da div na diagonal… mas isso vejo depois…) o que quero fazer é pegar o resultado (pdf) e anexar no email pelo PHPMailer, sem apresentar na tela ou fazer download para o usuario… tem como?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: