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.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.<INPUT TYPE="HIDDEN" NAME="ext" VALUE=".pdf"> |
//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>"; |
<?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; ?> |
//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>"; |
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); } |
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'); |
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: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:19. Posso convertire una pagina HTML in PDF con FPDF?
htmldoc, che permette di farlo ottenendo buoni risultati:20. Posso concatenare files PDF con FPDF?
No, ma esiste una utility freeware scritta in C per farlo: