Converter HTML em PDF com PHP (HTML2PDF)

Aprenda a converter HTML para PDF utilizando a classe HTML2PDF escrita em PHP.

O que é o HTML2PDF?

“HTML2PDF é um conversor de HTML para PDF escrito em PHP4 (utilizando FPDF), e PHP5 (utilizando TCPDF).”

1º passo: Baixar o HTML2PDF

Para este tutorial foi utilizado a versão disponível para PHP5.
Site oficial HTML2PDF
Site para download do HTML2PDF

2º passo: Criar diretórios e arquivos de exemplo

- Crie na raiz do servidor web o diretório: exemploHtml2Pdf.
- Crie na pasta exemploHtml2Pdf mais dois diretórios: css e img.
- Descompacte o arquivo baixado no 1º passo dentro da pasta: exemploHtml2Pdf.
- Renomeie a pasta que surgiu para html2pdf, para ficar com uma moneclatura melhor e de fácil acesso.
- Crie um arquivo PHP em branco com o nome exemploPdf.php dentro do diretório exemploHtml2Pdf.
- Crie um arquivo CSS em branco com o nome exemploPdf.css dentro do diretório exemploHtml2Pdf/css.
- Salve a seguinte imagem dentro do diretório: exemploHtml2Pdf/img:
Logo Html2Pdf

Ao termino teremos a seguinte estrutura:

Estrutura diretório exemplo.

Estrutura diretório exemplo.

3º passo: Exemplo1

css/exemploPdf.css

exemploPdf.php – Nesse arquivo está o HTML que iremos converter e a lógica para realizarmos a conversão. Acompanhe os comentários no código para melhor compreensão de cada linha.

Obs1.: “Esta biblioteca foi feita para ajudar na criação de arquivos PDF, não diretamente converter uma página HTML. Você não pode usar , , . Leia com atenção os exemplos.”

Obs2.: O html2pdf tem restrições em converter algumas tags HTML e alguns estilos de CSS. Para verificar quais são as tags e estilos permitidos. Basta abrir o arquivo que se encontra dentro do diretório “html2pdf\exemples\pdf\about.pdf”.

Execute o arquivo exemploPdf.php. Se tudo ocorre sem problema teremos o seguinte resultado:
Resultado PDF

4º passo: Exemplo2

Vamos realizar uma pequena modificação. Vamos supor que não gostamos de ter utilizado a fonte Arial. Então vamos modificar o nosso CSS para outra fonte, agora utilizando a fonte Monotype Corsiva.

Ao executarmos novamente o exemploPdf.php iremos deparar com o seguinte erro:
TCPDF ERROR: Could not include font definition file: monotype corsiva

O erro nos mostra que não foi possível gerar o PDF pois não foi encontrado o arquivo de definição da fonte monotype corsiva.

Para resolver o problema teríamos que instalar a fonte monotype cosiva no HTML2PDF. Veja neste post como instalar uma fonte True Type no HTML2PDF.

Download exemplo

Dentro do arquivo você irá encontrar alem do exemplo acima, outros exemplos que foram criados para sanar duvidas dos leitores, veja:

Download exemplo Html2Pdf

exemploPdf.php Exemplo do tutorial
exemploTableLargura100Porcento.php Como colocar uma tabela com largura 100%
exemploImagemGeradaDinamicamente.php Como incorporar no PDF uma imagem gerada dinamicamente por script PHP
exemploHtmlExterno.php Como converter HTML passando apenas a URL do mesmo
exemploQuebraDePagina.php Como realizar a quebra de página no HTML2PDF
exemploEnviarPdfPorEmail.php Como enviar o PDF criado por e-mail. Esté exemplo utiliza a biblioteca PHPMailer

Referência

http://www.html2pdf.fr

