FAQ

1. Esattamente qual'è la licenza di FPDF? Ci sono limitazioni all'utilizzo?
2. Quando tento di creare un PDF, molti strani caratteri vengono visualizzati sullo schermo. Perché?
3. Quando provo a generare un PDF IE visualizza una pagina vuota. Che succede?
4. Invio i parametri utilizzando il metodo POST e i valori non appaiono nel PDF.
5. Quando uso una sessione PHP, IE non visualizza il mio PDF ma mi chiede di scaricarlo.
6. Quando sono su SSL, IE non riesce ad aprire il PDF.
7. Quando eseguo uno script viene visualizzato il messaggio "FPDF error: Don't alter the locale before including class file".
8. Provo ad inserire una immagine PNG e Acrobat dice "There was an error processing a page. A drawing error occurred".
9. Incontro il seguente errore quando tento di generare un PDF: Warning: Cannot add header information - headers already sent by (output started at script.php:X).
10. Provo a visualizzare una variabile nel metodo Header, ma non viene stampato nulla.
11. Ho definito i metodi Header e Footer nella mia classe PDF ma non appare nulla.
12. Non riesco a far funzionare le interruzioni di linea. Inserisco i \n nella stringa stampata da MultiCell ma non funziona.
13. Tento di inserire il simbolo dell'Euro ma non funziona.
14. Ho disegnato un frame di dimensioni molto precise, ma quando viene stampato noto alcune differenze.
15. Vorrei utilizzare l'intera superficie della pagina, ma quando stampo restano sempre alcuni margini. Come posso eliminarli?
16. Qual'è il limite delle dimensioni dei file che posso generare con FPDF?
17. Posso modificare un PDF con FPDF?
18. Vorrei creare un motore di ricerca in PHP e indicizzare i file PDF. Posso farlo utilizzando FPDF?
19. Posso convertire una pagina HTML in PDF con FPDF?
20. Posso concatenare files PDF con FPDF?


1. Esattamente qual'è la licenza di FPDF? Ci sono limitazioni all'utilizzo?

FPDF è Freeware (come specificato all'inizio del file sorgente). Non ci sono limitazioni all'utilizzo. Può essere utilizzato liberamete all'interno delle proprie applicazioni (commerciali e non), con o senza modifiche.

2. Quando tento di creare un PDF, molti strani caratteri vengono visualizzati sullo schermo. Perché?

Questi "strani" caratteri sono appunto il contenuto del tuo PDF. Questo comportamento è un difetto di IE. Quando esso riceve una pagina HTML, e successivamente un file PDF dallo stesso indirizzo, visualizza quest'ultimo direttamente, senza lanciare Acrobat. Questo accade frequentemente durante lo sviluppo: all'ultimo errore dello script viene inviata una pagina HTML e, dopo la correzione, arriva il PDF.
Per risolvere il problema, semplicemente chiudi e riavvia IE. Oppure vai ad un altro indirizzo e poi torna indietro.
Per evitare questo tipo di inconvenienti durante lo sviluppo, puoi generare il PDF direttamente come file, aprendolo poi da explorer.

3. Quando provo a generare un PDF IE visualizza una pagina vuota. Che succede?

Anzitutto verifica di non aver inviato nulla al browser dopo il PDF (nemmeno uno spazio o un ritorno a capo). Puoi inserire la funzione exit() subito dopo la chiamata alla funzione Output() per essere sicuro.
Se ancora non funziona, significa che sei una vittima della "sindrome della pagina vuota". IE utilizzata assieme al plug-in di Acrobat soffre di numerosi bugs, in tutte le versioni. Dovresti testare la tua applicazione con il maggior numero possibile di versioni di IE (in ultimo se sei su Internet). Il problema si manifesta specialmente con il metodo POST, quindi è caldamente raccomandato di evitarlo (anche perché spesso causa altri problemi, vedi la domanda seguente). Il metodo GET lavora meglio, ma potrebbe non funzionare se l'indirizzo diventa troppo lungo: non utilizzare una query string con più di 45 caratteri. In ogni caso, esiste un trucco per superare questo limite: terminare l'indirizzo con l'estensione .pdf, che inganna IE. Se utilizzi un form puoi inserire un campo nascosto alla fine:

<INPUT TYPE="HIDDEN" NAME="ext" VALUE=".pdf">

Anche l'uso delle sessioni causa spesso problemi (evita di usare gli headers HTTP per impedire il caricamento da cache). Vedi la domanda 5 per una possibile soluzione.

Per evitare questi problemi esistono due tecniche:

- Disabilitare il plug-in ed usare Acrobat come applicazione di supporto. Per fare questo, lancia Acrobat; nel menu File, Preferences, General, deseleziona l'opzione "Web Browser Integration" (per Acrobat 5: Edit, Preferences, Options, "Display PDF in Browser"). La prossima volta che caricherai un PDF da IE, ti verrà mostrata la finestra di dialogo con le opzioni "Apri il file dal percorso corrente" e "Salva il file su disco". Deseleziona l'opzione "Avvisa sempre prima di aprire questo tipo di file" e seleziona Apri. D'ora in poi, i file PDF verranno automaticametne aperti in una finestra di Acrobat.
Lo svantaggio di questo sistema è la necessità di alterare la configurazione del client, cosa fattibile in una rete privata, ma non su Internet.

- Utilizzare una tecnica di reindirizzamento. Consiste nel generare il PDF in un file temporaneo sul server e reindirizzare il client a esso (utilizzando JavaScript, non l'header HTTP Location che causa altri problemi). Per esempio, alla fine dello script, puoi inserire quanto segue:

//Determina il nome del file temporaneo nella directory corrente
$file=basename(tempnam(getcwd(),'tmp'));
//Salva il PDF come file
$pdf->Output($file);
//Reindirizzamento JavaScript
echo "<HTML><SCRIPT>document.location='getpdf.php?f=$file';</SCRIPT></HTML>";

Poi creare un file getpdf.php con questo codice:

<?php
$f=$HTTP_GET_VARS['f'];
//Controlla il file (don't skip it!)
if(substr($f,0,3)!='tmp' or strpos($f,'/') or strpos($f,'\\'))
    die('Incorrect file name');
if(!file_exists($f))
    die('File does not exist');
//Handle special IE request if needed
if($HTTP_SERVER_VARS['HTTP_USER_AGENT']=='contype')
{
    Header('Content-Type: application/pdf');
    exit;
}
//Output PDF
Header('Content-Type: application/pdf');
Header('Content-Length: '.filesize($f));
readfile($f);
//Cancella il file
unlink($f);
exit;
?>

Questo metodo funziona nella maggior parte dei casi, ma IE6 potrebbe ancora causare problemi. La soluzione "definitiva" consiste nel reindirizzare direttamente al file temporaneo. Il nome del file deve pertanto terminare con .pdf:

//Determina il nome del file temporaneo nella directory corrente
$file=basename(tempnam(getcwd(),'tmp'));
rename($file,$file.'.pdf');
$file.='.pdf';
//Salva il PDF come file
$pdf->Output($file);
//Reindirizzamento JavaScript
echo "<HTML><SCRIPT>document.location='$file';</SCRIPT></HTML>";

Questo metodo converte il PDF dinamico in uno statico ed evita ogni problema. E' tuttavia necessario eliminare i file temporanei. Per esempio in questo modo:

function CleanFiles($dir)
{
    //Cancella i files temporanei
    $t=time();
    $h=opendir($dir);
    while($file=readdir($h))
    {
        if(substr($file,0,3)=='tmp' and substr($file,-4)=='.pdf')
        {
            $path=$dir.'/'.$file;
            if($t-filemtime($path)>3600)
                @unlink($path);
        }
    }
    closedir($h);
}

Questa funzione cancella tutti i files il cui nome sia nel formato tmp*.pdf (dove * rappresenta una stringa qualsiasi) più vecchi di un'ora dalla directory specificata. Puoi chiamarla dove vuoi, ad esempio nello script che genera il PDF.

Nota bene: è necessario aprire il PDF in una nuova finestra, in modo che non sia possibile tornare alla pagina che reindirizza.

4. Invio i parametri utilizzando il metodo POST e i valori non appaiono nel PDF.

E' un problema che affligge alcune versioni di IE (specialmente la 5.5). Vedi la domanda precedente per sapere come aggirarlo.

5. Quando uso una sessione PHP, IE non visualizza il mio PDF ma mi chiede di scaricarlo.

E' un problema che affligge alcune versioni di IE. Per aggirarlo, aggiungi il seguente codice prima di session_start():

session_cache_limiter('private');

o utilizza un reindirizzamento come spiegato nella domanda 3.

6. Quando sono su SSL, IE non riesce ad aprire il PDF.

Il problema può essere risolto aggiungendo questo codice:

Header('Pragma: public');

7. Quando eseguo uno script viene visualizzato il messaggio "FPDF error: Don't alter the locale before including class file".

Quando il separatore decimale è configurato come una virgola prima di includere un file, c'è un bug in PHP e i numeri decimali vengono troncati. Quindi non è possibile effettuare una chiamata a setlocale() prima di includere la classe. Su Unix, non è possibile nemmeno impostare la variabile di ambiente LC_ALL, in quanto equivalente ad una chiamata a setlocale().

8. Provo ad inserire una immagine PNG e Acrobat dice "There was an error processing a page. A drawing error occurred".

Acrobat 5 soffre di un bug e non è in grado di visualizzare immagini trasparenti monocromatiche (ad esempio con 1 bit per pixel). Rimuovi la trasparenza oppure salva l'immagine in 16 colori (4 bits per pixel) o di più.

9. Incontro il seguente errore quando tento di generare un PDF: Warning: Cannot add header information - headers already sent by (output started at script.php:X).

E' indispensabile non inviare niente al browser eccetto il PDF stesso: niente HTML, niente spazi, niente ritorni a capo, nè prima nè dopo. Lo script invia qualcosa alla linea X.

10. Provo a visualizzare una variabile nel metodo Header, ma non viene stampato nulla.

Devi usare le variabili globali, ad esempio;

function Header()
{
    global $title;

    $this->SetFont('Arial','B',15);
    $this->Cell(0,10,$title,1,1,'C');
}

11. Ho definito i metodi Header e Footer nella mia classe PDF ma non appare nulla.

Devi creare un oggetto dalla classe PDF, non FPDF:

$pdf=new PDF();

12. Non riesco a far funzionare le interruzioni di linea. Inserisco i \n nella stringa stampata da MultiCell ma non funziona.

Devi chiudere la stringa tra virgolette, non tra apici singoli.

13. Tento di inserire il simbolo dell'Euro ma non funziona.

I font standard hanno il simbolo dell'euro alla posizione 128. Puoi definire per convenienza una costante come questa:

define('EURO',chr(128));

14. Ho disegnato un frame di dimensioni molto precise, ma quando viene stampato noto alcune differenze.

Per rispettare le dimensioni, devi desekezionare l'opzione "Fit to page" nella finestra di dialogo di stampa.

15. Vorrei utilizzare l'intera superficie della pagina, ma quando stampo restano sempre alcuni margini. Come posso eliminarli?

Tutte le stampanti hanno dei margini fisici (diversi a seconda del modello), ed è quindi impossibile rimuoverli e stampare su tutta la superficie della carta.

16. Qual'è il limite delle dimensioni dei file che posso generare con FPDF?

Non c'è un limite particolare. Ci sono comunque alcune restrizioni:

- La massima dimensione di memoria allocata per gli script PHP è impostata di default a 8 MB. Per documenti molto grandi, specialmetne con immagini, questo limite potrebbe essere raggiunto (il file viene generato nella memoria). Questo parametro è configurabile nel file php.ini.

- Il tempo massimo di esecuzione è impostato di default a 30 secondi. Questo limite può naturalmente essere raggiunto con facilità. E' configurato nel file php.ini e può essere alterato dinamicamente con la funzione set_time_limit().

- I browser hanno generalmente un timeout di 5 minuti. Se il PDF viene inviato direttamente al browser e il limite viene raggiunto, il file verrà perduto. E' quindi consigliabile generare i documenti di grandi dimensioni come files, e inviare i dati al browser poco a poco (per esempio, pagina 1, pagina 2... con la funzione flush() per forzare l'output). Quando il documento è completo, è possibile reindirizzare ad esso con JavaScript o creando un link.
Nota bene: anche se il browser va in timeout, lo script continuerà a girare sul server.

17. Posso modificare un PDF con FPDF?

No.

18. Vorrei creare un motore di ricerca in PHP e indicizzare i file PDF. Posso farlo utilizzando FPDF?

No, ma esiste una utility scritta in C e rilasciata sotto licenza GPL, pdftotext, che consente di estrarre il contenuto testuale da un PDF. E' fornita col il pacchetto Xpdf:

http://www.foolabs.com/xpdf/

19. Posso convertire una pagina HTML in PDF con FPDF?

htmldoc, che permette di farlo ottenendo buoni risultati:

http://www.htmldoc.org

20. Posso concatenare files PDF con FPDF?

No, ma esiste una utility freeware scritta in C per farlo:

http://thierry.schmit.free.fr/dev/mbtPdfAsm/enMbtPdfAsm2.html