Some advices for common programmers problems

Zadanie na pozór proste - całkiem trywialne nie jest. Polecenie html2ps nie obsługuje UTF8. Rozwiązaniem jest użycie biblioteki PHP - HTML2FPDF.

FPDF jest niestety zarzuconym projektem i aktualnie jego następca TCPDF jeszcze nie doczekał się skryptu HTML2TCPDF (swoją drogą można by wykonać tą pracę i sportować ten skrypt na nowszy obsługujący UTF8 TCPDF.

Ale załóżmy że nie mamy już czasu i trzeba wyprodukować PDF-a z UTF-em dostępnymi i środkami. Pomocna będzie ta strona.

Fonty Postscriptowe należy przygotować dodatkowo dla każdego typu (Bold, BoldItalic, Italic). W moim przypadku był to font FreeSerif, czyli polecenia wcześniej wykonane (w katalogu html2fpdf/font/makefont)

Pobrać fonty TTF freeserif - ja miałem w systemie operacyjnym PLD Linux.

ttf2pt1 -b -L iso-8859-2.map FreeSerif.ttf freeserif
ttf2pt1 -b -L iso-8859-2.map FreeSerifBold.ttf freeserifb
ttf2pt1 -b -L iso-8859-2.map FreeSerifBoldItalic.ttf freeserifbi
ttf2pt1 -b -L iso-8859-2.map FreeSerifItalic.ttf freeserifi

vim makemefont.php

require('makefont.php');
Makefont('freeserif.pfb', 'freeserif.afm', 'iso-8859-2');
Makefont('freeserifb.pfb', 'freeserifb.afm', 'iso-8859-2');
Makefont('freeserifbi.pfb', 'freeserifbi.afm', 'iso-8859-2');
Makefont('freeserifi.pfb', 'freeserifi.afm', 'iso-8859-2');

php -f makemefont.php

Wcześniej należało zainstalować (pobrać, make install) pakiet ttf2pt1.

Potem jeszcze mała zmiana w html2fpdf - mianowicie dodanie linijek

$this->AddFont('freeserif', '', 'freeserif.php');
$this->AddFont('freeserif', 'B', 'freeserifb.php');
$this->AddFont('freeserif', 'I', 'freeserifi.php');
$this->SetFont('freeserif','',10);

oraz zamiana w całym pliku słowa arial na freeserif.

Potem już działa:
require_once('html2fpdf.php');
$htmlbuffer = file_get_contents('/tmp/upo.html');
$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");