LogicSoft.com.pl - systemy informatyczne

html2fpdf - czyli konwersja HTML na PDF

Uwaga, otwiera nowe okno. PDFDrukujEmail

W ostatnim czasie potrzebne mi było generowanie dynamicznych dokumentów PDF za pomocą języka PHP. Przeszukując internet natknąłem się na kilka ciekawych bibliotek, w tym: mPDF, TCPDF. Ale moją uwagę przykuła stara biblioteka html2fpdf. Umożliwia ona konwersje podstawowych tagów HTML na dokumenty PDF. Jest ona rozszerzeniem innej biblioteki: fPDF.

W celu ukazania jej działania zamieszczam niewielki kod HTML, który następnie za pomocą tej biblioteki zostanie zapisany jako dokument PDF. Poniższy plik zapisujemy jako test.html.

<!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>
<title>Przykład konwersji HTML na PDF - Mateusz Pustelak</title>
<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
</head>
<body>
<div style="text-align:left;font-size:12px;">Mateusz Pustelak<br /><a href="http://www.mpustelak.pl">mPustelak.pl - programowane, tworzenie stron www</a></div>
<p style="text-align:center; font-size:24px; font-weight:bold;">Przykład wycentrowanego tytułu</p>
<p><div>Przykład wyliczenia:</div>
<ol>
<li>Wyliczenie 1,</li>
<li>Wyliczenie 2,</li>
<li>Wyliczenie 3,</li>
<li>Wyliczenie 4,</li>
<li>Wyliczenie 5,</li>
<li>Wyliczenie 6,</li>
<li>Wyliczenie 7,</li>
<li>Wyliczenie 8.</li>
</ol>
</p>
<p>Polskie znaki: ż ź ć ł ó ę ś ą</p>
<div>Tabele</div>
<table border="1">
<tr><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td></tr> 
<tr><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td></tr> 
<tr><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td></tr> 
<tr><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td><td>asdasdasd</td></tr> 
</table>
<p style="text-align:right;text-decoration:underline">Tekst podkreślony <br />do prawej strony.</p>
<p style="font-size:18px;font-weight:bold;text-decoration:line-through">Tekst przekreślony, pogrubiony.</p>

</body>
</html>

Oraz plik index.php, którego zadaniem będzie przekonwertowanie pliku HTML na PDF.

<?php 
require_once('html2fpdf.php');
ob_start();
include_once('./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("wynik.pdf", "D");
?>

Tak przygotowane dane umożliwiają nam stworzenie i zapisanie pliku wynik.pdf na podstawie HTML. Kliknij w odnośnik, w celu zobaczenia wyniku tej konwersji.

Biblioteka html2fpdf umożliwia konwersje tylko podstawowych tagów. Znacznym mankamentem jest brak polskich znaków w podstawowym, ściągnietym z internetu skrypcie. Jednak po wielu poszukiwaniach udało mi się rozwiązać ten problem, a rozwiązanie tego zostanie poniżej opisane.

W celu skorzystania z opisywanej w tym artykule biblioteki, należy ściągnać podstawową paczkę html2fpdf, oraz plik ttf2pt1.exe z internetu. Skorzystamy także z czcionek zawartych w folderze Windows/Fonts, aby mieć możliwość zapisu polskich znaków. Plik *.zip należy rozpakować na naszym serwerze PHP, następnie do katalogu (ścieżka)/html2fpdf/font/makefont przekopiować plik ttf2pt1.exe, oraz interesujące nas czcionki (np: arial). Kolejnym krokiem jest wejście w wiersz poleceń (cmd) do naszego katalogu, czyli: (ścieżka)/html2fpdf/font/makefont oraz wywołanie polecenia: "ttf2pt1 -b -L iso-8859-2.map arial.ttf arialpl". W ten sposób otrzymaliśmy pliki arialpl.afm oraz arialpl.pfb.

Kolejnym krokiem jest utworzenie pliku index.php w folderze z otrzymanymi plikami, czyli w tym przypadku: (ścieżka)/html2fpdf/font/makefont. Powinien on zawierać niewielki kod PHP niżej opisany:

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

Kod ten utworzy nam dwa dodatkowe pliki: arialpl.php oraz arialpl.z. Teraz należy je przekopiować do folderu (ścieżka)/html2fpdf/font. To samo należy zrobić, jeżeli w plikach PDF chcemy mieć pogrubiony, pochylony, oraz pogrubiony i pochylony jednocześnie tekst. To jednak nie jest jeszcze koniec. W tym momencie należy odpowiednio przerobić plik konfiguracyjny: html2fpdf.php, aby polskie znaki były prawidłowo wyświetlane. Polega to na tym, że za definicją funkcji HTML2FPDF($orientation='P',$unit='mm',$format='A4'), a konkretniej wywołaniem metody: $this->DisplayPreferences(''); należy wkleić odpowiedni kod PHP.

$this->AddFont('arialpl', '', 'arialpl.php');  
$this->AddFont('arialpl', 'B', 'arialbdpl.php');  
$this->AddFont('arialpl', 'I', 'arialipl.php');  
$this->AddFont('arialpl', 'BI', 'arialbipl.php');
$this->SetFont('arialpl','',12);

Tak samo należy postąpić ze wszystkimi wywoływanymi metodami SetFont() w pliku konfiguracyjnym, aby rodzaj czcionki nie powracał do wartości domyślnej bez polskich znaków (można także stworzyć inne rodzaje czcionek i je ustawić dla poszczególnych tagów, np: textarea, pre itd...)

Należy tutaj również pamiętać o tym, aby pliki HTML zapisywać w kodowaniu UTF-8, gdyż tylko w ten sposób mogą być one przekonwertowane poprawnie (bez "krzaczków").