Logo


Zapraszam pod nowy adres, pod którym mam nadzieję zmiany będą częściej http://devel.jdstar.pl.

Generowanie dokumentów PDF z HTML w PHP (dompdf, HTML2FPDF, TCPDF)

2007-06-22 JDStar


Ostatnie artykuły

Próbnik koloru (color picker?) - pomoc w wyborze schematu kolorystycznego strony komentarzy [2]
Konwersja z HTML do PDF w PHP - dompdf komentarzy [3]
Generowanie dokumentów PDF z HTML w PHP (dompdf, HTML2FPDF, TCPDF) komentarzy [37]
Podpowiedzi na www valid XHTML - czyli dymki, tooltip'y lub inne nazwy (nie wiem jakie) komentarzy [13]
Rozszerzenia Firefox'a, których używam - przydatne dla webdeveloperów/webmasterów komentarzy [7]

Na fali "modnych" ostatnio e-formularzy, pomyślałem że ja też coś takiego zrobię. Konieczna do tego jest konwersja dokumentu / strony do formatu PDF (ja użyję bibliotek PHP)', '

Na pierwszy rzut biblioteka HTML2FPDF - http://html2fpdf.sourceforge.net

 To, że tę bibliotekę trzeba ściągnąć, rozpakować itp itd nie będę pisał - to jest oczywiste.

Co potrzebne:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
<meta name="generator" content="HTML Tidy, see www.w3.org" />
<title>e-Forms by Jacek Dziura</title>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
</head>
<body> <p style="text-align: right;">Tomaszów, dnia. r.</p> <br />AB.7351 A - ..................../................ <br /> <address>(nr rejestru organu właściwego do wydania pozwolenia)</address> <div style="text-align: center;"> <h2>WNIOSEK<br /> o pozwolenie na budowę / rozbiórkę*</h2> </div> <h2 style="text-align: center;">Starosta<br /> ul.Lwowska 68, 22-600 Tomaszów Lub.</h2> <div style="text-align: center;"> <address>(nazwa organu wydającego pozwolenie)</address> </div> <h4>Inwestor:</h4> <div style="text-align: center;"> <address>(imię i nazwisko lub nazwa instytucji oraz adres)</address> </div> <h4 style="text-align: left;">na podstawie art. 32 i 33 ustawy z dnia 7 lipca 1994 r. Prawo budowlane (Dz. U. 2006 r. Nr 156, poz.</h4> <h4 style="text-align: left;">1118), wnoszę o wydanie decyzji o pozwolenie na budowę / rozbiórkę*:</h4> <div style="text-align: center;"> <address>(nazwa i rodzaj oraz adres całego zamierzenia budowlanego, rodzaj/-e obiektu/-ów bądź robót
budowlanych, oznaczenie działki ewidencyjnej</address> <address>wg ewidencji gruntów i budynków poprzez określenie obrębu ewidencyjnego oraz numeru działki
ewidencyjnej)</address> </div> <div> <p>Jakis tekst<br /> <em>[ąśężźćńłó]</em> ąśżźĄŚŹĆŃŁĘÓóęłąść <strong>{ĄŚĘŻŹĆŃŁÓ}</strong><br /> (nazwa i rodzajóąłźćżęńśłó oraz adres całego zamierzenia budowlanego, rodzaj/-e obiektu/-ów bądź robót budowlanych, oznaczenie działki ewidencyjnej wg ewidencji gruntów i budynków poprzez określenie obrębu ewidencyjnego oraz numeru działki ewidencyjnej)</p> Do wniosku o pozwolenie na budowę dołączam*: <ol> <li>Cztery egzemplarze projektu budowlanego wraz z opiniami, uzgodnieniami i pozwoleniami i innymi</li> <li>Wymaganymi przepisami szczególnymi oraz zaświadczeniem o którym mowa w art. 12 ust 7 ustawy - Prawo budowlane,</li> <li>Oświadczenie o posiadanym prawie do dysponowania nieruchomością na cele budowlane,</li> <li>Decyzję o warunkach zabudowy i zagospodarowania terenu lub wypis z planu miejscowego zagospodarowania przestrzennego, jeśli jest wymagany zgodnie z przepisami ustawy o planowaniu i zagospodarowaniu,</li> <li>Specjalistyczną opinię, o której mowa w art. 33 ust. 3 ustawy - Prawo budowlane,</li> <li>Postanowienie o uzgodnieniu, z właściwym organem administracji architektoniczno - budowlanej, projektowanych rozwiązań w zakresie, o którym mowa w art.33 ust.2 pkt. 4 ustawy - Prawo budowlane,</li> <li>Upoważnienie udzielone osobie pełnomocnika działającego w moim imieniu.</li> </ol> </div> </body> </html>

<?php
require_once(''html2fpdf.php'');
ob_start();
include_once(''../html_test.html'');
$htmlbuffer = ob_get_contents();
ob_end_clean();
$pdf = new HTML2FPDF(''P'',''mm'',''A4''); 
$pdf->AddPage();
$pdf->UseCSS(true); 
$htmlbuffer = iconv("UTF-8", "ISO8859-2", $htmlbuffer);
$pdf->WriteHTML($htmlbuffer);
$pdf->Output("file.pdf", "D");
?> 

Tak przygotowane pliki są gotowe do generowania "w locie" plików PDF.

Niestety biblioteka HTML2FPDF nie wspiera Unicode UTF-8, więc konieczna jest konwersja z UTF-8 do ISO8859-2. Oprócz tej konwersji, aby zadziałało nam generowanie PDF z polskimi fontami musimy podmienić w bibliotece czcionki, na takie, które zawierają polskie ogonki w kodowaniu ISO8859-2. Czcionki bierzemy z katalogu FONTS z Windows''a, narzędzie są w katalogu makefont biblioteki, a plik ttf2pt1 szukamy w googlach:).

Poniżej sposób ich tworzenia.

ttf2pt1 -b -L iso-8859-2.map times.ttf timespl


<?php
require(''makefont.php'');
Makefont(''timespl.pfb'', ''timespl.afm'', ''iso-8859-2'');
?> 

Powstaną pliki .php i .z - kopiujemy je do katalogu font w bibliotece html2fpdf.

Aby uzywać ich we wszystkich konwersjach trzeba dokonać zmian w pliku html2fpdf.php - zamieniamy wszystkie wywołania "$this->SetFont(''Arial'',''B'',9);" na np. takie (zależy od rodzaju czcionki, którą sobie przygotujemy: "$this->SetFont(''timespl'',''B'',9);" z tego względu, że po ustwieniu ich w skrypcie poprzez: "$pdf->SetFont(''timespl'','''',8);" niestety po pierwszym paragrafie lub innym elemencie, wracają do ustawień domyślnych oraz dodajemy naszą czcionkę na początku funkcji function HTML2FPDF($orientation='P',$unit='mm',$format='A4'):

<?php
	$this->AddFont('timespl', '', 'timespl.php'); 
	$this->AddFont('timespl', 'B', 'timesbdpl.php'); 
	$this->AddFont('timespl', 'I', 'timesipl.php'); 
	$this->SetFont('timespl','',10);?> 

Tak wygląda gotowy wygenerowany plik PDF.

Kolejne sposoby użycia innych bibliotek (dompdf, TCPDF, xHTML2PDF) opiszę w najbliższym czasie

dodaj komentarz

1: 2007-09-04 14:13:51, Falcon:
Świetna sprawa ale wkradł się jeden błąd (przy najmniej u mnie to błąd - pokazuje nieznaną czcionke) Dodawanie fontów powinno odbywać się nie na początku funkcji: HTML2FPDF($orientation='P',$unit='mm',$format='A4') ,a przed pierwszą deklaracją fontu w tej funkcji.
Czyli zaraz po: $this->DisplayPreferences('');

Pozdrawiam

2: 2007-09-21 10:27:24, debbie:
ja mam problem właśnie odnośnie znaczników html'a
Od momentu kiedy wstawie jakiś kod np <pre> niewyświetla mi polskich czcionek. czcionki wygenerowałem według instrukcji wyżej i jest ok. kod wygląda tak:

<?php
define('FPDF_FONTPATH','font/');
require_once('html2fpdf.php');
ob_start();

include_once('wydruk.php');
$htmlbuffer = ob_get_contents();
ob_end_clean();
$pdf = new HTML2FPDF('P','mm','A4');
$pdf->SetFont('courpl','',11);
$pdf->AddFont('courpl', '', 'courpl.php');
$pdf->AddPage();
$pdf->UseCSS(true);
$pdf->WriteHTML($htmlbuffer);
$pdf->Output("file", "D");

?>

czcionka jest dodana zaraz po:
$pdf = new HTML2FPDF('P','mm','A4');

pozmieniałem wszystkie $this->SetFont('Arial','',11);
na $this->SetFont('courpl','',11);
ale wyrzuca mi :
FPDF error: Undefined font: courpl
i niewiem co z tym zrobić?? był bym wdzięczny za informacje:)

