Table of Contents
Creare un PDF con caratteri speciali
Come creare tramite linguaggio PHP un documento PDF contenente lettere accentate, simbolo di Euro, ecc.
La libreria FPDF consente di generare documenti PDF dal linguaggio PHP. In generale crea documenti senza font inclusi, che pertanto fanno affidamento sui font installati sul sistema dove verranno visualizzati.
I font predefiniti sono:
- Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique
- Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique
- Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
- Symbol
- ZapfDingbats
Per questi font la libreria conosce la larghezza di ciascun carattere e pertanto è in grado di impaginare correttamente il documento. Tali informazioni sono contenuti in appositi file .php, contenuti nella sottodirectory font/
.
La libreria FPDF non supporta la codifica UTF-8, accetta solo codifiche ad 8 bit (tabella di 256 caratteri max) e come codifica predefinita utilizza CP1252 (che include le lettere accentate e il simbolo dell'euro in posizione 128).
Scegliere il font
Per vedere il contenuto di un file TTF (anche senza che sia installato nel sistema) si può usare il programma fontmatrix (omonimo pacchetto Debian).
Dal menu File, Import si possono aggiungere intere directory di font che saranno disponibili nell'elenco di Fontmatrix, ma non installati nel sistema.
Per vedere la forma dei caratteri (glyph) si seleziona il font dall'elenco di sinistra e si sceglie il pannello Glyphs a destra. In particolare selezionando View all mapped glyphs ci si rende conto di quanto è completo ciascun font.
Per ogni carattere viene mostrato il code point Unicode nella forma U-xxxx
dove xxxx è il numero esadecimale, tra parentesi viene indicato il corrispondente valore decimale.
Questo significa che il font contiene al suo interno la mappatura Unicode? Tutti i font TTF sono mappati Unicode?
È possibile cercare un carattere per nome, ad esempio scrivendo Euro nella casella Search in alto a destra è possibile vedere se il simbolo di Euro è compreso nel font. Alcuni nomi che potrebbe essere interessante cercare:
- Agrave
- agrave
- eacute
- Euro
premendo Invio nella casella Search, se il carattere esiste nel font, viene evidenziato in negativo per qualche secondo nella tabella dei glifi.
Dopo aver individuato il font è possibile installarlo (anche nella propria home directory) seguendo le istruzioni contenute nella pagina relativa ai font TTF.
In alternativa all'installazione manuale è sufficiente attivare il font in fontmatrix
(abilitando il segno di spunta); in questo caso viene creato un link simbolico al font nella directory $HOME/.Fontmatrix/Activated/
, tale directory è compresa tra quelle utilizzate da fontconfig
. fontmatrix
stesso provvede all'aggiornamento della cache di fontconfig
.
Preparare il font per l'uso con fpdf
Con questa ricetta si prepara un font TTF per essere incluso nel documento ed utilizzato per rendere caratteri speciali quali le lettere accentate e il simbolo dell'Euro.
Lavoriamo nella directory font/
fornita dalla libreria FPDF, se si preferisce lavorare in un'altra directory si dovrà ridefinire la costante FPDF_FONTPATH
nel sorgente PHP.
Anzitutto si deve generare un file AFM a partire dal file TTF, con l'utility ttf2afm
fornita dal pacchetto texlive-binaries:
ttf2afm andalemo.ttf > andalemo.afm
Con FPDF 1.7 si utilizza quindi l'utility makefont.php
per preparare il font ad essere usato. Dopo aver copiato il file .ttf nella directory fpdf17/font/
, si esegue:
php ../makefont/makefont.php arial_cyrillic.ttf ISO-8859-5
Questo predispone il font ad essere incluso nel PDF (altrimenti si deve passare un terzo parametro false), pertanto ne viene creata una copia compressa con estensione .z
. Viene creato anche un file con estensione .php
(arial_cyrillic.php
nel nostro esempio). Il funzionamento dell'operazione è il seguente:
- Nel file .ttf deve essere presente la codifica Unicode per ogni carattere.
- La mappa indicata viene usata per associare ciascun codice 0-255 ad un punto Unicode (indicato con la sintassi
U+0041
). Se un carattere presente nella mappa non è presente nel font, viene emesso un messaggio di warning. Se non viene indicata la mappa, si intende cp1252. - Nel file .php vengono salvate informazioni sulla metrica del font.
Con la versione 1.6 di FPDF bisogna scrivere due righe di PHP che richiamano l'utility MakeFont fornita con la libreria FPDF:
<?php require_once('./makefont/makefont.php'); MakeFont('./andalemo.ttf', './andalemo.afm', 'cp1252'); ?>
Dovremmo ricordarci - quando si utilizza questo font - di codificare le stringhe secondo quanto dichiarato a MakeFont()
, ecco un esempio:
require_once('fpdf16/fpdf.php'); //define('FPDF_FONTPATH', '/var/www/fpdf/fonts/'); $pdf=new FPDF(); $pdf->AddPage(); $pdf->AddFont('Andale Mono', '', 'andalemo.php'); $pdf->SetFont('Andale Mono', '', 16); $str = iconv('UTF-8', 'CP1252', 'Niccolò Rigacci, per qualche € in più.'); $pdf->SetX(10);$pdf->SetY(50); $pdf->Cell(40, 20, $str); $pdf->Output();
Unicode
Alcuni link utili per Unicode:
- http://unicode-search.net/ Ricerca caratteri nella codifica Unicode
- http://www.utf8-chartable.de/ Tabelle Unicode