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.
#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;
}
[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)
[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!
....
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,
....
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: