powerbook_blog

klein, praktisch, unverdaulich seit 2004

php: ezPDF TrueType fonts ( /Bbox error fix )

| 3 Kommentare

Beneath u will find a small hack to make ezPDF really work with TrueType-fonts. Use the instruction of ezPDF on using TrueType fonts and replace as shown below the lines in class.pdf.php.

Wenn man bei der Klasse ezPDF ( zum einfachen Erzeugen von PDF-Dateien aus php herhaus ) der Anleitung zum Verwenden von anderen Schriftarten – insbesondere TrueType-Schriftarten folgt – wird man schnell frustriert feststellen, dass die Klasse einen Fehler hat.

Dieser lässt sich auch auf den ersten Blick nicht wirklich einfach finden, da zwar ein PDF erzeugt wird, dieses sich aber mit einem Fehler meldet: „In der Schrift meineSchrift.ttf ist der Wert für /BBox fehlerhaft.“ Das PDF wird dennoch generiert, jedoch mit der Standard-Schriftart.

Die mitgelieferten Standard-Schriftarten verfügen aber leider nicht über so manches Zeichen, was ich doch dringend benötige.

Vorab sei kurz erwähnt, dass die in der Anleitung erwähnte Methode zum Debuggen meines Erachten auch nur bedingt brauchbar ist. Wer Probleme mit seinem Script hat, dem empfehle ich eher, vor dem $pdf->ezStream(); eine Zeile zu setzen, welche die internen Meldungen der Klasse ausgibt und das Script dann abbricht: echo $pdf->messages; exit; Zur besseren Lesbarkeit der Meldungen sollte man zudem in der Datei class.pdf.php in der Zeile 3023 das ."\n" durch ein ."<br/≶" ersetzen.

Aber zurück zu den TrueType-Schriftarten. Unter Linux/Unix kann man mit dem kleinen Tool ttf2pt1 ganz einfach aus einer TTF-Datei ein passendes .afm-Pendant generieren. Diese beiden Dateien legt man dann also ordentlich im ezPDF-Font-Ordner ab, so dass man myFont.ttf und myFont.ttf.afm dort vorhält.

In dem PHP-Dokument bindet man diese Schriftart nun mit $pdf->selectFont('fonts/myFont.ttf.afm','none'); ein. Soweit die Anleitung.

Wenn man nun noch in der Datei class.pdf.php folgende Änderungen vornimmt:

ersetze / replace this part:

1449: $basefile = substr($fontName,0,strlen($fontName)-4);  
1450: if (file_exists($basefile.'.pfb')){
1451:   $fbtype = 'pfb';
1452: } else if (file_exists($basefile.'.ttf')){
1453:   $fbtype = 'ttf';
1454: } else {
1455:   $fbtype='';
1456:   }
1457: $fbfile = $basefile.'.'.$fbtype;

mit/ with this part:

1449: $basefile = substr($fontName,0,strlen($fontName)-4);  
1450: if (file_exists($basefile.'.pfb')){
1451:   $fbtype = 'pfb';
1452: } else if (strpos($basefile,'.ttf') !== false){
1453:   $fbtype = 'ttf';
1454: } else {
1455:   $fbtype='';
1456: }
1457: if($fbtype == 'tff'){
1458:    $fbfile = $basefile.'.'.$fbtype;
1459: }else{
1460:    $fbfile = $basefile;
1461: }

Danach klappt es dann auch mit den gewandelten Schriften.

3 Kommentare

  1. Danke für die Hilfe! Sehr gut formuliert!

    5*

  2. Danke für den Tip.

    Ich hab da nur eine kleinigkeit anzumeckern…

    in Zeile 1457 sollte man lieber

    if($fbtype == ‚ttf‘){

    statt:
    if($fbtype == ‚tff‘){

    schreiben.

    dann klappt es auch bei mir:-).

    Gruß Marc

  3. Der Beitrag ist schon ein paar Jahre alt, aber vllt. kann trotzdem noch jemand einen Rat geben.
    Es scheint so, als ob in dem generierten afm die Kerning-Infos fehlen, was dann m.E. dafür sorgt, das zwar beim generieren des PDF’s die richtige Schrift verwendet wird, aber die Abstände zwischen den einzelnen Zeichen willkürlich bzw. stark verschoben wirkt. Hat jmd. dafür einen Lösungsvorschlag parat?

Schreib einen Kommentar

Pflichtfelder sind mit * markiert.