Come funziona mPDF
mPDF utilizza un approccio basato sul rendering di una pagina HTML con un foglio di stile CSS per la stampa (il tipo media è print
).
In pratica a questa libreria viene passato un documento HTML che verrà interpretato come da un browser e quindi trasformato in un file PDF.
mPDF supporta tutti i principali tipi di elementi HTML5 e molte proprietà CSS, supportando anche il posizionamento ed il floating all'interno del documento. Di fatto questa libreria consente anche di utilizzare proprietà CSS 2.1 e CSS3 per il tipo media screen
.
Quale versione di mPDF?
Le recenti versioni di mPDF hanno cambiato radicalmente la struttura del codice della libreria. Ora viene utilizzato composer
per l'autoloading delle classi e i namespace per l'inclusione dei componenti aggiuntivi e degli helper della libreria stessa.
Attualmente gli hosting condivisi supportano tutti PHP 5.6+ o PHP 7, ma non tutti consentono l'accesso shell per l'installazione di composer. Per questo motivo useremo la versione 6.0 della libreria che non necessita di questa dipendenza.
Preparazione del file CSS
Per prima cosa creiamo un file CSS per la stampa nella directory del tema in uso:
body { font: 14pt/24pt serif;}
Questa regola di base imposta la dimensione del font, il tipo di font e l'interlinea per il documento.
Quindi passiamo a normalizzare i collegamenti ipertestuali:
a { color: #000; text-decoration: none; }
Abbiamo rimosso la sottolineatura e uniformato il colore. Se il link è esterno possiamo stamparne l'URL con il contenuto generato:
a[href^=http]:after { content: ' (' attr(href) ') '; }
Ora dobbiamo rendere le immagini adattabili al contenuto della pagina:
img { display: block; max-width: 100%; height: auto; }
Ovviamente potete aggiungere altri stili specifici, ad esempio rimuovendo gli elementi presentazionali:
hr { display: none }
mPDF include già un foglio di stile predefinito, quindi gli stili omessi verranno ereditati da tale foglio di stile.
Includere la libreria
Nel file functions.php
del nostro tema includiamo all'inizio la nostra libreria:
require_once( get_template_directory() . '/lib/mpdf/mpdf.php');
Ricordiamo che la costante TEMPLATEPATH
è stata deprecata quindi dobbiamo far ricorso alla funzione get_template_directory()
.
Definire la funzione di rendering
Sempre nel file functions.php
definiamo una funzione che crea un documento HTML come stringa e lo passa ad mPDF per il rendering:
function my_render_pdf() {
global $post;
$post_obj = get_post( $post->ID );
$pdf_file_name = $post_obj->post_name . '.pdf';
$html = '<html><head><title>' . $post_obj->post_title;
$html .= '</title>';
$html .= '<link rel="stylesheet" type="text/css"';
$html .= ' media="print" href="';
$html .= get_template_directory_uri() . '/pdf.css';
$html .= '"></title></head>';
$html .= '<body>' . $post_obj->post_content . '</body>';
$html .= '</html>';
$mpdf = new Mpdf();
$mpdf->WriteHTML( $html );
$mpdf->Output( $pdf_file_name, 'I' );
}
La nostra funzione reperisce i dati grezzi del post corrente utilizzando get_post()
poiché WordPress aggiunge dei filtri ai campi che modificherebbero l'output finale.
Quindi passiamo la stringa HTML alla libreria specificando il nome del file PDF e il tipo di visualizzazione ("I" sta per inline, ossia nel browser).
Usare la funzione
Nel file single.php
utilizzeremo una query string in questo modo:
<?php if( isset( $_GET['print'] ) && $_GET['print'] == 'pdf' ): my_render_pdf(); exit; endif; get_header(); ?>
Quindi realizziamo l'URL nel link di stampa:
<a href="<?php the_permalink(); ?>?print=pdf">...</a>