DomPDF

Bom hoje vou falar do DomPDF, classe para gerar PDF com PHP5 a partir de um HTML. O problema que sua ultima atualização foi em 2006. Ela utiliza a biblioteca CPDF, que foi depreciada, talvez esse o motivo de não ter mais atualizações. Mas tirando isso é uma excelente classe, tem alguns errinhos com table e css. Muitos deles consegui contornar outros estou tentando corrigir ainda. Então vou dar umas dicas sobre essa classe e como trabalha com ela.

Como funciona

É passado um nome para o arquivo .pdf e um nome do arquivo .html, tambem pode ser passado o tipo do papel que por padrao ja é A4. Pode ser executado pela URL ou Terminal Linux.

URL
www.site.com/dompdf/dompdf.php?output_file=file.pdf&input_file=pdftemp/file.html&paper=a4
output_file = nome do arquivo .pdf
input_file = nome do arquivo .html
paper = tipo do papel

Terminal

$ php dompdf.php -f nomePDF dftemp/file.htmlp

dompdf.php [opções] arquivo.html

Opções:
-h Mostra a mensagem
-l Lista os tipos de papel
-p size Mostra os tipos de papeis ‘letter’, ‘A4′, ‘legal’, etc.
-o orientation Orientação do texto ‘portrait’ or ‘landscape’.Por padrão ‘portrait’.
-b path Seta o local para o arquivo .html.
-f file Nome do arquivo pdf [arquivoHTML].pdf.
-v verbose: mostra os erros caso ocorra.
-d very verbose: mostra os erros mais detalhadamente.

Dicas

Algumas dicas sobre essa classe. A primeira e mais importante, seu HTML tenque estar bem identado e sem nenhum erro, senão a classe não irá funcionar. Se esquecer de fechar uma tag que seje ja era, não vai funcionar.

Texto dentro de uma celula da tabela, não obedece seu limite e atravessa outra coluna.

Fiquei um bom tempo tentado resolver e consegui incluindo um width com uma div dentro da celula.

<table>
<tr>
<td>
<div style='width:95%'> texto </div>
</td>
</tr>
</table>

Incluir contorno nas tabelas e celulas

Para que uma tabela possa ter um contorno é preciso atribuir o atributo CSS border-collapse:collapse;
Pode inserir como stilo na propria tabela, ou melhor ainda, uma classe ou atribuir direto na página HTML.


<style type="text/css">
table.collapse {
border-collapse: collapse;
border-spacing: 3px;
}
</script>

Inserir textos estáticos no PDF

É possivel inserir textos estáticos para os arquivos PDF, isso é muito util se vc quer colocar um cabecalho ou um rodapé em todos os PDFs gerados, ou até mesmo um texto indicando a páginação.
Então dentro do arquivo HTML coloque.


<script type="text/php">
if ( isset($pdf) ) {
// Configurações para ajustar o tamanho do texto, cores, e dimensões da area do arquivo
$font = Font_Metrics::get_font("Helvetica");
$size = 9;
$color = array(0,0,0);
$text_height = Font_Metrics::get_font_height($font,$size);
$foot = $pdf->open_object();
$w = $pdf->get_width();
$h = $pdf->get_height();
$pdf->close_object();
$pdf->add_object($font, "all");
// Cria uma linha no rodapé
$y = $h - $text_height - 45;
$pdf->line(12, $y, $w - 16, $y, $color, 0.5);
// Insere um texto um pouco acima da linha do rodapé
$_texto = utf8_encode("Texto Texto);
$w1 = Font_Metrics::get_text_width($_texto , $font, 7);
$y = $h - $text_height - 23;
$pdf->page_text($w / 2 - $w1 / 2, $y, $_texto , $font, 7, $color);
// Numero da pagina
$text = utf8_encode("Página {PAGE_NUM} de {PAGE_COUNT} ") ;
$width = Font_Metrics::get_text_width("Pagina 1 de 2", $font, 6);
$y = $h - $text_height - 2;
$w = $w - 14;
$pdf->page_text($w - $width, $y, $text, $font, 6, $color);
}
</script>
<body> conteudo </body>

Incluindo uma nova fonte

Por padrão esta classe trabalha com a fonte Helvetica, no formato .afm. Mas para incluir uma nova fonte, só baixar o arquivo que tem nesse tutorial, e segui-lo não tem erro (Windows).
Depois de criar a fonte, tenque habilitar ela. Va no diretório dompdf/libs/fonts. Abra o arquivo dompdf_font_family_cache.dist. Este arquivo contem um vetor com as fontes que poderão ser trabalhadas ( a fonte que você criou terá que estar neste diretório ), veja se ja existe um idince referente a sua fonte, se estiver comentado descomente, senão crie um la.
* Um problema que tive foi com o itálico para a fonte Helvetica, estava parecendo negrito e italico, neste arquivo estava ‘italic’ => DOMPDF_FONT_DIR . ‘Helvetica-BoldOblique’, ou seja estava pegando a fonte errada. Foi só alterar para italic’ => DOMPDF_FONT_DIR . ‘Helvetica-Oblique’, e vualá.

Bom tomara que tenha ajudado alguém ai. Esta classe é muito boa, infelizmente foi descontinuada. Estou pensando em mete as cara e tentar atualizar ela, se tiver alguem afim de me acompanhar só entrar e contato :) . Até a próxima.

14 Respostas para “DomPDF”

  1. Parabéns! muito bom o artigo me ajudo muito…

  2. Muito boa essa classe. Porém, preciso que salve o pdf no servidor e não que venha a pergunta “salvar onde” para o usuário. Sabe como posso resolver esse problema?

    parabéns pelo artigo

    abs

  3. Paulo.
    Se você chamar a classe por linha de comando ela irá salvar em um diretório.
    No caso.

    shell_exec(“php dompdf/dompdf.php local/arquivo.pdf local/arquivo.html “);

    Ele ira criar o arquivo dentro do diretório local.
    - o chmod do diretório terá que ter permissão de escrita.
    - para executar o comando php por shell, terá que ter instalado no servidor o cliente php.

  4. Cara, ja pensei em meter as caras como você, mas o mal de todo programador é falta de tempo… =/
    Mas valeu pelas digas. Ajudou bastante!

  5. Olá,
    Estou utilizando o dompdf, mas não consigo gerar arquivos maiores que 4k. Alguem sabe algo a respeito?

  6. Como inserir uma imagem usando dompdf ? Utilizei <img scr mas não funcionou … utilizei css tb não deu certo .. alguma dica ??

  7. Ronaldo, Nunca tive problemas com o tamanho do arquivo, veja se seu HTML esta correto, pois o dompdf eh mto chato perante isso..

    André, as imagens eu utilizo a tag img normal.. mas tenque cuidar com o caminho da imagem, pois se estiver fora do diretorio do dompdf nao vai aparecer.. coloque o caminho inteiro, por exemplo..

    Qualquer coisa soh entrar em contato

  8. Não consigo inserir cabeçalho e nem rodapé !!
    Será q está mesmo certo esse código ?

  9. Eduardo, recentemente achei um problema nesse código que não aparecia o rodapé nas outras paginas mesmo. O objeto estava sendo fechado antes do rodapé, tente assim:

    $font = Font_Metrics::get_font(“Helvetica”);
    $size = 9;
    $color = array(0,0,0);
    $text_height = Font_Metrics::get_font_height($font, $size);

    $rodape = $pdf->open_object();

    $texto = utf8_encode(“Texto rodapé.”);
    $w = $pdf->get_width();
    $h = $pdf->get_height();
    $tamanho_texto = Font_Metrics::get_text_width($texto , $font, 6);
    $y = $h – $text_height – 42;
    $pdf->page_text($w / 2 – $w4 / 2, $y, $texto , $font, 6, $color);

    $pdf->close_object();
    $pdf->add_object($rodape ,”all”);

  10. Olá alexandrems,
    Em primeiro lugar, parabens pelo blog!! (bem completo)
    agora meu problema com a dompdf…
    preciso savar os pdf’s gerados em um diretorio dentro de server (como precisava Paulo no primeiro post).
    porem eu executo o comando shell_exec(‘php blablabla…’); dentro do meu codigo e nada acontece…
    o que vc quiz dizer com ‘cliente php instalado’??
    desde já grato!

    • bom, o comando php tenque estar habilitado no seu servidor, e precisa estar no path.
      dai vc consegue executar o shell_exec(‘php ….’).
      Assim vc consegue executar um arquivo .php sem precisar de um browser.

  11. poxa!! não sei o que acontece??!!
    eu ate consigo fazer isto: shell_exec(’php mkdir dirnome…’)…
    ou seja, meu server aceita o comando…
    porem para salvar os benedidos pdfs … nada…
    tô perdido!!
    mas valeuzaum pela atenção!
    sucesso pra vc!!

  12. Ola fabio, esse é um problema da versão do DOMPDF, ele eh uma otima classe, mas tem muitos problemas. Mas graças a algumas almas bondosas, o projeto DOMPDF foi retomado, voce pode acompanha-los pelo google cods. http://groups.google.com/group/dompdf?hl=en , tem uma nova versão la, talvez resolva seu problema

  13. Ola Henrique.. vc pode tentar executar via linha de comando a criação do pdf, eu consegui criar ele no servidor, pois precisava do md5 do arquivo. tente o comando
    shell_exec(“php diretorio/dompdf/dompdf.php arquivo.pdf arquivo.html”);
    Ele vai pegar o arquivo.html e trasnforma-lo no arquivo.pdf, ambos precisam estar na pasta temp que é configurada no arquivo dompdf_config.ini.php.
    esse comando shell_exec precisa estar com safe_mod off, e o comando php executado dentro dele terá que estar instalado no servidor.
    O projeto DOMPDF foi retomado, vc pode acompanha-lo por aqui http://groups.google.com/group/dompdf?hl=en , tem uma nova versao dele tbm

Deixe uma resposta