Gerando arquivo PDF com PHP usando mPDF

Publicado por Cláudio Souza Jr. (última atualização em 07/01/2016)

[ Hits: 24.931 ]

Download 6338.resumo.php




A classe mPDF é muito extensa e bem versátil. É possível criar PDF de várias maneiras, mas nesse script abordei um método que transforma o buffer de saída do PHP em PDF usando um arquivo HTML gravado no servidor. Não sei se isso é usual, mas aqui pra mim foi muito prático, pois eu não precisei ficar configurando o PDF linha por linha. São 3 scripts, na verdade (index.php, gerador.php e style.css), cujos códigos seguem anexados.

  



Esconder código-fonte

#index.php
<?php
ob_start(); // Ativa o buffer de saida do PHP

function CriaCodigo(){ //Gera numero aleatorio
    for ($i = 0; $i < 40; $i++) {
            $tempid = strtoupper(uniqid(rand(), true));
            $finalid = substr($tempid, -12);
            return $finalid;
    }
}?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;"/>
        <meta name="author" content="Claudio Souza Jr. <claudio@uerr.edu.br>"/>
        <meta name="created" content="18/12/2015"/>
        <meta name="version" content="1.0"/>
        <meta name="changed" content="20/12/2015"/>
        <title>Teste mPDF</title>
        <link rel='icon' type='image/png' href='favicon.png'>
        <!-- Nao defina atributos para a folha de estilos -->
        <link rel='stylesheet' href='style.css' type='text/css'>
    </head>
    <form action="gerador.php" target="_blank">
        <input type="submit" value="Salvar em PDF">
    </form>
    <body>
        <h3>
            Doc: <?=CriaCodigo()?>
        </h3>
        <p>O padre Manuel Bernardes pregava, numa das suas Silvas:</p>
        <p> "Bem pode haver ira, sem haver pecado: Irascimini, et nolite peccare. E às vezes poderá haver pecado, se não houver ira: porquanto a paciência, e silêncio, fomenta a negligência dos maus, e tenta a perseverança dos bons. Qui cum causa non irascitur, peccat (diz um padre) patientia enim irrationabilis vitia seminat, negligentiam nutrit, et non solum malos, sed etiam bonos invitat ad malum. Nem o irar-se nestes termos é contra a mansidão: porque esta virtude compreende dous atos: um é reprimir a ira, quando é desordenada: outro excitá-la, quando convém. A ira se compara ao cão, que ao ladrão ladra, ao senhor festeja, ao hóspede nem festeja, nem ladra: e sempre faz o seu ofício. E assim quem se agasta nas ocasiões, e contra as pessoas, que convém agastar-se, bem pode, com tudo isso, ser verdadeiramente manso. Qui igitur (disse o Filósofo) ad quae oportet, et quibus oportet, irascitur, laudatur, esse que is mansuetus potest".</p>
        <blockquote>
            Trecho de "Oração aos moços" de Rui Barbosa.
        </blockquote>
    </body>
</html>
<?php
/* Captação de dados */
$buffer = ob_get_contents(); // Obtém os dados do buffer interno
$filename =  "code.html"; // Nome do arquivo HTML
file_put_contents($filename, $buffer); // Grava os dados do buffer interno no arquivo HTML
?>

#gerador.php
<?php
/* Inclusão da classe mPDF */
include('/usr/share/apache2/mpdf/mpdf.php');

// Extrai os dados do HTML gerado pelo programa PHP
$filename =  "code.html";
$html = file_get_contents($filename);
$mpdf = new mPDF('','A4',10,'DejaVuSansCondensed'); // Página, fonte;

/*
 * A conversão de caracteres foi necessária aqui, mas pode não ser no seu servidor.
 * Certifique-se disso nas configurações globais do PHP.
 * Usar codificação errada resulta em travamento.
 */
$mpdf->allow_charset_conversion = true; //Ativa a conversão de caracteres;
$mpdf->charset_in = 'windows-1252'; //Codificação do arquivo '$filename';

/* Propriedades do documento PDF */
$mpdf->SetAuthor('Cláudio'); // Autor
$mpdf->SetSubject("Assunto deste documento"); //Assunto
$mpdf->SetTitle('Titulo do PDF'); //Titulo
$mpdf->SetKeywords('palavras, chave, aqui'); //Palavras chave
$mpdf->SetCreator('Han Solo'); //Criador

/* A proteção para o PDF é opcional */
$mpdf->SetProtection(array('copy','print'), '', '#minhasenha'); // Permite apenas copiar e imprimir

/* Geração do PDF */
$mpdf->WriteHTML($html,0); // Carrega o conteudo do HTML criado;
$mpdf->Output("arquivo.pdf",'D'); // Cria PDF usando 'D' para forçar o download;
unlink($filename); // Apaga o HTML
ob_clean(); // Descarta o buffer;
exit();
?>

#style.css
body, div, p {
    font-family: \'DejaVu Sans Condensed\';
    font-size: 25pt;
    background: #666666;
    color: white;
}
h3 {
    margin: 1em 0 2em -15mm;
    background-color: #EEDDFF;
    background-gradient: linear #c7cdde #f0f2ff 0 1 0 0.5;
    padding: 1px;
    padding-left: 3em;
    width: 32%;
    font-family:sans;
    font-size: 16pt;
    font-weight: bold;
    border-left: none;
    border-radius: 0 1em 1em 0;
    box-shadow: 0 0 0.5em 0.5em rgba(255,0,0,1);
    text-shadow: 0.05em 0.04em rgba(127,127,127,0.5);
    color: black;
}
button, input[type="submit"] {
    border-radius: 5px;
    padding: 5px;
    background: #ffcccc;
}
p{
    text-align: justify;
}

Scripts recomendados

Classe em php para listar subdiretórios e arquivos em html

Mural de recados com arquivo de log

source-highlight

Função para formatar tamanho de arquivo

Programa de ordem de serviços


  

Comentários
[1] Comentário enviado por fabiospo em 24/05/2016 - 15:32h

Ola companheiros,
Fiz um sript com base no mPDF, e nesse tutorial para gerar uma versao em pdf de minha pagina php, com os resultados:
O PDF e gerado perfeitamente consigo visualiza-lo no navegador corretamente (maquinas MAC, WIN e LIN),
No entanto quando salvo o arquivo para minhas maquinas, ele abre corretamente nas maquinas MAC e DEBIAN,
porem nas maquinas WINDOWS 7 do serviço o arquivo não abre, (apenas consigo visualiza-lo pelo firefox) Uso o Acrobat Reader DC, e aparece a mensagem ( o acrobat reader nao apode abri esse arquivo porque nao ha suporte ou o arquivo foi danificado)

Alguem ja teve esse problema
Como resolveu

[2] Comentário enviado por claudiosouzajr em 24/05/2016 - 17:01h


[1] Comentário enviado por fabiospo em 24/05/2016 - 15:32h

Ola companheiros,
Fiz um sript com base no mPDF, e nesse tutorial para gerar uma versao em pdf de minha pagina php, com os resultados:
O PDF e gerado perfeitamente consigo visualiza-lo no navegador corretamente (maquinas MAC, WIN e LIN),
No entanto quando salvo o arquivo para minhas maquinas, ele abre corretamente nas maquinas MAC e DEBIAN,
porem nas maquinas WINDOWS 7 do serviço o arquivo não abre, (apenas consigo visualiza-lo pelo firefox) Uso o Acrobat Reader DC, e aparece a mensagem ( o acrobat reader nao apode abri esse arquivo porque nao ha suporte ou o arquivo foi danificado)

Alguem ja teve esse problema
Como resolveu


Fábio, pode ser muita coisa... Esse método que eu usei (criar um arquivo html e carregar o conteúdo para a classe) evitou esse tipo de falha, mas já que você está tendo problemas, sugiro conferir seu script e debugar levando em conta as seguintes opções: não está codificando o HTML como UTF-8; se está codificando o HTML como UTF-8, mude "allow_charset_conversion" para "false"; o PHP está gerando mensagem de erro no corpo do HTML (tente $mpdf->debug = true); teste a geração sem apagar o buffer [ob_clean()]. Aqui eu já tive problemas até com a inclusão do CSS na página. No manual do mPDF tem algumas informações sobre erros na parte "troubleshooting" que podem te interessar. Abraço!

