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;

  1. <?php
  2. require(‘fpdf’);
  3. $pdf_doc=new FPDF();
  4. $pdf_doc->AddPage();
  5. $pdf_doc->SetFont(‘Arial’,’B’,32);
  6. $pdf_doc->Cell(60,20,’Ciao mondo!’);
  7. $pdf_doc->Output();
  8. <?

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()

e molti altri….

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;

  1.  <?php
  2. require_once(‘../../Connections/settings.php’); //apre la connessione DB nella variabile $conn
  3. mysql_select_db($database_gea, $gea);
  4. $clienti = mysql_query("SELECT nome, indirizzo,citta FROM clienti", $conn);
  5. $row_clienti = mysql_fetch_assoc($clienti);
  6.  
  7. do { // mi genero un array con i dati delle etichette che userò in seguito
  8. $labels[‘nome’][ ]=$row_clienti [‘nome’];
  9. $labels[‘indirizzo’][ ]=$row_clienti [‘indirizzo’];
  10. $labels[‘citta’][ ]=$row_clienti [‘citta’];
  11. } while ($row_clienti = mysql_fetch_assoc($clienti));
  12.  
  13. define(‘FPDF_FONTPATH’,’font/’);
  14. require(‘mc_table.php’); //chiamo la libreria PDF_MC_Table, che a sua volta chiama lo script principale
  15.  
  16. $pdf=new PDF_MC_Table(); //genero l’oggetto PDF_TABLE
  17. $pdf->SetMargins(0,0,0); //imposto i margini a 0 per regolarmi con i bordi del foglio delle etichette
  18. $pdf->Open(); //genero l’oggetto PDF
  19. $pdf->AddPage(); //aggiungo una pagina
  20. $pdf->SetFont(‘Times’,”,8); // imposto il font
  21. $pdf->SetWidths(array(70,70,70)); // mi imposto il foglio in 3 colonne larghe 7 cm (come il foglio delle etichette)
  22. srand(microtime()*1000000); //istruzione tecnica (seme random)
  23.  
  24. for($i=0;$i<count($labels[‘nome’]);$i++) { //inizio a scorrere gli array con i dati, mandandone in output 3 alla volta
  25.  
  26. $COL_A=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
  27. $i++;
  28.  
  29. $COL_B=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
  30. $i++;
  31.  
  32. $COL_C=$labels[‘nome’][$i].$labels[‘indirizzo’][$i].$labels[‘citta’][$i];
  33.  
  34. $pdf->Row(array($COL_A,$COL_B,$COL_C)); //genero la riga nel foglio PDF
  35. }
  36.  
  37. $pdf->Output(); // apro il PDF
  38.  
  39. mysql_free_result($clienti);

Se ti è stato utile potrebbero interessarti anche:

Commenti

  1. radioresa scrive:

    Scusa ma il tag di chiusura php ?> è messo al contrario…

    1. ikaro scrive:

      No, penso di averlo dimenticato proprio. Sistemo quanto prima

  2. radioresa scrive:

    Guarda che dicevo quello del primo esempio.

  3. arpides scrive:

    Ciao scusami, grazie per il tutorial, ma se volessi impostare l’altezza della cella avendo un formato preciso per la stampa delle etichette!?

  4. stefano scrive:

    ma se io volessi mandare in stampa l’intera finestra del browser come immagine dove c’è una tabella visualizzata una tabella?
    ciao e grazie

    1. ikaro scrive:

      Stefano, ho paura di non aver capito bene quello che vuoi fare. Spiegati meglio

  5. Anonimo scrive:

    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

  6. Anonimo scrive:

    Complimenti bel post!

    1. coinfeuropea scrive:

      Ho sbagliato qualcosa?

  7. Anonimo scrive:

    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!!!

  8. Anonimo scrive:

    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.

  9. Anonimo scrive:

    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

  10. Ivano scrive:

    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

  11. Ivano scrive:

    mi ha cancellato il tag .. non va a capo ma scrive ovviamente senza gli spazi

    1. ikaro scrive:

      devi usare i codici speciali di Word. Nel tuo caso quello di cambio riga

      1. ivano scrive:

        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 ?

        1. ivano scrive:

          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

        2. ikaro scrive:

          Mi sa che non ti ho capito. Dov’è esattamente che devi andare a capo?

          1. ivano scrive:

            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

          2. ikaro scrive:

            Intendevo quello per “caratteri speciali di Word”, in effetti sono stato troppo ermetico

  12. Anonimo scrive:

    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

  13. INTERSCIENZE scrive:

    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

  14. interscienze scrive:

    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.

  15. Manuel scrive:

    Ciao
    devo inserire un piccola immagine in mezzo al testo….è possibile?

  16. vincenzo scrive:

    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

    1. ikaro scrive:

      C’è uno spazio di troppo prima dell’invio dell’header. Controlla bene, è una svista comune.

  17. Massimiliano scrive:

    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?

  18. apy scrive:

    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.

  19. pdf con php scrive:

    […] a collegare i campi del html?? ho provato a vedere questa libreria come posso fare secondo voi?? http://www.ikaro.net/articoli/cnt/cr…php-00393.html Rispondi […]