Creare PDF con PHP usando fpdf
Fpdf è una classe PHP molto utile per creare files PDF in php senza utilizzare la libreria PDFlib che richiede un pagamento per utilizzo professionale. Fpdf è completamente gratuito e mette a disposizione molti metodi di personalizzazione del documento PDF da generare con il php.
Semplice immaginare quanto possa essere utile per sistemi informativi che utilizzando MySQL e php come tecnologia.
I passi per creare con il php un documento PDF sono molto semplici, è sufficiente includere nel documento php la libreria (scaricabile qui in formato ZIP), creare un nuovo oggetto PDF ed utilizzare i metodi dell’oggetto per impostare e creare il documento da generare;
- <?php
- require(‘fpdf’);
- $pdf_doc=new FPDF();
- $pdf_doc->AddPage();
- $pdf_doc->SetFont(‘Arial’,’B’,32);
- $pdf_doc->Cell(60,20,’Ciao mondo!’);
- $pdf_doc->Output();
- <?
In questo esempio base viene chiamata la libreria (2), creato il nuovo oggetto (3) , utilizzati i metodi AddPage e SetFont per aggiungere una pagina ed impostarne le caratteristiche base (4,5), delineata una area all’interno del documento entro la quale scrivere(6) e generato il documento (7).
Metodi principali per impostare il PDF
- AddPage() – Aggiunge una nuova pagina al documento
- SetFont(carattere, stile, corpo) – Imposta il carattere principale del documento
- SetMargins(sinistro,superiore, destro) – Imposta i margini
- SetAuthor(nome autore) – Imposta l’autore del documento
- Widths()
Metodi per il layout
Fpdf dispone di metodi semplici per impaginare il pdf , in particolare è possibile evidenziare aree rettangolari inviando posizionamento e dimensioni come parametri del metodo Cell() o impostare colonne verticali con il metodo MultiCell().
Nel caso in cui si voglia procedere alla creazione di una tabella però sarà necessario programmare un ciclo chiamando il metodo Cell() impostando opportunamente dimensione e posizionamento di ogni singola cella. Tuttavia esiste una ricca libreria di funzioni sviluppate dagli utenti che semplificano tali automatismi, una su tutte la PDF_MC_Table (scaricabile qui) particolarmente utile per automatizzare la creazioni di tabelle da recordset di MySQL.
Ecco un esempio da me sviluppato (ed opportunamente semplificato) nato dall’esigenza di inviare in stampa etichette per mailing da un sistema intranet basato su php-MySQL;
- <?php
- require_once(‘../../Connections/settings.php’); //apre la connessione DB nella variabile $conn
- mysql_select_db($database_gea, $gea);
- $clienti = mysql_query("SELECT nome, indirizzo,citta FROM clienti", $conn);
- $row_clienti = mysql_fetch_assoc($clienti);
- do { // mi genero un array con i dati delle etichette che userò in seguito
- $labels[‘nome’][ ]=$row_clienti [‘nome’];
- $labels[‘indirizzo’][ ]=$row_clienti [‘indirizzo’];
- $labels[‘citta’][ ]=$row_clienti [‘citta’];
- } while ($row_clienti = mysql_fetch_assoc($clienti));
- define(‘FPDF_FONTPATH’,’font/’);
- require(‘mc_table.php’); //chiamo la libreria PDF_MC_Table, che a sua volta chiama lo script principale
- $pdf=new PDF_MC_Table(); //genero l’oggetto PDF_TABLE
- $pdf->SetMargins(0,0,0); //imposto i margini a 0 per regolarmi con i bordi del foglio delle etichette
- $pdf->Open(); //genero l’oggetto PDF
- $pdf->AddPage(); //aggiungo una pagina
- $pdf->SetFont(‘Times’,”,8); // imposto il font
- $pdf->SetWidths(array(70,70,70)); // mi imposto il foglio in 3 colonne larghe 7 cm (come il foglio delle etichette)
- srand(microtime()*1000000); //istruzione tecnica (seme random)
- for($i=0;$i<count($labels[‘nome’]);$i++) { //inizio a scorrere gli array con i dati, mandandone in output 3 alla volta
- $COL_A=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
- $i++;
- $COL_B=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
- $i++;
- $COL_C=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
- $pdf->Row(array($COL_A,$COL_B,$COL_C)); //genero la riga nel foglio PDF
- }
- $pdf->Output(); // apro il PDF
- mysql_free_result($clienti);
Scusa ma il tag di chiusura php ?> è messo al contrario…
No, penso di averlo dimenticato proprio. Sistemo quanto prima
Guarda che dicevo quello del primo esempio.
Ciao scusami, grazie per il tutorial, ma se volessi impostare l’altezza della cella avendo un formato preciso per la stampa delle etichette!?
ma se io volessi mandare in stampa l’intera finestra del browser come immagine dove c’è una tabella visualizzata una tabella?
ciao e grazie
Stefano, ho paura di non aver capito bene quello che vuoi fare. Spiegati meglio
solo una domanda. Ma gli spazi? Stampi nome,indirizzo,citta tutti attaccati? Non sarebbe meglio mettere nome prima riga – indirzzo seconnda riga – citta terza riga? Ciao Massimo
Complimenti bel post!
Ho sbagliato qualcosa?
Buongiorno,
entro in punta di piedi perchè qui dentro mi sento una terribile ignorantona!!! …..comunque vorrei provare ad utilizzare fbdf che ho già provveduto a scaricare, MA NON SO DA CHE PARTE INIZIARE!!
Qualcuno mi può aiutare?
Io so che ho i miei files php, che sono le pagine del mio sito ed ora come devo procedere perchè alla fine diventino in pdf??!!
Grazie a chi avrà la pazienza di rispondermi, spiegandomi i passaggi uno ad uno come all’asilo!!!
Buongiorno,
anch’io entro in punta di piedi perchè non saprei da che parte cominciare pur avendo letto e scaricato il download consigliato della libreria zippata per MySQL e PHP.
Da qui in poi devo studiare e capire come creare il PDF che dovrà avere gli stessi contenuti di una mia pagina WEB (attualmente stampabile con un clic sull’icone della stampante visibile nel browse).
Vorrei migliore il tutto proprio con un file PDF, che mi risulta essere stampabile a sua volta.
Ringrazio anticipatamente coloro chi mi volesse aiutare.
Ho chiesto aiuto per poter stampare in formato PDF un documento simile/uguale a quello che per esempio si puó vedere e stampare alla seguente pagina :
http://www.pedigreedatabase.eu/paginefreeplus/lupuspedigreegsdx.php?id=1518781D
Grazie, se mi vorrete rispondere in merito
Bruno DA TOS
lol1@inwind.it
Ok funziona. Però se volessi andare a capo ? Cioè mettere cosi :
Mario Rossi
Torino
Come devo modificare il codice ? Ho provato a concatenare la stringa con il . “” ma mi stampa il anziché andare a capo
mi ha cancellato il tag .. non va a capo ma scrive ovviamente senza gli spazi
devi usare i codici speciali di Word. Nel tuo caso quello di cambio riga
I codici di Word ? Perché word ? Uso l’editor PHPDesigner per programmare in PHP. Che codici devo mettere per andare a capo al posto del classico ?
Aspetta ora che ci penso bene anziché concatenare come hai fatto tu, lo spezzo in piu parti e lo mando a capo con la funzione nl2br del php e poi concateno in un secondo tempo. A naso basta fare cosi:
$COL_A=$labels[‘nome’][$i] ;
$COL_A = nl2br($COL_A) . $labels[‘indirizzo’][$i] ;
e cosi via
Lo provo bene e poi ti dico
Mi sa che non ti ho capito. Dov’è esattamente che devi andare a capo?
Ho risolto diversamente.
Voglio andare a capo cosi
Pinco Pallino
Via Roma 12
Torino (TO)
Ho messo un ” n” dopo ogni campo che ritenevo opportuno. Grazie
Intendevo quello per “caratteri speciali di Word”, in effetti sono stato troppo ermetico
Ma si può creare un pdf da un modello di pdf esistente?
Io dovrei creare dei documenti, da dei moduli già fatti.
Non riesco a trovare niente che faccia questo, per Php, neanche come rtf o altri formati.
Qualcuno è a conoscenza di qualche libreria adatta?
Grazie
Dai una occhiata a questa: http://www.quickpdflibrary.com/products/quickpdf/index.php
In preparazione, la guida ufficiale della Classe PHP TCPDF, a cura dell’autore Nicola Asuni. Manuale e documentazione, guida per lo sviluppo, esempi e applicazioni. http://www.tcpdf.it
TCPDF rappresenta la migliore libreria open source esistente per creare documenti PDF. Per questo, è stata implementata in moltissimi progetti importanti come il CMS Joomla. Inoltre, è sempre in continua evoluzione grazie al lavoro del suo sviluppatore.
Ciao
devo inserire un piccola immagine in mezzo al testo….è possibile?
salve ikaro, da poco mi sono messo nel mondo di php… volevo dirti una cosa, ho fatto tutti i procedimenti che hai elencato qui sopra ma quando lo vado ad avviare mi da questo errore:
————————————————————————–
Warning: Cannot modify header information – headers already sent by (output started at C:xamppxampphtdocseserciziesercizi di ricordoNuova cartella (3)index.php:9) in C:xamppxampphtdocseserciziesercizi di ricordoNuova cartella (3)fpdf.php on line 1022
FPDF error: Some data has already been output to browser, can’t send PDF file
————————————————————————–
mi sapresti dire come mai
grazie mille
C’è uno spazio di troppo prima dell’invio dell’header. Controlla bene, è una svista comune.
ciao è da poco che mastico fpdf con php quindi sto prendendo spunto dalla tua guida, ti volevo chiedere delle cose.
ecco il mio code:
$idmsg=trim($_REQUEST[“idmsg”]);require_once(“db.php”);mysql_select_db($db1,$dbconn) or die (mysql_error().” errore connessione db1″);$QueryStar=mysql_query(“Select IDStar, Nome, Cognome from archive Where IDMsg=’$idmsg'”) or die (mysql_error().” errore estrazione dati acquisto per pdf”);$RecStar=mysql_fetch_array($QueryStar);define(‘FPDF_FONTPATH’,’font/’);require(‘fpdf.php’);$page=new FPDF();$page->SetMargins(0,0,0);$page->Open();$page->AddPage();$page->SetFont(‘Arial’,’B’,30);$page->SetTextColor(255,255,255);$page->Cell(0,30,”$RecStar[IDStar]”,0,0,’C’);$pag->SetFont(“Verdana”,”B”,24);$page->Cell(0,60,”$RecStar[Nome] $RecStar[Cognome]”,0,0,’C’);$page->Output();mysql_close($dbconn);
in poche parole tramite un link prendo una variabile la confronto nel database ed estraggo quello che mi serve.
provo il tutto e mi da:
Errore del serverSi è verificato un errore nel sito web durante il recupero di http://www.comunicaemozione.it/lavori/stelle/page/pdf.php?idmsg=5cqq8nue4o. Potrebbe non essere disponibile per manutenzione o essere configurato in modo errato.Ancora come posso mettere come sfondo una immagine?
Salve a tutti, premetto che sono nuov di PHP ho usato FPDF e FPDI per generare file PDF costruendoli in parte con dati immessi dall’utente e in alcuni casi allegando file pdf dell’utente stesso, solo che per alcuni file ottengo l’errore “FPDF error: Unable to find pointer to xref table” (infatti in uno dei file della su citata libreria esiste la relativa funzione error che contiene la seguent riga di codice “die(‘FPDF error: ‘.$msg);” ) e l’applicazione si pianta immagino per l’istruzione DIE. C’è qualcuno che potrebbe dirmi come posso by-passare questo problema? Mi serve una istruzione alternativa a DIE che mi eprmetta di stamapare un msg di errore e restituire il controllo alla mia applicazione.