DOMPDF jest jedną z lepszych bibliotek do konwersji dokumentów HTML do formatu PDF w PHP. Jest darmowa, wygodna w obsłudze i posiada stosunkowo dobre odwzorowanie kodu html. Niestety w tego typu konwersjach zazwyczaj pojawia się problem z polskimi znakami i klasa DOMPDF nie należy do wyjątków. Okazuje się, że istnieje rozwiązanie tego problemu.

Aby polskie znaki były wyświetlane poprawnie należy przede wszystkim skonwertować wymagane czcionki (wykorzystywane w pliku html) z formatu TTF (True Type Font) na PT1 (Postscript Type 1) od razu dokonując konwersji kodowania poprzez program ttf2pt1:

CODE:
  1. ttf2pt1.exe -b -L iso-8859-2.map arial.ttf arial

Do konwersji będzie potrzebny plik mapy kodowania iso-8859-2.map dostępny np. w bibliotece fpdf.

W wyniku tego polecenia powstaną 2 pliki: arial.afm (zawierający metrykę czcionki) i arial.pfb (zawierający opis kształtu czcionki), które należy skopiować do katalogu czcionek klasy DOMPDF czyli do katalogu dompdf/lib/fonts.

Następnie należy sprawdzić czy nowe czcionki są dodane do pliku domdpf/lib/fonts/dompdf_font_family_cache.dist a jeśli ich tam nie ma należy je dodać/zmienić nazwy (i usunąć plik cache). Należy także pamiętać, że w ten sposób należy stworzyć także czcionki pogrubione czy pochylone, jeśli są używane w źródłowym pliku html.

W bibliotece DOMPDF znajduje się plik class.pdf.php (w katalogu dompdf/lib/), który niestety trzeba będzie podmienić na inny zawierający drobne poprawki. Poprawiony plik można zobaczyć tutaj.

Na koniec należy usunąć definicję kodowania z meta tagów w konwertowanym pliku html i wczytać zawartość tegoż pliku dokonując przy tym konwersji kodowania na Windows-1250 np. poprzez funkcję iconv():

PHP:
  1. $pdf = new DOMPDF();
  2. $pdf->load_html(iconv('UTF-8','Windows-1250', file_get_contents('zrodlowy.html')));
  3. $pdf->render();
  4. $pdf->stream('wynik.pdf');

Po wykonaniu powyższego kodu nastąpi wczytanie pliku zrodlowy.html, zmiana kodowania z UTF-8 na Windows-1250 i konwersja do pliku wynik.pdf, który zostaje wysłany do przeglądarki. Oczywiście źródłowy plik html może zawierać inne kodowanie i należy to uwzględnić podczas konwersji.

