Kajoj Home Page
Menu
Packages (slackware)
ekg

Misc

noooxml
TCPDF lekkie polskie czcionki vs. UTF-8
TCPDF jest bardzo wygodną klasą do generowania plików PDF. Nie będę się tu rozpisywał na temat jej zalet, a skupię się wyłącznie na jednym problemie. Klasa ta, bardzo pięknie obsługuje czcionki unicode w tym takie z polskimi znakami. Problem w tym, że czcionki te mają dość duży rozmiar i po dołączeniu ich do pdfa skutkują jego dość pokaźną nadwagą. Po zastosowaniu diety i wygenerowaniu pliku czcionki z mapą znaków tylko iso-8859-2 jesteśmy niejako zmuszeniu do tworzenia obiektu klasy TCPDF jak nie unicode oraz z charsetem iso-8859-2 i konwertowania wszystkich tekstów z utf8 na iso-8859-2 gdyż sama klasa zdecydowanie sobie z tym nie radzi. Moje rozwiązanie tego problemu przedstawia się następująco:
  1. Generujemy odchudzony plik czcionek:
    $ ttf2ufm -b -L iso-8859-2.map times.ttf times
    $ php -q makefont.php times.pfb timesbi.afm iso-8859-2
  2. Następnie dopisujemy rozmiary polskich znaków dialektycznych do pliku times.php (z lenistwa kopiując wartości ze znaczków bez ogonków. Oto fragment pliku times.php:
    250=>500,251=>500,252=>500,253=>500,254=>278,255=>333);
    
    $cw[260] = $cw[65]; // A
    $cw[261] = $cw[97]; // a
    $cw[262] = $cw[67]; // C
    $cw[263] = $cw[99]; // c
    $cw[280] = $cw[69]; // E
    $cw[281] = $cw[101]; // e
    $cw[321] = $cw[76]; // L
    $cw[322] = $cw[108]; // l
    $cw[323] = $cw[78]; // N
    $cw[324] = $cw[110]; // n
    $cw[211] = $cw[79]; // O
    $cw[243] = $cw[111]; // o
    $cw[346] = $cw[83]; // S
    $cw[347] = $cw[115]; // s
    $cw[377] = $cw[90]; // Z
    $cw[378] = $cw[122]; // z
    $cw[379] = $cw[90]; // Z
    $cw[380] = $cw[122]; // z
    
    $enc='iso-8859-2';
    
  3. wrzucamy pliki times.php oraz times.z do katalogu czcionek TCPDFa
  4. No i teraz najlepsze - tworzymy klasę która dziedziczy po TCPDF i nadpisujemy jedną metodę:
    class TCPDFpl extends TCPDF {
      protected function UTF8ToLatin1($str) {
        if (!$this->isunicode) {
          return $str;   
        }
        return iconv("UTF-8", "ISO-8859-2", $str);
      }                    	
    }
    
  5. No i cieszymy się pięknymi ogonkami :)
    $pdf = new TCPDFpl(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8');
    $pdf->setFont('times', '', 10);
    $pdf->addPage();
    $pdf->cell(0, 20, 'O, mógłże sęp chlań wyjść furtką bździn.');
    


Dodano: 2009-03-04 17:16:37 | komentarze (11)

Komentarze
Kubek : Extra tutorial. W koncu w moim pdfie pojawily sie polskie fonty. Na pierwszy rzut oka tutorial wydaje sie trudny. Wystarczy jedynie przeczytac go uwaznie a wszystko staje sie latwe :)
Dodano: 2009-05-18 15:58:09 z IP: 194.113.*.*

Legion : Stanąłem na drugiej linijce w pkt.1 Skąd się tam bierze php na początku.Dodam że robię to pod windowsem.Proszę o pomoc.:) POzdr
Dodano: 2009-09-28 15:00:56 z IP: 89.231.*.*

Jacek : a jak to zrobić pod windowsem ?
Dodano: 2010-01-23 21:41:45 z IP: 89.72.*.*

ADI : sprostowanie, bo w podanym kodzie jest blad!

druga linijka pierwszego wklejonego kodu powinna byc taka:

$ php -q makefont.php times.pfb timesbi.afm iso-8859-2
Dodano: 2010-10-25 14:13:56 z IP: 95.48.*.*

ADI : ehhh, zle wkleilem!

$ php -q makefont.php times.pfb timesbi.afm true iso-8859-2

przed okresleniem kodowania powinien byc jeszcze parametr osadzenia czcionek, w tym przypadku TRUE
Dodano: 2010-10-25 14:14:52 z IP: 95.48.*.*

krzynio : wielkie dzięki za tutorial - naprawdę bardzo mi się przydał. pozdrawiam
Dodano: 2011-01-03 22:56:29 z IP: 77.255.*.*

Dr Boczek : Dlaczego generowanie PDF z polskimi znakami trwa tak długo a bez polskich znaków generuje sie błyskaiwcznie?
u was tez tak jest czy ja robie jakis błąd?
Dodano: 2011-03-26 13:05:26 z IP: 79.184.*.*

błędy : Przetłumacz na język polski:
"jesteśmy niejako zmuszeniu do tworzenia obiektu klasy TCPDF jak nie unicode "

"polskich znaków dialektycznych"
Dodano: 2011-06-05 13:37:34 z IP: 83.24.*.*

klisiu : W przypadku, gdy dostajecie komunikat "Cannot access iso-8859-2.map" sprawdźcie, czy w katalogu, gdzie znajduje się skrypt makefont.php macie katalog enc, a w nim plik iso-8859-2.map. Jeżeli tak to polecenie powinno wyglądać następująco:

$ ttf2ufm -b -L enc/iso-8859-2.map times.ttf times
Dodano: 2011-08-12 16:34:23 z IP: 89.73.*.*

user : It works perfect!
THANKS A LOT !!!
Dodano: 2011-10-24 10:31:02 z IP: 79.100.*.*

Maniek : Hej,
Jak mam wygenerować odchudzony plik czcionek ?
Gdzie to mam uruchomić ?
mam win7 i webserv
Dodano: 2012-02-02 20:07:44 z IP: 85.221.*.*


Dodaj komentarz
Nick:

Przepisz tę liczbe: AntyBot

 

Slackware Linux Valid XHTML 1.1 Valid CSS Nowoczesne przeglądarki Creative Commons License Spamerom mowimy NIE! HandCoded hacker-emblem website uptime Zobacz mnie na GoldenLine