3: 2007-09-21 14:21:31, JDStar:
Przenieś definicję dodawania czcionki do klasy html2fpdf.php
$pdf->AddFont('courpl', '', 'courpl.php');
Powinno pomóc. Jak nie to napisz maila do mnie.

4: 2007-12-11 14:20:36, lukasz :
Czy mógłby mi ktoś przesłać działającą paczkę? Ja zrobiłem wszytstko to oczym tu była mowa i nic, ciągle niemam polskich liter:/

5: 2008-02-07 01:21:27, Michal:
da rade wrzucić paczkę z tymi czcionkami ?

6: 2008-03-12 23:10:36, rajcho:
a mi sie pojawia dziwna sprawa. Generuje tylko pierwsze dwa wersy.
Po numerze AB.cos tam juz nic nie mam pusta strona. Wie ktos moze o co chodzi?

7: 2008-03-27 14:38:57, yoanna:
wywala blad :
Warning: Cannot modify header information - headers already sent by (output started at /usr/local/apache/www/...

on line 1678


FPDF error: Some data has already been output to browser, can't send PDF file

o co choidzi??

8: 2008-03-31 12:37:53, Jacek:
@yoanna
Zanim generujesz PDF'a masz coś wysyłane do przeglądarki - np. błąd:) lub chociażby "spację"

9: 2008-04-30 14:51:29, tomek:
przy takiej kombinacji :
$htmlbuffer = iconv("UTF-8", "ISO8859-2", $htmlbuffer);
generuje się pusty pdf, przy zmianie na
$htmlbuffer = iconv("UTF-8", "ISO8859-2//ignore", $htmlbuffer);
wyświetla sie tekst ale wszystkie polskie znaki znikają, Może jakaś wskazówka?
pozdrawiam

10: 2008-05-06 13:51:01, janek:
coś nie tak , spróbujcie dodać tabele w tabeli, rozjeżdża się kompletnie...

11: 2008-05-06 15:34:21, GD:
A jaki niby jest cel zagnieżdżania tabel? - do layoutów tabel się nie stosuje heheh.
A dompdf jest chyba nieco lepszy od HTML2FPDF.

12: 2008-05-16 12:55:42, domel:
Co zrobić jeśli chcę przestawić orientację dokumentu na poziomą?
Oraz czy mogę wygenerować pdf bezpośrednio ze skryptu php (a nie html)?

13: 2008-05-16 13:49:26, domel:
Zmieniłem parametr konstruktora z P na L i mam już orientację poziomą, ale rozjeżdża mi się stronicowanie. Pdf-a generuję na podstawie tabeli. Przy orientacji pionowej nie było problemów i jeśli dany wiersz nie mieścił się już na stronie to cały był przenoszony na nową stronę.
W przypadku orientacji poziomej tabela się rozjeżdża.

14: 2008-05-30 12:29:03, Piocho:
Niestety po wielu probach tak HTML2FPDF jak i DOMPDF nie daje rady zrobic tak zeby polskie fonty dzialaly. Czy ktos moglby wrzucic jakas cala przygotowana i dzialajaca paczke?

15: 2008-06-13 09:15:24, all_lol:
Przychylam sie do sugestii wrzucenia paczki z PL fontami, bo wszedzie pisza o konwertowaniu, a to jest jakis koszmar.

16: 2008-06-14 12:08:13, GD:
Tylko wystawienie paczki z fontami od M$ chyba nie byłoby zgodne z ich licencją (ale mogę się mylić)

17: 2008-07-07 09:22:15, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

18: 2008-07-07 09:22:22, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

19: 2008-07-07 09:22:23, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

20: 2008-07-07 09:22:23, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

21: 2008-07-07 09:22:23, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

22: 2008-07-07 09:22:26, remik:
Witam,
moja walka z polskimi fontami także okazała się porażką. Jak to możliwe bardzo bym prosił i bym był bardzo wdzięczny aby ktoś mi wysłał gotową paczkę na maila.
Pozdrawiam

23: 2008-09-04 10:38:44, ammpp:
A ja zrobiłem. Podmieniłem oryginalne fonty na te zrobione opisaną tu metodą. Dodałem sobie też dynamiczne dodawanie fontów (żeby nie generować PDF-ów, które mają niepotrzebnie 600kB).
I zadziałało :)