15 Responses to “DOMPDF i polskie znakie”

  1. Łukasz Wojciechowski

    Hej

    Prosty, krótki wpis a uratował mi tyłek :)
    Próbowałem zmniejszyć rozmiar wynikowego PDF’a - niestety bezskutecznie. Gdy miałem mały rozmiar pliku to miałem krzaki w pliku wynikowym.

    Wszystko chyba dlatego, że używałem mapy kodowania CP1250 co wydawało mi się oczywiste. Okazuje się, że powinienem był użyć ISO-8859-2.

    Dzięki, pozdrawiam

    December 13th, 2007 | 15:32
  2. Łukasz

    Hej,
    Chciałem zapytać dokładniej o dodanie polskich fontów. Który plik mam usunąć?
    dompdf_font_family_cache - ten?
    a zostawić - dompdf_font_family_cache.dist ?
    Bardzo proszę o odpowiedź.
    Z góry dziękuję i pozdrawiam

    December 21st, 2007 | 16:04
  3. Marcin

    Cześć, opis super jednak nie mogę pobrać poprawionego piliku class.pdf.php, proszę o poprawkę linku do pliku źródłowego.

    March 5th, 2008 | 23:17
  4. Markens

    A co powiecie na taki błąd:
    Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 5880 bytes) in ….

    I od razu dodam, że nie przeskoczę tego zwiekszając limit pamięci bo serwer nie mój…
    Ciekawostką jest, że po zapisie na localhoscie (memory limit 64M, mniejsze nei wystarczyly) plik wynikowy ma 980kB, to czemu podczas generowania zżera tyle pamięci?

    Pozdrav
    Marcin

    March 14th, 2008 | 01:01
  5. Zostawię komentarz dla potomnych szukających rozwiązania problemu.
    Mi działa bez dokonywania konwersji, aczkolwiek w dompdf_font_family_cache.dist właściwie wyłączyłem inne czcionki niż Arial.
    Tutaj znajdziecie gotowe i działające archiwum: http://qck.pl/dompdf
    Pozdrawiam

    April 2nd, 2008 | 00:29
  6. Michał

    Witam, walczę właśnie z dompdf… mozolnie :) byłaby szansa na info jakie zmiany powinny byc wprowadzone w class.pdf.php?… ten zamieszczony plik jest identyczny z tym z dystrybucji (compare w Notepad++)… z góry wielkie dzięki…

    July 7th, 2008 | 20:58
  7. Michał

    oki… znalazłem dobry plik… wszystko działa ok… http://pdf.brabosoft.com/class.pdf.php.zip

    July 7th, 2008 | 21:18
  8. 0xhiryuu

    Nie meczcie sie ten opis nie dziala :(

    July 18th, 2008 | 20:22
  9. Jupeter

    Działać działa - ale nie wszystkie znaki.

    Mi nie działa litera “ś” k?óra pokazuje się ?.

    Ktoś podziela ten sam problem? Może jakieś sugestie jak go rozwiązać?

    September 3rd, 2008 | 17:16
  10. Jupeter

    Poprawka - wszystko działa :) Złe kodowanie przy iconv zdeklarowałem (zamiast windows-1250 było ISO-8859-2).

    Super. Dziękuję twórcy bloga za zaoszczędzony czas przed debugerem ;)

    September 3rd, 2008 | 17:18
  11. leaf

    Działa super! Dzięki! Od razu przekonwertowalem sobie wszystkie fonty z windowsa (opentype) i dokumenty generuje sie idealnie :)

    September 17th, 2008 | 16:49
  12. Konraddo

    Wielkie dzięki, uratowałeś mnie, wszystko smiga!!!

    October 30th, 2008 | 13:14
  13. Michal

    Zadziałało mi na serwerze testowym. Jednak w momencie gdy przenioslem skrypt na serwer wlasciwy (na ktorym ma to byc docelowo uruchomione) to skrypt zwraca nastepujacy wyjatek:

    Fatal error: Uncaught exception ‘PDFlibException’ with message ‘Handle parameter or option of type ‘font’ has bad value 0′ in /dompdf/include/pdflib_adapter.cls.php:750 Stack trace: #0 /dompdf/include/pdflib_adapter.cls.php(750): PDFlib->setfont(0, 8) #1 /dompdf/include/font_metrics.cls.php(119): PDFLib_Adapter->get_font_height(’/benefitadmin/a…’, 8) #2 /dompdf/include/text_frame_reflower.cls.php(165): Font_Metrics::get_font_height(’/benefitadmin/a…’, 8) #3 /dompdf/include/text_frame_reflower.cls.php(284): Text_Frame_Reflower->_layout_line() #4 /dompdf/include/frame_decorator.cls.php(387): Text_Frame_Reflower->reflow() #5 /dompdf/include/block_frame_reflower.cls.php(408): Frame_Decorator->reflow() #6 /dompdf/include/frame_decorator.cls.php(387): Block_Frame_Reflower->reflow() #7 /dompdf/include/bl in /dompdf/include/pdflib_adapter.cls.php on line 750

    Na obu serwerach uprawnienia dostepu ustawilem na 777, wiec to raczej nie tu wystepuje blad.

    podejrzewam, ze chodzi o konfiguracje PHP.

    Czy ktos wie, w ktorej czesci konfiguracji mam szukac, aby to naprawic?

    November 9th, 2008 | 21:33
  14. Denki bardzo!
    works perfect, thanks a lot!
    (sorry, negadam dobre po polsku.)

    November 21st, 2008 | 01:03
  15. Medicamentspot.com International Legal RX Medications. Special Internet Prices (up to 40% off average US price). NO PRIOR PRESCRIPTION REQUIRED!…

    Combivir@buy.online” rel=”nofollow”>.…

    June 24th, 2010 | 15:20

Leave a Reply

You must be logged in to post a comment.