PHP - tvorba PDF dokumentov s diakritikou

PHP - tvorba PDF dokumentov s diakritikou

PDF dokument Vytvoriť PDF dokument s diakritikou nie je veľký problém, keď viete zvoliť to správne písmo a kódovanie. Pre tvorbu nepoužívam vstavanú PDF knižnicu ale iba skvelú PHP triedu – FPDF. Prináša mnoho výhod ako voľba rozmerov, určenie formátu stránky, odsadenia, záhlavie a spodok dokumentu, automatické zalamovanie stránok a riadkov, centrovanie textu, podpora obrázkov JPEG a PNG, farby pre rôzne elementy, hypertextové odkazy, TrueType, Type1 a podpora kódovaní, kompresia dokumentu (vyžaduje Zlib knižnicu). Osobne si pre PDF volím písmo Trebuchet MS. Je možné použiť aj krajšie písmo, napr. Palatino Linotype ale treba myslieť aj na veľkosť dokumentu. S Trebuchet MS bude mať dokument niečo cez 300kB. S Palatino Linotype vyše 1,2MB. Postup osadenia TrueType písma do PDF dokumentu je celkom dlhý proces. Najprv je potrebné z .ttf súboru vytvoriť metrický súbor .afm. Pomocou .afm súboru ďalej vygenerovať definičný PHP súbor. Posledným krokom je prekódovanie vstupu napr. z UTF-8 (zvolíte vaše kódovanie vstupných dát) do cp1250.

Tvorba metrického súboru

Pre vytvorenie .afm súboru je nutné stiahnúť si utilitu ttf2pt1. Používatelia Windows ju stiahnú tu. Zapnite si príkazový riadok a napíšte nasledovné:

ttf2pt1 -a c:\windows\fonts\trebuc.ttf trebuc
ttf2pt1 -a c:\windows\fonts\trebucbd.ttf trebucbd
ttf2pt1 -a c:\windows\fonts\trebucbi.ttf trebucbi
ttf2pt1 -a c:\windows\fonts\trebucit.ttf trebucit

Tvorba definičného PHP súboru

Pokiaľ ste si ešte nestiahli FPDF, stiahnite ho. V zložke font/makefont/ sa nachádza súbor makefont.php, ktorý vytvorí definičný PHP súbor funkciou MakeFont().
Vytvorte nový PHP súbor s obsahom:

<?php
include_once('font/makefont/makefont.php');
MakeFont('c:\windows\fonts\trebuc.ttf','trebuc.afm','cp1250');
MakeFont('c:\windows\fonts\trebucbd.ttf','trebucbd.afm','cp1250');
MakeFont('c:\windows\fonts\trebucbi.ttf','trebucbi.afm','cp1250');
MakeFont('c:\windows\fonts\trebucit.ttf','trebucit.afm','cp1250');
?>

Po ukončení skriptu sa vyskytnú aj varovania o chýbajúcich znakoch. Ignorujte ich a všimnite si radšej 8 nových súborov. 4 s koncovkou .z a ďalšie 4 s koncovkou .php. Ich názov sa začína na trebuc… Všetky nakopírujte do zložky font/.

Tvorba PDF dokumentu

Dávajte pozor na kódovanie skriptu. Ja používam iba UTF-8, takže budem potrebovať PHP rozšírenie iconv, aby som mohol prekódovať vstup z UTF-8 do cp1250.

<?php

define
('FPDF_FONTPATH','font/');
require(
'fpdf.php');

// reťazec, ktorý má byť v PDF dokumente
$text 'Veríte, že tento PDF dokument dokáže zobraziť základnú diakritiku: ľščťžýáíéúäô';

// prekódovať obsah do cp1250
$text iconv('UTF-8','CP1250',$text);

// vytvoriť novú inštanciu FPDF
$pdf = new FPDF();

// pridať písma
$pdf->AddFont('trebuc','','trebuc.php');
$pdf->AddFont('trebuc','B','trebucbd.php');
$pdf->AddFont('trebuc','I','trebucit.php');
$pdf->AddFont('trebuc','BI','trebucbi.php');

// vytvoriť PDF dokument
$pdf->AddPage();
$pdf->SetFont('trebuc','',11);
$pdf->MultiCell(0,5,$text);
$pdf->Output();

?>

Výsledok

Windows XP (Adobe Reader) Fedora Core 6 (KPDF)
PDF dokument v Adobe Reader (WinXP) PDF dokument v KPDF (FC6)

Výsledný PDF dokument si stiahnete tu. PDF generované na tejto stránke ešte nefungujú s diakritikou, ale pripravujem novú verziu PDF exportu. Príklad si môžete prezrieť tu.

Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 11.03.2007 10:49

Komentáre

#1 mattonik Web E-mail
24.04.2007 13:59
Uzitocny clanok, vyzera to velmi dobre, uz to len musim odskusat :)

#2 mayco
29.06.2007 21:02
Ja som to vyriesil jednoduchsie, vyuzivam unikodovy .ttf subor, v ktorom som ponechal znaky cp1250ky + par specialnych znakov z europskych jazykov, takyto subor obsahuje radovo desiatku kB, takze takto vygenerovany subor nesie nabaleny so sebou minimum dat (300kB je prasarna).
Data z DB nijako nekonvertujem, jednoducho vyuzivam plne UTF-8, a taketo subory s unikodom prehliada Adobe Reader uz po niekolko rokov, takze nemam obavy zeby sa niekomu zle zobrazil obsah. S diakritikou nemam vonkoncom ziaden problem !!!
K dokonalosti mozno doviest cokolvek, napriklad predpoklad ze text je vzdy v nejakom konkretnom jazyku konkretnej krajiny, takze si mozno vytvorit XY suborov s cisto znakmi danej krajiny ... viem ze zijeme v dobe rychleho netu ktoremu je pomaly jedno ci stahujem 100kB alebo 1MB ... ale pri stovkach PDF dokumentov sa uz oplati setrit s priestorom.

#3 -n-
01.09.2007 19:01
[2] mayco,
hoj. mohol by si ten unikodovy ttf font poslat? resp povedat ako ho vytvorim. zrejme meno fontu. dikes

#4 Janko E-mail
09.05.2008 09:53
Velmi pekny a uzitocny clanocek... thx... akurat makam na konverzii... este raz thx.

#5 Fero
20.07.2008 22:08
no neviem, ale nech robim co robim mne to nejde.ľ č nenapise aj keby cokolvek.vam to ide? postupoval som presne podla navodu. dakujem za pomoc.Fero

#6 Rado E-mail
05.10.2008 10:49
Vyborny clanok, ale tiez mi to nefunguje. Velmi to vsak potrebujem a som ochotny zaplatit za hotove riesenie, ktore

- bude poznat fonty arial, tahoma, verdana, times new roman
- pretransformuje HTML priamo do PDF
- php5

Potrebujem teda napriklad zip-ko, ktore ked rozbalim, bude to fungovat.

Dakujem.

#7 majo E-mail
24.04.2009 18:29
funguje mi to perfektne, vdaka za navod (aj ked som sa natrápil) :)

#8 Standa E-mail
28.04.2009 08:29
Ahoj,

dík za článek, ale stále dostávám hlášku o volání nedefinované funkce AddFont(). Nevíte, prosím, někdo z Vás, kde dělám chybu ?

Děkuji Standa

04.05.2009 17:16
[2] mayco,
ahoj, prosim ta, podarilo sa ti nejako vyriesit fpdf spolu s utf? mne bezi aj azbuka, ale robi to problemi s multicell. tebe to funguje? mozes sa prosim podelit s riesenim?

dik

#10 Lokutus E-mail
13.09.2009 16:00
Je to uplne super Velmi pekne dakujem!

#11 zerosignal
07.12.2009 10:35
vdaka za uzitocny clanok!

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti