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.
15 15UTC Abril 15UTC 2008 às 18:15
Parabéns! muito bom o artigo me ajudo muito…
24 24UTC Abril 24UTC 2008 às 14:17
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
24 24UTC Abril 24UTC 2008 às 14:26
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.
28 28UTC Abril 28UTC 2008 às 20:04
Cara, ja pensei em meter as caras como você, mas o mal de todo programador é falta de tempo… =/
Mas valeu pelas digas. Ajudou bastante!
15 15UTC Agosto 15UTC 2008 às 19:10
Olá,
Estou utilizando o dompdf, mas não consigo gerar arquivos maiores que 4k. Alguem sabe algo a respeito?
4 04UTC Setembro 04UTC 2008 às 13:49
Como inserir uma imagem usando dompdf ? Utilizei <img scr mas não funcionou … utilizei css tb não deu certo .. alguma dica ??
4 04UTC Setembro 04UTC 2008 às 14:06
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
1 01UTC Dezembro 01UTC 2008 às 17:17
Não consigo inserir cabeçalho e nem rodapé !!
Será q está mesmo certo esse código ?
1 01UTC Dezembro 01UTC 2008 às 19:48
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”);
12 12UTC Dezembro 12UTC 2008 às 19:35
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!
12 12UTC Dezembro 12UTC 2008 às 20:04
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.
16 16UTC Dezembro 16UTC 2008 às 17:13
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!!
14 14UTC Agosto 14UTC 2009 às 15:10
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
14 14UTC Agosto 14UTC 2009 às 15:16
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