20
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:
-
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():
-
$pdf = new DOMPDF();
-
$pdf->render();
-
$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.
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
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
Cześć, opis super jednak nie mogę pobrać poprawionego piliku class.pdf.php, proszę o poprawkę linku do pliku źródłowego.
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
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
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…
oki… znalazłem dobry plik… wszystko działa ok… http://pdf.brabosoft.com/class.pdf.php.zip
Nie meczcie sie ten opis nie dziala
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ć?
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
Działa super! Dzięki! Od razu przekonwertowalem sobie wszystkie fonty z windowsa (opentype) i dokumenty generuje sie idealnie
Wielkie dzięki, uratowałeś mnie, wszystko smiga!!!
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,
#1 /dompdf/include/font_metrics.cls.php(119): PDFLib_Adapter->get_font_height(’/benefitadmin/a…’,
#2 /dompdf/include/text_frame_reflower.cls.php(165): Font_Metrics::get_font_height(’/benefitadmin/a…’,
#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?
Denki bardzo!
works perfect, thanks a lot!
(sorry, negadam dobre po polsku.)