24: 2008-11-04 09:51:07, Olimpia:
ja mam podobny problem jak janek:
-------
coś nie tak , spróbujcie dodać tabele w tabeli, rozjeżdża się kompletnie...
-------

Ja również mam potrzebę zagnieżdżenia tabeli i pdf z takiego szablonu jest "rozjechany". Czy ktoś się z tym poradził?

25: 2008-12-08 17:51:09, debbie:
Witam! U mnie pojawił się kolejny problem:
mianowicie manipulacja rozmiarem czcionki.
Wie ktoś może w jaki sposób zmieniać rozmiar czcionki??? W powyższym skrypcie np napis
<h2 style="text-align: center;">Starosta<br />
ul.Lwowska 68, 22-600 Tomaszów Lub.</h2>
Jest w pdfie w dosyć dużej czcionce mimo tego iż nie jest nigdzie zdefiniowana wielkość czcionki.
Chodzi mi konkretnie o napis pod kropkami żeby był mniejszy niż cała reszta. Był bym bardzo wdzięczny za pomoc

26: 2009-01-03 14:22:56, filip:
szczerze mówiąc bardzo hujowy ten tutek...

27: 2009-12-22 11:15:35, nie podano:
co nie

28: 2010-01-12 22:55:39, lechu:
a u mnie z kolei wywala takie coś Warning: filesize(): stat failed for font/timespl.z in D:\apache2triad\htdocs\eceramik\system2009\admin\addons\html2fpdf\fpdf.php on line 1813 FPDF error: Font file not found w momencie jak dodaje czcionke po $this->DisplayPreferences(''); a jak przed czyli zaraz na początku funkcji to FPDF error: Undefined font: timespl i nie wiem co jest grane wszystko robie jak napisane w tutku:/

29: 2010-01-24 16:32:39, artur:
lechu...popatrz na datę tego tutka i zapoznaj się z mPDF , pozdro...

30: 2010-02-03 22:09:40, asdasd:
asdasdasd

31: 2011-05-06 19:09:33, rd:
Nie polecam. Jeśli chcesz zrobić jakieś proste pdf, lepiej ręcznie. Jeśli chcesz coś skomplikowanego to natrafiamy na niezliczone komplikacje: polskie czcionki (a używam kilku!), tabele rozjeżdżają się (szczególnie te w tabelach), zdjęcia pojawiają się w oryginalnych rozdzielczościach (wiem, mogę je zmniejszyć, ale wtedy tracę na jakości wydruku), ogólnie cały css . Moim zdaniem nowe okienko z porządnie 'zcssowanym' html'em będzie znacznie lepszym pomysłem.

32: 2011-05-12 15:17:59, profile aluminiowe:
zobaczę co da się zrobić z tego narzędzia...

33: 2011-05-26 13:06:50, AP:
U mnie zadzialalo - generuje sie ladny pdf z polskimi czcionkami. W tekscie nalezaloby dodac, ze tworzac plik przykladowy HTML z pozwoleniem na budowe, trzeba odpowiednio zakodowac polskie znaki w UTF-8, aby wyswietlajac sam plik html w przegladarce byly widoczne polskie znaki. Samo zaznaczenie i skopiowanie tekstu i zapisanie jako html_test.html spowoduje, ze polskie znaki beda zle zakodowane i po utworzeniu pdf bedzie zle.

34: 2011-10-23 19:24:44, A:
AP: może podeślesz mi gotową paczkę? jakoś wszystko mi się sypie, mimo, że walczę z tym jak młody wilk:) jeśli będziesz na tak, to odezwij się:) pzdr.

35: 2012-03-14 20:29:06, NT Solution:
Do generowania plików PDF, polecam TCPDF => www.tcpdf.org

36: 2012-10-29 21:01:03, patrycjusz:
Czy możesz po prostu zapodać te zmienione pliki?
times? dla polski będzie wiadomo co z nimi zrobić.
Zapakuj w zip i udostępnij (duży problem z tym jest)

37: 2016-12-09 20:34:52, Anh1988:
Muszę sie wam pochwalić w końcu schudłam - 9 kilo.
Przeszukałam chyba caly polski internet zeby znalezc coś
na odchudzanie i znalazlam. Wygoglujcie sobie: xxally radzi jak szybko schudnac