[3] Comentário enviado por fabiospo em 24/05/2016 - 20:36h

Vou dar uma olhada no Manual,
Meu código ficou assim:
....
include("mpdf57/mpdf.php");

$html = "('<!doctype html>
<html> Meu texto em html
</html>')
";

$mpdf=new mPDF();
$mpdf->SetDisplayMode('fullpage');
$css = file_get_contents("pdf/css_pdf.css");
$mpdf->WriteHTML($css,1);
$mpdf->WriteHTML($html);
$mpdf->Output();
$mpdf-> charset_in='windows-1252';
unlink($filename);
ob_clean();

exit;

....
So que os pdfs gerados não abrem no acrobat reader DC do windows.

vou incluir essa parte da conversao de caracteres (HTML como UTF-8, mude "allow_charset_conversion" para "false";) e amanha testo em uma maquina com Windows e acrobat reader DC,

Abraços

[4] Comentário enviado por claudiosouzajr em 24/05/2016 - 23:05h


[3] Comentário enviado por fabiospo em 24/05/2016 - 20:36h

Vou dar uma olhada no Manual,
Meu código ficou assim:
....
include("mpdf57/mpdf.php");

$html = "('&lt;!doctype html&gt;
&lt;html&gt; Meu texto em html
&lt;/html&gt;')
";

$mpdf=new mPDF();
$mpdf-&gt;SetDisplayMode('fullpage');
$css = file_get_contents("pdf/css_pdf.css");
$mpdf-&gt;WriteHTML($css,1);
$mpdf-&gt;WriteHTML($html);
$mpdf-&gt;Output();
$mpdf-&gt; charset_in='windows-1252';
unlink($filename);
ob_clean();

exit;

....
So que os pdfs gerados não abrem no acrobat reader DC do windows.

vou incluir essa parte da conversao de caracteres (HTML como UTF-8, mude "allow_charset_conversion" para "false";) e amanha testo em uma maquina com Windows e acrobat reader DC,

Abraços


Então, aparentemente você não está lendo o HTML de um arquivo externo, então não precisa do unlink. O conteúdo está na variável, então também não tem uso pro buffer no fim do código. Se eu não estiver muito enganado, se o conteúdo está em UTF-8, então você também não vai precisar forçar o charset "windows-1252". Também acho que para carregar o CSS usando o método WriteHTML você não deve marcar o documento, porque a classe vai ler tudo como se estivesse dentro do <body> (Manual, WriteHTML(), Mode #2).

[5] Comentário enviado por pichnoff em 10/08/2016 - 20:23h

boa noite !
está tudo funcionando e o documento PDF sendo gerado normalmente, mas estou com uma dificuldade (não sei se é possível) para gerar mais de um documento no mesmo script (num laço while por exemplo) ... alguém tem alguma dica ?

[6] Comentário enviado por claudiosouzajr em 16/08/2016 - 18:08h


[5] Comentário enviado por pichnoff em 10/08/2016 - 20:23h

boa noite !
está tudo funcionando e o documento PDF sendo gerado normalmente, mas estou com uma dificuldade (não sei se é possível) para gerar mais de um documento no mesmo script (num laço while por exemplo) ... alguém tem alguma dica ?


Experimente um laço com FOR usando um array com os dados:

for ($i=0; $i < count($ArrayDados); $i++) {
$ObjNome = $ArrayDados[$i]['ObjNome'];
$ObjNum = $ArrayDados[$i]['ObjNum'];
$ObjHtml = $ArrayDados[$i]['ObjHtml'];
$mpdf=new mPDF();
$mpdf->WriteHTML($ObjHtml);
$mpdf->Output("arquivo".$ObjNum.".pdf",'F');
}

[7] Comentário enviado por cleitonsi em 17/04/2018 - 13:44h

Boa tarde! Reativando o tópico.
Tenho uma duvida sobre como colocar marcas d'água em documentos com mais de uma página.

[8] Comentário enviado por claudiosouzajr em 18/04/2018 - 18:18h


[7] Comentário enviado por cleitonsi em 17/04/2018 - 13:44h

Boa tarde! Reativando o tópico.
Tenho uma duvida sobre como colocar marcas d'água em documentos com mais de uma página.


E que dúvida seria essa?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts