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!!
15 15UTC Julho 15UTC 2009 às 18:16
Como faz pro DOMPDF converter HTML com texto JUSTIFICADO?? o HTML aparece justified, porém, quando manda converter, ele ignora e coloca o texto alinhado à esquerda. Alguem sabe me ajudar?
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
20 20UTC Julho 20UTC 2009 às 23:43
Pessoal preciso de ajuda, necessito salvar no servidor para depois enviar para os clientes automaticamte, mas nao consigo salvar direto no servidor…
Estou precisando de ajuda!!!!
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
9 09UTC Dezembro 09UTC 2009 às 10:58
Alexandre, bom dia…
Parabéns pelo blog, ficou bem explicado.
Consegui fazer a conversão para PDF ok, porém preciso mesmo é salvar o pdf direto, sem aparecer a tela com opções de abrir ou salvar, sei que já teve alguns posts acima com a mesma dúvida que a minha, mas tenho algumas dúvidas com relação ao shell_exec…
Não conheço muito bem php, então gostaria de saber o seguinte:
1. Por exemplo: se meu arquivo “.html” (que vai ser convertido) tem que estar obrigatoriamente dentro da pasta dompdf? ou pode estar por exemplo na raiz do C:
2. Eu não sei como faz para instalar o comando php no servidor, pode me auxiliar?
o safe_mod eu conferi e jah esta Off…
desde já agradeço…
3 03UTC Dezembro 03UTC 2009 às 15:39
Obrigado pela ajuda, foi muito útil.
9 09UTC Dezembro 09UTC 2009 às 13:23
Ola Leonardo, o comando shell_exec não sei se funcionam no windows. Teste em um arquivo simples para abrir algum programa tipo .
voce pode baixar a nova versão do dompdf aqui
http://code.google.com/p/dompdf/
E aqui tem uns exemplos de como vc poderá utiliza-la, vc pode passar só o conteudo do html, sem terque criar a pagina .html propriamente dita.
http://eclecticgeek.com/dompdf/docs/usage.php#