53 Comentários

  1. Roberta
    -

    Muito bom seus exemplos, me ajudaram bastante.
    Aproveitei e já adaptei para acesso a banco de dados, agora percebi que toda e qualquer formataçao deve ser em CSS.

    Roberta

    • Thiago Silva Resende
      -

      Roberta, fico feliz que o tutorial esteja te ajudando. Qualquer dúvida deixe seu comentário.

  2. Thiago de Sena
    -

    Parabéns Thiago seu tutorial me ajudou muito.
    Sem dúvida é muito complicado encontrar bons tutoriais igual ao seu na internet.
    Grato!

    • Thiago Silva Resende
      -

      Obrigado pelo comentário e não deixe de conferir a continuação, sobre como instalar fontes true type no HTML2PDF.

  3. a programer
    -

    Thiago

    Nao estou conseguindo fazer com que uma table ocupe 100% da página, mesmo ela estando com widht=”100%”! Alguma observação?
    todo documento vem gerado, mas ocupa apenas 50% da largura do arquivo

    • Thiago Silva Resende
      -

      Eu consegui resolver da seguinte forma:

      - Primeiro define um id para minha table. E via css externo eu define width 100%.
      - Depois para cada td eu define um style width que a soma de 100%.

      Eu atualizei o exemplo com esse método para deixar a table 100%. Baixe ele para você entender melhor o que eu fiz.

      Qualquer dúvida não deixe de comentar.

  4. Walter Aragão
    -

    Thiago , muito bom tutorial.
    To precisando de um complemento só .. como defino um diretorio para salvar ? trocando para F ele está salvando no mesmo diretório da pasta, desde já grato!

    • Thiago Silva Resende
      -

      Walter, obrigado pelo comentário.

      Vamos pegar o nosso exemplo. Se você tiver uma pasta chamada “pdf” na mesma pasta do arquivo “exemploPdf.php”, basta especificar a pasta antes do nome do arquivo.

      Ex.: $html2pdf->Output(‘pdf/exemploPdf.pdf’, ‘F’);

      Agora se a pasta “pdf” estiver a uma pasta atrás, você tem que voltar um nível e escolher a pasta desejada.

      Ex.: $html2pdf->Output(‘../pdf/exemploPdf.pdf’, ‘F’);

      • Walter Aragão
        -

        Funcionou cara , muito obrigado…
        agora só maios uma coisa , como faço para editar um PDF gerado. Na minha necessidade eu gero um contrato de prestação de serviços em pdf e salvo em uma pasta. Porem tem que ter a opção de editar o pdf gerado. Grato por mais essa ajuda campeão!

        • Thiago Silva Resende
          -

          Walter, você tem que editar o pdf? Se você gerar um novo pdf e salvar por cima, não resolve seu problema?

  5. sesostris vieira
    -

    Olá Thiago.
    Estou com um problema ao usar o html2pdf junto com imagens que são fornecidas por uma URL PHP. Explicando melhor, tenho uma rotina file.php que devolve uma imagem, dependendo do parâmetro que recebe. O HTML que quero converter em PHP chama esse file.php, assim:

    <img src=”http://meuhost.com.br/file.php?id=15″/>

    Se eu visualizo o HTML, a imagem aparece corretamente. Se eu passo o HTML para o html2pdf, recebo a mensagem

    Impossível carregar a imagem http://meuhost.com.br/file.php?id=15

    Olhando o código, percebi que é usada a função getimagesize para pegar informações da imagem, mas essa função sempre retorna none se a imagem é gerada por um programa.

    Você sabe como contornar esse problema?

    • Thiago Silva Resende
      -

      Realizei alguns testes e obtive sucesso. Atualizei até o exemplo com os testes que realizei, recomendo que baixe e verifique como fiz.

      Eu obtive a mensagem de erro (Impossível carregar a imagem…) somente quando coloquei o endereço relativo do script que gera a imagem dinâmica. Já o endereço completo não tive problema algum. Como no seu exemplo você está passando o endereço completo talvez seja algum problema com a versão do html2pdf que você está utilizando.

  6. Ailton
    -

    Olá Thiago,

    É o seguinte: Para que eu converta um arquivo que recebe uma parametrização de busca á base de dados tipo : noticias.php?id=1234 como é feito ? Se eu colocar a variavel id no parametro include vai funcionar ?

    Me responda pois quero saber se vai dar certo.

    • Thiago Silva Resende
      -

      Ailton, é possível sim.

      A variável $html irá receber o conteúdo do HTML (noticias.php?id=1234) externo utilizando a função “file_get_contents”.

      Essa função lê todo o conteúdo de um arquivo para uma string.

      Eu criei um novo exemplo com a solução descrita acima. O novo exemplo está com o nome de exemploHtmlExterno.php.

      Obs.: Tome cuidado ao converter um arquivo HTML inteiro. “Esta biblioteca foi feita para ajudar na criação de arquivos PDF, não diretamente converter uma página HTML. Você não pode usar as tags html, head, body. Leia com atenção os exemplos.”

  7. Anônimo
    -

    Parabéns pelo tutorial!

    Como faço para resolver o problema com acentuações? Ex. Manutenção => Manutenção

    • Thiago Silva Resende
      -

      Para solucionar o problema com acentuação você tem que alterar o quarto parâmetro ao instanciar o objeto HTML2PDF para TRUE.

      O que esse parâmetro significa: Informe TRUE caso o html de entrada esteja no formato unicode e FALSE caso negativo.

      Como o arquivo de exemplo esta codificado no formato unicode temos que fazer essa configuração.

      Ex.: html2pdf $html2pdf = new HTML2PDF(‘P’,'A4′,’pt’, true, ‘UTF-8′, 2);
      Obs.: Correção realizada em todos os exemplo do post.

      Obrigado pelo comentário.

  8. Paulo Henrique
    -

    Olá,

    Fiz testes aqui mas ele não busca as classes de css do Twitter Bootstrap, gostaria de organizar a página utilizando o grid, mas ele simplesmente não puxa as classes, aplica somente o css que eu mesmo fiz. O que posso fazer?

    Att.

    • Thiago Silva Resende
      -

      Paulo, já tive problemas em flutuar objetos utilizando o HTML2PDF. Como o Grid funciona utilizando float, esse é o motivo de não funcionar. Tive que voltar a utilizar nossa amiga tabela para resolver esse problema.

  9. Tarize Ty
    -

    Estamos tentando gerar um relatorio através do HTML2PDF com o PHP5, porém dá o seguinte erro: TCPDF ERROR: Some data has already been output, can’t send PDF file.
    O que pode ter acontecido?

    • Thiago Silva Resende
      -

      Tarize obrigado pelo comentário.

      O erro ocorre se você imprimir qualquer texto na tela antes de mandar executar a conversão.

      Qualquer duvida pode perguntar.

      • Tarize Ribeiro
        -

        Thiago já consegui resolver o problema

        mas mesmo assim obrigada pela sua ajuda e parabéns pelo blog

  10. Filipe Araújo
    -

    Thiago você sabe como faço quebra de página com essa biblioteca?
    Valeu!!!

    • Thiago Silva Resende
      -

      Filipe, para quebrar a página, basta envolver o conteúdo pretendido entre as tags
      “page”.

      Fiz um novo exemplo(exemploQuebraDePagina.php) explicando como faz: exemploQuebraDePagina.php

  11. Rogério
    -

    Boa tarde Thiago Silva, parabéns pela dica…muito legal.
    Estou tentando utilizar essa biblioteca porem estou recebendo o erro TCPDF ERROR: Some data has already been output, can’t send PDF file.
    Vi que uma pessoa chamada Tarize teve o mesmo problema e conseguiu resolver, mas não disse como e você disse a ela que esse erro ocorria em decorrencia de ter algo escrito antes da execução da página. Já vi minha página e nada está escrito antes, apenas a execução do seu próprio exemplo. Será que o erro ocorre porque estou tentando utilizar essa função dentro do WordPress na forma de plugin?
    Agradeço a ajuda.
    Abraços!!!

    Atenciosamente,

    Rogério

    • Thiago Silva Resende
      -

      Rogério, nunca testei com WordPress. Mas no primeiro momento uma forma de testar seria configurando um segundo parâmetro na função writeHTML para true. Assim ao invés dele tentar gerar o PDF irá mostrar o resultado em HTML mesmo, assim podemos verificar se o WordPress não está colocando nada antes.

      Fica assim:
      $html2pdf->writeHTML($html, true);

      Vou fazer alguns testes no WordPress.

    • Rogério
      -

      Olá amigo Thiago, obrigado pela sua ajuda. Fiz conforme você me falou e a unica coisa que aparece foi ‘HTML2PDF’…sem as aspas.
      Uma coisa que percebi foi que ele alterou o tipo das fontes do Wp mesmo eu tendo tirado o link para o css.
      Eu tentei também gerar através de Javascript uma janela externa ao Wp para verificar se é possível gerar o PDF através dela, mas enrosquei com questões de permissão do Wp e estou tentando resolver isso, pois assim acho que vai funcionar.
      Bem, caso você tenha alguma novidade eu vou ficar muito agradecido. Obrigado pelo tempo que você está dispondo para me ajudar.
      Abraços!!!
      Atenciosamente,

      Rogério

    • Thiago Silva Resende
      -

      Rogério, realizei alguns testes e consegui gerar o PDF no WordPress. Faça o seguinte:

      - Dentro do diretório wp-content/plugins crie uma pasta chamada: pluginHtml2PdfWordpress.
      - Dentro dela cole a pasta html2pdf que se encontra dentro do exemplo, que contem toda a biblioteca do HTML2PDF.
      - Crie dentro da pasta pluginHtml2PdfWordpress o arquivo do plugin com o seguinte nome, pluginHtml2PdfWordpress.php, e com o seguinte conteúdo, https://gist.github.com/thiagosilr/5864334
      - Ative o plugin no WordPress.

      Agora crie uma página em branco sem nenhuma informação do WordPress. E faça como o exemplo do tutorial com apenas uma modificação, retire a linha três que inclui a biblioteca do HTML2PDF, por que a mesma já esta sendo chamada no plugin.

    • Rogério
      -

      Olá amigo Thiago…cara você ta me salvando a vida….o que você fez funcionou direitinho….quando crescer quero ser igualzinho…rsrs….

      Mas ainda to precisando da sua ajuda….estou com, aparentemente, dois problemas. O primeiro é que quando entro na página que vai gerar o PDF ela perde a formatação de fonte e espaçamento padrão do Wp, fica com formatação Arial em tudo, mesmo eu já tendo redefinido o css e até deixado de utiliza-lo. O segundo é que não estou conseguindo gerar o PDF para download, troquei a opção no $html2pdf->Output para D mas mesmo assim ele não me da a opção do download.

      Já aproveitando, sem querer aproveitar..rs, se eu quiser carregar um texto na minha página e só no final colocar um botão ou link que me da a opção de download, é possível?

      Amigo, agradeço demais sua ajuda.
      Abraços!!!
      Atenciosamente,

      Rogério

    • Thiago Silva Resende
      -

      Obrigado pelos comentários Rogério.

      Algumas perguntas e reposta para poder te ajudar.
      1 – O que está perdendo a formatação é o PDF ou a página que antecede a chamada para gerar o mesmo?
      2 – Quando você trocou a configuração para D, esta retornando algum erro?
      3 – “se eu quiser carregar um texto na minha página e só no final colocar um botão ou link que me da a opção de download, é possível?”. Sim, basta esse link chamar a página que irá realizar a conversão e sua saída estiver configurada como D.

    • Rogério
      -

      Olá Thiago, respondendo…

      1 – A própria página Administrativa do Wp é que perde a formatação. Estou gerando o texto que quero converter dentro da própria área administrativa e dali é que pensei em gerar o PDF.

      2 – Não me retornou erro nenhum….na verdade ele faz a mesma função do I, apenas exibe na tela o texto impresso e mais nada.

      3 – Não entendi muito bem. Você quer dizer que além de eu ter uma página que vai exibir meu texto ainda teria que ter outra para gerar o PDF?

      Obs: Faz diferença se a página que estou carregando os meus dados esta com extensão PHP? Ela teria que ser obrigatoriamente HTML?

      Mais uma vez obrigado pela inestimável ajuda.
      Abraços!!!
      Atenciosamente,

      Rogério

    • Thiago Silva Resende
      -

      Rogério no seu caso o fluxo para gerar o PDF ficaria assim:

      - Uma página com o editor do WordPress para gerar o HTML. Esse formulário apontaria para uma nova página com target igual a _blank.

      - Nessa nova página sem CSS ou alguma formatação do WordPress estaria nosso script para conversão. Com a configuração igual a D para realizar o Download.

      Obs.: Verifique se você não esqueceu o segundo parâmetro da função writeHTML como true, por que assim o PDF não vai ser gerado.

  12. Anônimo
    -

    Ainda não li tudo mas já quero parabenizar pela organização e pelos comentários..

    Geralmente as pessoas colocam os métodos, funções ou qualquer outra coisa e não comente dizendo para que e como usar os parâmetros ou como configurar mas você esta fazendo, muito obrigado.

    • Thiago Silva Resende
      -

      Fico feliz que o tutorial esteja te ajudando. Qualquer dúvida deixe seu comentário.

  13. Anônimo
    -

    Bom dia Thiago,
    Excelente exemplo, me ajudou até certo ponto.
    Você tem alguma função onde eu posso clicar em um botão submit e chamar essa função HTML2PDF para fazer o download da pagina?

    Agradeço um retorno.

    Obrigado

    • Thiago Silva Resende
      -

      Basta você chamar a página que gerar o PDF e no script trocar o segundo parâmetro da seguinte linha para o valor D. Ex.:

      $html2pdf->Output(‘exemploPdf.pdf’, ‘D’);

      O valor D abre a janela para você realizar o download do pdf.

  14. Anônimo
    -

    Thiago, boa tarde!
    Primeiramente parabéns, muito bom este tutorial.. não conhecia esta ferramenta.
    Está funcionando perfeito a geração do PDF, porém, queria estar perguntando se caso poderia estar gerando uma consulta em PHP com Mysql, e depois gerar um PDF sobre ela.. não consigo, porqe no tutorial está com página estática no caso.. seria possível??

    (já utilizei o FPDF e não consegui mexer muito bem nele)

    Agradeço a atenção desde já!.

    • Thiago Silva Resende
      -

      Seguindo o exemplo, basta você realizar a consulta antes da variável $html e monta dinamicamente seu Html, concatenando as informações retornadas do banco de dados.

    • Anônimo
      -

      Então, mais como faço essa concatenação?.. Tentei de diversas formas.. com ponto.. aspas simples.. aspas duplas.. é complicado..
      Voc teria ai alguma outra forma??

      Agradeço desde já.

    • Thiago Silva Resende
      -

      Criei um novo exemplo: exemploDadosMysql.php

      Nele mostro como realizar a conexão com o bando de dados e uma consulta simples. Depois monto o html dinamicamente

    • Anônimo
      -

      Brigado mais uma vez Thiago,
      Sim, agora fico mais fácil saber como monta essa concatenação.. sabia que era possível, mais ficava limitado as funções que estão pré-definidas.. ou seja, da forma desejada, não estava conseguindo formular meu formulário do modo que queria..

      Agradeco a atenção.

  15. Ederson
    -

    Olá Thiago, parabéns pelo Tutorial,
    porém estou com um problema com a quebra de página.
    Estou com um While que traz informações do Banco, enquanto ele exista ele imprime na tela.
    Como identifico a hora de mudar de página, ou seja, está no limite da página e ele deve fazer a quebra?

    Obrigado. Abraço.

    • thiago.dasilvaresende@gmail.com
      -

      Ederson,

      A quebra de página pode ser forçada ou deixar por conta da classe. No seu caso apenas insira o conteúdo que a classe irá realizar o calculo e quebrar as páginas.

  16. Tairo
    -

    Olá Thiago, Bom dia
    Parabéns pelo tutorial, o se é um dos melhores e mais completos.
    Eu estou com um grande problema estou tentando converter para PDF um página que busca informações no banco, essa pagina foi feita com Bootstrap e o html2pdf me reporta essa mensagem
    TCPDF ERROR: Could not include font definition file: ‘open sans’
    Já tentei fazer o inclusão da fonte conforme o diz a documentação http://www.tcpdf.org/fonts.php , porém não estou conseguindo, você poderia me ajudar por favor. Obrigado.

  17. Guilherme
    -

    Boa tarde,

    Estou utilizando conforme você indicou, até ai beleza.

    Sabe dizer uma forma de utiliza-lo para imprimir uma tela do Full Calendar que está na tela?

    Tentei buscar o html da div do calendário e jogar para a biblioteca, mas não estou tendo sucesso, se você puder ajudar sobre isso, agradeceria.

    • thiago.dasilvaresende@gmail.com
      -

      Guilherme,

      Uma solução que encontrei foi pegar via javascript o HTML da página e enviar via AJAX para o script de conversão. O script iria realizar a tarefa e salvar o PDF em uma pasta, depois você abriria o mesmo.

      Mas realizando alguns teste não obtive sucesso devido ao Full Calendar conter algumas tags HTML e CSS que o Html2Pdf não suporta.

  18. Andressa
    -

    Olá Thiago, inclui um iframe no html e me gerou um erro.

    A biblioteca tem alguma restrição com iframe?

    • thiago.dasilvaresende@gmail.com
      -

      Andressa,

      A biblioteca não reconhece a tag iframe.

  19. Guilherme
    -

    Olá, estou utilizando o html2pdf para gerar relatórios, os dados são carregados de um banco através de um while, até ai tudo bem. Todas as informações vem corretamente, mas notei que quando o numero de informações contidas na ultima página é baixo (5 linhas) o html2pdf gera uma outra página em branco, até ai tudo bem, era apenas não imprimir essa última página, mas como eu estou usando a paginação se eu não imprimir a última página em branco, a paginação da minha última página imprimida ficará mais ou menos assim (6 de 7 páginas).

    • Guilherme
      -

      Consegui resolver meu problema.

      No corpo do documento havia uma div, e percebi que ele a gerava na última página, a qual ficava em branco, removi ela e ficou tudo certo, sendo assim aconselho que se utilizarem divs no corpo do documento e der algum erro de formatação certamente esse erro será causado pela div.

      Se a impressão for apenas uma listagem de itens usem apenas sendo o uso do e essêncial se quiser que em toda página o cabeçalho da tabela apareça.

      Atenciosamente, Guilherme.

      • thiago.dasilvaresende@gmail.com
        -

        Muito bom! Agradecido pelos seus comentários.

  20. Dante
    -

    É possível enviar o PDF gerado para um e-mail? Queria fazer algo assim, tipo um recibo online.
    Será que tem jeito?
    Ótimo tutorial.

    • thiago.dasilvaresende@gmail.com
      -

      Que ótimo que o tutorial ainda esteja ajudando bastante. Atualizei os exemplos e adicionei um novo que demonstra utilizando a biblioteca PHPMailer para enviar o e-mail com anexo. É bastante simples, basta salvar o mesmo no servidor utilizando a opção “F” na seguinte linha:
      $html2pdf->Output($arquivo, ‘F’);

      Quando for anexar apontar para o endereço onde o mesmo foi salvo.



Responder a Dante Cancelar resposta