Rysowanie
Geometria
PDF używa takiej samej geometrii jak PostScript. Zaczyna z lewego dolnego
rogu strony, a jednostka domyślnie jest wyrażana w punktach (1/72 cala).
Rozmiar strony może być pobrany z obiektu strony:
getWidth();
$height = $pdfPage->getHeight();
]]>
Kolory
PDF ma bardzo rozbudowane możliwości reprezentowania kolorów. Zend_Pdf
wspiera palety Grey Scale, RGB oraz CMYK. Każda z nich może być użyta
wszędzie, gdzie jest wymagany obiekt Zend_Pdf_Color. Klasy
Zend_Pdf_Color_GrayScale, Zend_Pdf_Color_Rgb oraz
Zend_Pdf_Color_Cmyk zapewniają taką funkcjonalność:
HTML style colors are also provided with Zend_Pdf_Color_Html class:
Rysowanie figur
Wszystkie operacje rysowania mogą być przeprowadzone w kontekście strony PDF.
Klasa Zend_Pdf_Page zapewnia zestaw podstawowych operacji rysowania:
Wypisywanie tekstu
Operacje wypisywania tekstu także są przeprowadzone w kontekście strony PDF
Możesz wypisać pojedynczą linię tekstu w dowolnym miejscu na stronie podając
współrzędne x oraz y linii bazowej. W operacjach wypisywania tekstu używana
jest czcionka o aktualnie ustawionym kroju oraz rozmiarze (zobacz poniżej
szczegółowy opis).
Wypisywanie tekstu na stronie
drawText('Hello world!', 72, 720);
...
]]>
Domyślnie, łańcuchy znaków są interpretowane przy użyciu metod kodowania
znaków biężacych ustawień lokalnych. Jeśli masz łańcuch znaków używający
innych metod kodowania (na przykład dane jako łańcuch znaków UTF-8 odczytany
z pliku na dysku, lub łańcuch znaków MacRoman pobrany z bazy danych),
możesz wskazać kodowanie znaków podczas wypisywania tekstu i Zend_Pdf
przeprowadzi dla ciebie konwersję. Możesz użyć źródłowego łańcucha znaków
w dowolnym kodowaniu obsługiwanym przez funkcję PHP iconv():
Wypisywanie tekstu zakodowanego w UTF-8 na stronie
drawText($unicodeString, 72, 720, 'UTF-8');
...
]]>
Użycie czcionek
Metoda Zend_Pdf_Page::drawText() używa bieżącego kroju
oraz rozmiaru czcionki dla strony, które ustawia się za pomocą metody
Zend_Pdf_Page::setFont():
Dokumenty PDF obsługują czionki PostScript Type 1 oraz TrueType, tak samo
dobrze jak dwa wyspecjalizowane typy PDF, Type 3 oraz czcionki złożone Type 0. Jest
także 14 standardowych czcionek Type 1 wbudowanych w każdą przeglądarkę PDF:
Courier (4 style), Helvetica (4 style), Times (4 style), Symbol, and Zapf Dingbats.
Zend_Pdf obecnie obsługuje 14 standardowych czcionek PDF tak samo dobrze
jak twoje własne czcionki TrueType. Obiekty czcionek są obsługiwane za pomocą
jednej z dwóch metod fabryk: Zend_Pdf_Font::fontWithName($fontName)
dla 14 standardowych czcionek PDF lub Zend_Pdf_Font::fontWithPath($filePath)
dla własnych czcionek.
Tworzenie standardowej czcionki
setFont($font, 36);
...
]]>
Stałe dla nazwa 14 standardowych czcionek PDF są zdefiniowane w klasie Zend_Pdf_Font:
Zend_Pdf_Font::FONT_COURIER
Zend_Pdf_Font::FONT_COURIER_BOLD
Zend_Pdf_Font::FONT_COURIER_ITALIC
Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC
Zend_Pdf_Font::FONT_TIMES
Zend_Pdf_Font::FONT_TIMES_BOLD
Zend_Pdf_Font::FONT_TIMES_ITALIC
Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC
Zend_Pdf_Font::FONT_HELVETICA
Zend_Pdf_Font::FONT_HELVETICA_BOLD
Zend_Pdf_Font::FONT_HELVETICA_ITALIC
Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC
Zend_Pdf_Font::FONT_SYMBOL
Zend_Pdf_Font::FONT_ZAPFDINGBATS
Możesz także użyć dowolnej czcionki TrueType (która najcześciej ma rozszerzenie
'.ttf') lub czcionki OpenType (rozszerzenie '.otf') jeśli zawiera czcionke
zrobioną według wytycznych TrueType. Obecnie nieobsługiwane, ale planowane
w przyszłych wersjach są pliki czcionek Mac OS X .dfont oraz pliki Microsoft
TrueType Collection (rozszerzenie '.ttc').
Aby użyć czcionki TrueType, musisz podać pełną ścieżke do pliku czcionki.
Jeśli z jakiegoś powodu nie może on być odczytany, lub nie jest to czcionka
TrueType, metoda fabryki wyrzuci wyjątek:
Tworzenie czcionki TrueType
setFont($goodDogCoolFont, 36);
...
]]>
Domyślnie własne czcionki będą osadzone w wynikowym dokumencie PDF. To
pozwala odbiorcom oglądać stronę taką, jaka była zamierzona, nawet gdy
nie mają zainstalowanych w systemie potrzebnych czcionek. Jeśli ważny
jest dla ciebie rozmiar pliku, możesz zażądać, aby plik czcionki nie
był osadzony przekazując opcję 'nie osadzaj' do metody fabryki:
Tworzenie czcionki TrueType, ale bez osadzania jej w dokumencie PDF.
setFont($goodDogCoolFont, 36);
...
]]>
Jeśli plik czcionki nie jest osadzony, ale odbiorca pliku PDF posiada taką
czcionkę zainstalowaną w swoim systemie, zobaczy on dokument w sposób
identyczny z zamierzonym. Jeśli nie ma zainstalowanej odpowiedniej czcionki,
przeglądarka PDF użyje najlepszej aby zastąpić czcionkę.
Niektóre czcionki mają bardzo specyficzne zasady licencjonowania, które
uniemożliwiają osadzenie ich w dokumentach PDF. Także nie złamiesz tych
zasad, ponieważ gdy spróbujesz użyć czcionkę, która nie może być osadzona
metoda fabryki wyrzuci wyjątek.
Możesz wciąż użyć tych czcionek, ale musisz przekazać odpowiedni parametr
w celu nieosadzenia czcionki, lub w prosty sposób zignorować wyjątek:
Nie wyrzucanie wyjątku dla czcionek które nie mogą być osadzone.
Ta technika zignorowania wyjątku jest przydatna, gdy pozwalasz użytkownikowi
końcowemu wybierać własne czcionki. Czcionki, ktore mogą być osadzone,
będą osadzone w dokumencie PDF; te które nie mogą, nie będą.
Pliki czcionek mogą być duże, czasem osiągająć dziesiątki megabajtów.
Domyślnie wszystkie osadzane czcionki są kompresowane przy użyciu
schematu kompresji Flate, co powoduje zaoszczędzenie średnio 50% miejsca.
Jeśli z jakiegoś powodu nie chcesz kompresować plików czcionek, możesz
to zablokować opcją:
Nie kompresowanie osadzonych czcionek.
Ostatecznie, jeśli potrzebujesz, możesz łączyć opcje osadzania czcionek
używając bitowego operatora LUB:
Łączenie opcji osadzania czcionki.
Wstawianie obrazów
Klasa Zend_Pdf_Pagezapewnia metodę drawImage() do wstawiania
obrazów:
Obiekty obrazów powinny być tworzone za pomocą metody
Zend_Pdf_Image::imageWithPath($filePath) (obecnie
obsługiwane są obrazy JPG, PNG oraz TIFF):
Wstawianie obrazów
drawImage($image, 100, 100, 400, 300);
...
]]>
Ważne! Obsługa JPEG wymaga rozszerzenia PHP GD.
Ważne! Obsługa PNG wymaga rozszerzenia ZLIB skonfigurowanego do obsługi obrazów z kanałem Alpha.
Sprawdź dokumentację PHP aby znaleźć bardziej szczegółowe informacje.
(http://www.php.net/manual/en/ref.image.php).
(http://www.php.net/manual/en/ref.zlib.php).
Styl rysowania linii
Styl rysowania linii jest zdefiniowany przez grubość, kolor linii oraz
ozdobny wzór linii. Wszystkie te parametry mogą być zdefiniowane za pomocą
metod klasy Zend_Pdf_Page:
Styl wypełnienia
Metody Zend_Pdf_Page::drawRectangle(), Zend_Pdf_Page::drawPolygon(),
Zend_Pdf_Page::drawCircle() oraz Zend_Pdf_Page::drawEllipse()
przyjmują argument $fillType jako opcjonalny parametr. Może
on mieć wartość:
Zend_Pdf_Page::SHAPE_DRAW_STROKE - obrysowuje figurę
Zend_Pdf_Page::SHAPE_DRAW_FILL - tylko wypełnia
Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - obrysowuje i wypełnia (domyślnie)
Metoda Zend_Pdf_Page::drawPolygon() przyjmuje także dodatkowy
parametr $fillMethod:
Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (domyślnie)
Dokumentacja PDF opisuje tą zasadę w ten sposób:
Zasada nonzero winding number określa whether a given point is inside a
path by conceptually drawing a ray from that point to infinity in any direction
and then examining the places where a segment of the path crosses the ray. Starting
with a count of 0, the rule adds 1 each time a path segment crosses the ray
from left to right and subtracts 1 each time a segment crosses from right to left.
After counting all the crossings, if the result is 0 then the point is outside the path;
otherwise it is inside.
Nota: Opisana właśnie metoda nie określa what to do if a path segment coincides
with or is tangent to the chosen ray. Since the direction of the ray is arbitrary,
the rule simply chooses a ray that does not encounter such problem intersections.
For simple convex paths, the nonzero winding number rule defines the inside
and outside as one would intuitively expect. The more interesting cases are those
involving complex or self-intersecting paths like the ones shown in Figure 4.10
(w dokumentacji PDF).
For a path consisting of a five-pointed star, drawn with five connected straight
line segments intersecting each other, the rule considers the inside to be the entire
area enclosed by the star, including the pentagon in the center. For a path composed
of two concentric circles, the areas enclosed by both circles are considered
to be inside, provided that both are drawn in the same direction. If the circles are
drawn in opposite directions, only the "doughnut" shape between them is inside,
according to the rule; the "doughnut hole" is outside.
Zend_Pdf_Page::FILL_METHOD_EVEN_ODD
Dokumentacja PDF opisuje tą zasadę w ten sposób:
An alternative to the nonzero winding number rule is the even-odd rule. This rule
determines the "insideness" of a point by drawing a ray from that point in any
direction and simply counting the number of path segments that cross the ray,
regardless of direction. If this number is odd, the point is inside; if even, the point
is outside. This yields the same results as the nonzero winding number rule for
paths with simple shapes, but produces different results for more complex
shapes.
Figure 4.11 (w dokumentacji PDF) shows the effects of applying the even-odd rule
to complex paths. For the five-pointed star, the rule considers the triangular
points to be inside the path, but not the pentagon in the center. For the two
concentric circles, only the "doughnut" shape between the two circles is considered inside,
regardless of the directions in which the circles are drawn.
Obracanie
Strony PDF mogą być obracane zanim zostaną wykonane jakiekolwiek
operacje rysowania. Może być to zrobione za pomocą metody
Zend_Pdf_Page::rotate():
Zapisywanie/odczytywanie stanu grafiki
W dowolnej chwili stan grafiki (bieżąca czcionka, rozmiar czcionki, kolor linii,
kolor wypełnienia, styl linii, obrót strony, obszar przycinania) może być zapisany
a potem przywrócony. Operacja zapisu zapisuje dane na stos stanu grafiki,
operacja przywrócenia przywraca je ze stosu.
Są dwie metody w klasie Zend_Pdf_Page do tych operacji:
Przycięcie obszaru rysowania
PDF oraz moduł Zend_Pdf obsługują przycięcie obszaru rysowania. Obecny
przycięty obszar ogranicza obszar strony, na który wpływają operacje
rysowania. Na początku jest to cała strona.
Klasa Zend_Pdf_Page zapewnia zestaw metod dla operacji przycinania.
Style
Klasa Zend_Pdf_Style zapewnia funkcjonalność styli.
Styles mogą być użyte w celu przechowania zestawu parametrów stanu grafiki
i następnie zastosowania go na stronie PDF za pomocą jednej operacji:
Klasa Zend_Pdf_Style zapewnia zestaw metod do ustawiania oraz pobierania różnych parametrów stanu grafiki:
Przezroczystość
Moduł Zend_Pdf pozwala na obsługę przezroczystości.
Przezroczystość może być ustawiona za pomocą metody Zend_Pdf_Page::setAlpha():