PDF jego mać

August 11th, 2007

W dzisiejszym odcinku na tapetę bierzemy PDF. A konkretnie PDF + Perl. Przeglądając CPANa w poszukiwaniu modułów do generowania PDF można się posikać ze szczęścia... ale do momentu, aż spróbujesz któregoś użyć. Wszystkie (poza jednym chlubnym wyjątkiem) mają podstawową wadę, której na imię WinAnsiEncoding. Po prostu nie ma bata zobaczyć w wygenerowanych przez nie PDFach innego polskiego ogonka niż tradycyjne "ó".

Zdążyłem się już przekopać przez odpowiednie fragmenty specyfikacji PDF, wyedytować kilka PDFek gołym vimem (hardcore, ale da się to zrobić) itd. Efektem tego był patch na PDF::Reuse, który pozwalał w dość karkołomny sposób pisać w kawałku ISO-8859-2 (ASCII + pliterki). Później jednak (wstawianie tekstu przez BT Ft1 12 Tf 200 50 Td <616263F8> Tj ET, nawet opakowane jakimiś funkcjami pomocniczymi, ciężko uznać za eleganckie rozwiązanie), stwierdziłem, że uzbrojony w więcej informacji na temat PDF, niż kiedykolwiek chciałem, zrobię drugie podejście do PDF::API2.

Dlaczego drugie? Bo pierwsze skończyło się właściwie na przejrzeniu listy klas dłuższej niż niejeden manual i dość bolesnym uświadomieniu sobie, że do sporej części jedyną dokumentacją jest changelog, z którego nic nie wynika. A tu zonk. Okazało się, że podstawową bolączką PDF::API2 jest właśnie gówniana dokumentacja, a sam moduł całkiem nieźle daje radę. Taki prosty przykład:

my $pdf = PDF::API2->new;
my $page = $pdf->page;
my $gfx = $page->gfx;
my $font = $pdf->ttfont('whatever.ttf');
$gfx->textlabel(57,  306, $bodyfont, 12, 'półśkię ÓGÓŃKI');
return $pdf->stringify;
Nie tak źle, co? Jeżeli chcesz np. użyć gotowej PDFki jako szablon, wystarczy pierwsze dwie linijki zamienić na:
my $pdf = PDF::API2->open('szablon.pdf');
my $page = $pdf->openpage(1);
# czy po której tam stronie chcesz pisać
Jedna uwaga dotycząca czcionek: muszą oczywiście zawierać polskie znaczki i niestety nie mogą być w formacie .otf (OpenType), bo PDF::API2 sobie z nimi nie radzi (czy też raczej nie radzą sobie z nim później przeglądarki PDF). Do ich konwersji można użyć całkiem fajnego narzędzia fontforge (jest spakietowane w Debianie i Ubuntu), które ma niesamowicie obleśny interfejs, ale .otf -> .ttf konwertuje bez problemów.

Sorry, comments are closed for this article.