| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024 |
- <sect1 id="zend.pdf.drawing">
- <title>Rysowanie</title>
- <sect2 id="zend.pdf.drawing.geometry">
- <title>Geometria</title>
- <para>
- 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).
- </para>
- <para>
- Rozmiar strony może być pobrany z obiektu strony:
- </para>
- <para>
- <programlisting role="php"><![CDATA[
- $width = $pdfPage->getWidth();
- $height = $pdfPage->getHeight();
- ]]>
- </programlisting>
- </para>
- </sect2>
- <sect2 id="zend.pdf.drawing.color">
- <title>Kolory</title>
- <para>
- 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 <code>Zend_Pdf_Color</code>. Klasy
- <code>Zend_Pdf_Color_GrayScale</code>, <code>Zend_Pdf_Color_Rgb</code> oraz
- <code>Zend_Pdf_Color_Cmyk</code> zapewniają taką funkcjonalność:
- </para>
- <programlisting role="php"><![CDATA[
- // $grayLevel (liczba zmiennoprzecinkowa)
- // 0.0 (czarny) - 1.0 (biały)
- $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
- // $r, $g, $b (liczby zmiennoprzecinkowe)
- // 0.0 (minimalna intensywność) - 1.0 (maksymalna intensywność)
- $color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);
- // $c, $m, $y, $k (liczby zmiennoprzecinkowe)
- // 0.0 (minimalna intensywność) - 1.0 (maksymalna intensywność)
- $color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);
- ]]>
- </programlisting>
- <para>
- HTML style colors are also provided with <code>Zend_Pdf_Color_Html</code> class:
- </para>
- <programlisting role="php"><![CDATA[
- $color1 = new Zend_Pdf_Color_Html('#3366FF');
- $color2 = new Zend_Pdf_Color_Html('silver');
- $color3 = new Zend_Pdf_Color_Html('forestgreen');
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.shape-drawing">
- <title>Rysowanie figur</title>
- <para>
- Wszystkie operacje rysowania mogą być przeprowadzone w kontekście strony PDF.
- </para>
- <para>
- Klasa <code>Zend_Pdf_Page</code> zapewnia zestaw podstawowych operacji rysowania:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Rysuje linię z punktu x1,y1 do x2,y2.
- *
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- */
- public function drawLine($x1, $y1, $x2, $y2);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Rysuje prostokąt.
- *
- * Typy wypełnienia:
- * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - wypełnia i obramowuje
- * prostokąt (domyślnie)
- * Zend_Pdf_Page::SHAPE_DRAW_STROKE - obramowuje prostokąt
- * Zend_Pdf_Page::SHAPE_DRAW_FILL - wypełnia prostokąt
- *
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- * @param integer $fillType
- */
- public function drawRectangle($x1, $y1, $x2, $y2,
- $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Rysuje wielokąt.
- *
- * Jeśli $fillType ma wartość Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE
- * lub Zend_Pdf_Page::SHAPE_DRAW_FILL, wtedy wielokąt jest automatycznie
- * zamknięty. Zobacz szczegółową dokumentację tych metod w dokumentacji
- * PDF (sekcja 4.4.2 Path painting Operators, Filling)
- *
- * @param array $x - array of float (the X co-ordinates of the vertices)
- * @param array $y - array of float (the Y co-ordinates of the vertices)
- * @param integer $fillType
- * @param integer $fillMethod
- */
- public function drawPolygon($x, $y,
- $fillType =
- Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
- $fillMethod =
- Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Rysuje okrąg o środku w punkcie $x, $y o promieniu $radius.
- *
- * Kąty są określane w radianach.
- *
- * Sygnatury metod:
- * drawCircle($x, $y, $radius);
- * drawCircle($x, $y, $radius, $fillType);
- * drawCircle($x, $y, $radius, $startAngle, $endAngle);
- * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
- *
- *
- * Nie jest to do końca okrąg, ponieważ PDF obsługuje jedynie
- * kubiczne krzywe Beziera. Ale jest to bardzo dobre przybliżenie.
- * Różni się od realnego okręgu maksymalnie o 0.00026 promienia
- * (przy kątach PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8,
- * 13*PI/8 oraz 15*PI/8). Przy kątach 0, PI/4, PI/2, 3*PI/4, PI,
- * 5*PI/4, 3*PI/2 oraz 7*PI/4 jest to dokładny okrąg.
- *
- * @param float $x
- * @param float $y
- * @param float $radius
- * @param mixed $param4
- * @param mixed $param5
- * @param mixed $param6
- */
- public function drawCircle($x,
- $y,
- $radius,
- $param4 = null,
- $param5 = null,
- $param6 = null);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Rysuje elipsę wewnątrz określonego prostokąta.
- *
- * Sygnatury metod:
- * drawEllipse($x1, $y1, $x2, $y2);
- * drawEllipse($x1, $y1, $x2, $y2, $fillType);
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
- *
- * Kąty są określane w radianach
- *
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- * @param mixed $param5
- * @param mixed $param6
- * @param mixed $param7
- */
- public function drawEllipse($x1, $y1, $x2, $y2, $param5 = null, $param6 = null, $param7 = null);
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.text-drawing">
- <title>Wypisywanie tekstu</title>
- <para>
- 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).
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Wypisuje linię tekstu w określonym miejscu.
- *
- * @param string $text
- * @param float $x
- * @param float $y
- * @param string $charEncoding (opcjonalny) Kodowanie znaków
- * tekstu. Domyślnie według ustawień lokalizacji.
- * @throws Zend_Pdf_Exception
- */
- public function drawText($text, $x, $y, $charEncoding = '');
- ]]>
- </programlisting>
- <example id="zend.pdf.drawing.text-drawing.example-1">
- <title>Wypisywanie tekstu na stronie</title>
- <programlisting role="php"><![CDATA[
- ...
- $pdfPage->drawText('Hello world!', 72, 720);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- 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 <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code>:
- </para>
- <example id="zend.pdf.drawing.text-drawing.example-2">
- <title>Wypisywanie tekstu zakodowanego w UTF-8 na stronie</title>
- <programlisting role="php"><![CDATA[
- ...
- // Odczytaj z dysku tekst zakodowany w UTF-8.
- $unicodeString = fread($fp, 1024);
- // Wypisz tekst na stronie
- $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
- ...
- ]]>
- </programlisting>
- </example>
- </sect2>
- <sect2 id="zend.pdf.drawing.using-fonts">
- <title>Użycie czcionek</title>
- <para>
- Metoda <code>Zend_Pdf_Page::drawText()</code> używa bieżącego kroju
- oraz rozmiaru czcionki dla strony, które ustawia się za pomocą metody
- <code>Zend_Pdf_Page::setFont()</code>:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia bieżącą czcionkę.
- *
- * @param Zend_Pdf_Resource_Font $font
- * @param float $fontSize
- */
- public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
- ]]>
- </programlisting>
- <para>
- 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.
- </para>
- <para>
- 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: <code>Zend_Pdf_Font::fontWithName($fontName)</code>
- dla 14 standardowych czcionek PDF lub <code>Zend_Pdf_Font::fontWithPath($filePath)</code>
- dla własnych czcionek.
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-1">
- <title>Tworzenie standardowej czcionki</title>
- <programlisting role="php"><![CDATA[
- ...
- // Utwórz nową czcionkę
- $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
- // Ustaw czcionkę
- $pdfPage->setFont($font, 36);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- Stałe dla nazwa 14 standardowych czcionek PDF są zdefiniowane w klasie <code>Zend_Pdf_Font</code>:
- <itemizedlist>
- <listitem>
- <para>Zend_Pdf_Font::FONT_COURIER</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_TIMES</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_HELVETICA</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_SYMBOL</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
- </listitem>
- </itemizedlist>
- </para>
- <para>
- 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').
- </para>
- <para>
- 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:
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-2">
- <title>Tworzenie czcionki TrueType</title>
- <programlisting role="php"><![CDATA[
- ...
- // Utwórz nową czcionkę
- $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
- // Ustaw czcionkę
- $pdfPage->setFont($goodDogCoolFont, 36);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- 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:
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-3">
- <title>Tworzenie czcionki TrueType, ale bez osadzania jej w dokumencie PDF.</title>
- <programlisting role="php"><![CDATA[
- ...
- // Utwórz nową czcionkę
- $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
- Zend_Pdf_Font::EMBED_DONT_EMBED);
- // Ustaw czcionkę
- $pdfPage->setFont($goodDogCoolFont, 36);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- 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ę.
- </para>
- <para>
- 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.
- </para>
- <para>
- Możesz wciąż użyć tych czcionek, ale musisz przekazać odpowiedni parametr
- w celu nieosadzenia czcionki, lub w prosty sposób zignorować wyjątek:
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-4">
- <title>Nie wyrzucanie wyjątku dla czcionek które nie mogą być osadzone.</title>
- <programlisting role="php"><![CDATA[
- ...
- $font = Zend_Pdf_Font::fontWithPath(
- '/path/to/unEmbeddableFont.ttf',
- Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION
- );
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- 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ą.
- </para>
- <para>
- 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ą:
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-5">
- <title>Nie kompresowanie osadzonych czcionek.</title>
- <programlisting role="php"><![CDATA[
- ...
- $font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
- Zend_Pdf_Font::EMBED_DONT_COMPRESS);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- Ostatecznie, jeśli potrzebujesz, możesz łączyć opcje osadzania czcionek
- używając bitowego operatora LUB:
- </para>
- <example id="zend.pdf.drawing.using-fonts.example-6">
- <title>Łączenie opcji osadzania czcionki.</title>
- <programlisting role="php"><![CDATA[
- ...
- $font = Zend_Pdf_Font::fontWithPath(
- $someUserSelectedFontPath,
- (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
- Zend_Pdf_Font::EMBED_DONT_COMPRESS));
- ...
- ]]>
- </programlisting>
- </example>
- </sect2>
- <sect2 id="zend.pdf.drawing.extracting-fonts">
- <title>Począwszy od 1.5, wyciąganie czcionek.</title>
- <para>
- Moduł <code>Zend_Pdf</code> zapewnia możliwość wyciągania czcionek z
- załadowanych dokumentów.
- </para>
- <para>
- Może być to użyteczne przy inkrementalnych aktualizacjach dokumentów.
- Bez tej funkcjonalności musiałbyś dołączać czcionkę do dokumentu za każdym
- razem gdy go aktualizujesz.
- </para>
- <para>
- Obiekty <code>Zend_Pdf</code> oraz <code>Zend_Pdf_Page</code> zapewniają
- specjalne metody do wyciągania czcionek użytych w dokumencie lub stronie:
- </para>
- <example id="zend.pdf.drawing.extracting-fonts.example-1">
- <title>Wyciąganie czcionek z załadowanego dokumentu.</title>
- <programlisting role="php"><![CDATA[
- ...
- $pdf = Zend_Pdf::load($documentPath);
- ...
- // Pobieramy wszystkie czcionki z dokumentu
- $fontList = $pdf->extractFonts();
- $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
- $yPosition = 700;
- foreach ($fontList as $font) {
- $page->setFont($font, 15);
- $page->drawText(
- $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT, 'en', 'UTF-8') .
- ': The quick brown fox jumps over the lazy dog', 100, $yPosition, 'UTF-8');
- $yPosition -= 30;
- }
- ...
- // Pobieramy czcionki z pierwszej strony dokumentu
- $firstPage = reset($pdf->pages);
- $firstPageFonts = $firstPage->extractFonts();
- ...
- ]]>
- </programlisting>
- </example>
- <example id="zend.pdf.drawing.extracting-fonts.example-2">
- <title>Wyciąganie czcionki z załadowanego dokumentu określając jej nazwę.</title>
- <programlisting role="php"><![CDATA[
- ...
- $pdf = new Zend_Pdf();
- ...
- $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
- $font = Zend_Pdf_Font::fontWithPath($fontPath);
- $page->setFont($font, $fontSize);
- $page->drawText($text, $x, $y);
- ...
- // Nazwa tej czcionki powinna zostać gdzieś zapisana
- $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
- 'en',
- 'UTF-8');
- ...
- $pdf->save($docPath);
- ...
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- ...
- $pdf = Zend_Pdf::load($docPath);
- ...
- $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
- /* $srcPage->extractFont($fontName) can also be used here */
- $font = $pdf->extractFont($fontName);
- $page->setFont($font, $fontSize);
- $page->drawText($text, $x, $y);
- ...
- $pdf->save($docPath, true /* incremental update mode */);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- Wyciągnięte czcionki mogą być użyte w miejscu dowolnej innej czcionki
- z następującymi ograniczeniami:
- <itemizedlist>
- <listitem><para>Wyciągnieta czcionka może być użyta tylko w kontekście
- dokumentu z którego została wyciągnięta.</para></listitem>
- <listitem>
- <para>
- Osadzona czcionka nie jest wyciągnięta.
- Wyciągnięta czcionka nie może być użyta do obliczenia
- poprawnych rozmiarów więc do tych obliczeń powinna być
- użyta oryginalna czcionka.
- <programlisting role="php"><![CDATA[
- ...
- $font = $pdf->extractFont($fontName);
- $originalFont = Zend_Pdf_Font::fontWithPath($fontPath);
- $page->setFont($font /* używamy wyciągniętej czcionki do rysowania */, $fontSize);
- $xPosition = $x;
- for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
- $page->drawText($text[$charIndex], xPosition, $y);
- // Używamy oryginalnej czcionki do obliczenia szerokości tekstu
- $width = $originalFont->widthForGlyph(
- $originalFont->glyphNumberForCharacter($text[$charIndex])
- );
- $xPosition += $width/$originalFont->getUnitsPerEm()*$fontSize;
- }
- ...
- ]]>
- </programlisting>
- </para>
- </listitem>
- </itemizedlist>
- </para>
- </sect2>
- <sect2 id="zend.pdf.drawing.image-drawing">
- <title>Wstawianie obrazów</title>
- <para>
- Klasa <code>Zend_Pdf_Page</code>zapewnia metodę drawImage() do wstawiania
- obrazów:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Wstawia obraz w określonym miejscu na stronie.
- *
- * @param Zend_Pdf_Resource_Image $image
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- */
- public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
- ]]>
- </programlisting>
- <para>
- Obiekty obrazów powinny być tworzone za pomocą metody
- <code>Zend_Pdf_Image::imageWithPath($filePath)</code> (obecnie
- obsługiwane są obrazy JPG, PNG oraz TIFF):
- </para>
- <example id="zend.pdf.drawing.image-drawing.example-1">
- <title>Wstawianie obrazów</title>
- <programlisting role="php"><![CDATA[
- ...
- // łądujemy obraz
- $image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
- $pdfPage->drawImage($image, 100, 100, 400, 300);
- ...
- ]]>
- </programlisting>
- </example>
- <para>
- <emphasis>Ważne! Obsługa JPEG wymaga rozszerzenia PHP GD.</emphasis>
- <emphasis>Ważne! Obsługa PNG wymaga rozszerzenia ZLIB skonfigurowanego do obsługi obrazów z kanałem Alpha.</emphasis>
- </para>
- <para>
- Sprawdź dokumentację PHP aby znaleźć bardziej szczegółowe informacje.
- (<ulink url="http://www.php.net/manual/en/ref.image.php">http://www.php.net/manual/en/ref.image.php</ulink>).
- (<ulink url="http://www.php.net/manual/en/ref.zlib.php">http://www.php.net/manual/en/ref.zlib.php</ulink>).
- </para>
- </sect2>
- <sect2 id="zend.pdf.drawing.line-drawing-style">
- <title>Styl rysowania linii</title>
- <para>
- Styl rysowania linii jest zdefiniowany przez grubość, kolor linii oraz
- ozdobny wzór linii. Wszystkie te parametry mogą być zdefiniowane za pomocą
- metod klasy <code>Zend_Pdf_Page</code>:
- </para>
- <programlisting role="php"><![CDATA[
- /** Ustaw kolor linii. */
- public function setLineColor(Zend_Pdf_Color $color);
- /** Ustaw grubość linii. */
- public function setLineWidth(float $width);
- /**
- * Ustawia ozdobny wzór linii.
- *
- * Wzór jest tablicą liczb zmiennoprzecinkowych:
- * array(dlugosc_on, dlugosc_off, dlugosc_on, dlugosc_off, ...)
- * Faza jest przesunięciem od początku linii.
- *
- * @param array $pattern
- * @param array $phase
- */
- public function setLineDashingPattern($pattern, $phase = 0);
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.fill-style">
- <title>Styl wypełnienia</title>
- <para>
- Metody <code>Zend_Pdf_Page::drawRectangle()</code>, <code>Zend_Pdf_Page::drawPolygon()</code>,
- <code>Zend_Pdf_Page::drawCircle()</code> oraz <code>Zend_Pdf_Page::drawEllipse()</code>
- przyjmują argument <code>$fillType</code> jako opcjonalny parametr. Może
- on mieć wartość:
- </para>
- <itemizedlist>
- <listitem>
- <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - obrysowuje figurę</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - tylko wypełnia</para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - obrysowuje i wypełnia (domyślnie)</para>
- </listitem>
- </itemizedlist>
- <para>
- Metoda <code>Zend_Pdf_Page::drawPolygon()</code> przyjmuje także dodatkowy
- parametr <code>$fillMethod</code>:
- </para>
- <itemizedlist>
- <listitem>
- <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (domyślnie)</para>
- <para>
- <citetitle>Dokumentacja PDF</citetitle> opisuje tą zasadę w ten sposób:
- <blockquote>
- <para>
- 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.
- </para>
- </blockquote>
- </para>
- </listitem>
- <listitem>
- <para>Zend_Pdf_Page::FILL_METHOD_EVEN_ODD</para>
- <para>
- <citetitle>Dokumentacja PDF</citetitle> opisuje tą zasadę w ten sposób:
- <blockquote>
- <para>
- 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.
- </para>
- </blockquote>
- </para>
- </listitem>
- </itemizedlist>
- </sect2>
- <sect2 id="zend.pdf.drawing.rotations">
- <title>Obracanie</title>
- <para>
- Strony PDF mogą być obracane zanim zostaną wykonane jakiekolwiek
- operacje rysowania. Może być to zrobione za pomocą metody
- <code>Zend_Pdf_Page::rotate()</code>:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Obraca stronę dookoła punktu ($x, $y) o określony kąt (w radianach).
- *
- * @param float $angle
- */
- public function rotate($x, $y, $angle);
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.save-restore">
- <title>Zapisywanie/odczytywanie stanu grafiki</title>
- <para>
- 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.
- </para>
- <para>
- Są dwie metody w klasie <code>Zend_Pdf_Page</code> do tych operacji:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Zapisuje stan grafiki danej strony.
- * Zapisuje obecny styl, pozycję, obszar przycinania
- * oraz ewetualny obrót/translację/skalowanie
- * które są zastosowane.
- */
- public function saveGS();
- /**
- * Przywraca stan grafiki który był zapisany
- * ostatnim wywołaniem metody saveGS().
- */
- public function restoreGS();
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.clipping">
- <title>Przycięcie obszaru rysowania</title>
- <para>
- 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.
- </para>
- <para>
- Klasa <code>Zend_Pdf_Page</code> zapewnia zestaw metod dla operacji przycinania.
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Przycięcie obszaru za pomocą prostokąta.
- *
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- */
- public function clipRectangle($x1, $y1, $x2, $y2);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Przycięcie obszaru za pomocą wielokąta.
- *
- * @param array $x - tablica wartości zmiennoprzecinkowych (współrzędne X)
- * @param array $y - tablica wartości zmiennoprzecinkowych (współrzędne Y)
- * @param integer $fillMethod
- */
- public function clipPolygon($x,
- $y,
- $fillMethod =
- Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Przycięcie obszaru za pomocą okręgu.
- *
- * @param float $x
- * @param float $y
- * @param float $radius
- * @param float $startAngle
- * @param float $endAngle
- */
- public function clipCircle($x,
- $y,
- $radius,
- $startAngle = null,
- $endAngle = null);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Przycięcie obszaru za pomocą elipsy.
- *
- * Sygnatury metod:
- * drawEllipse($x1, $y1, $x2, $y2);
- * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
- *
- * @todo obsłużyć przypadki gdy $x2-$x1 == 0 lub $y2-$y1 == 0
- *
- * @param float $x1
- * @param float $y1
- * @param float $x2
- * @param float $y2
- * @param float $startAngle
- * @param float $endAngle
- */
- public function clipEllipse($x1,
- $y1,
- $x2,
- $y2,
- $startAngle = null,
- $endAngle = null);
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.styles">
- <title>Style</title>
- <para>
- Klasa <code>Zend_Pdf_Style</code> zapewnia funkcjonalność styli.
- </para>
- <para>
- 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:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia styl dla przyszłych operacji rysowania na tej stronie
- *
- * @param Zend_Pdf_Style $style
- */
- public function setStyle(Zend_Pdf_Style $style);
- /**
- * Zwraca styl zastosowany dla strony.
- *
- * @return Zend_Pdf_Style|null
- */
- public function getStyle();
- ]]>
- </programlisting>
- <para>
- Klasa <code>Zend_Pdf_Style</code> zapewnia zestaw metod do ustawiania oraz pobierania różnych parametrów stanu grafiki:
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia kolor linii.
- *
- * @param Zend_Pdf_Color $color
- */
- public function setLineColor(Zend_Pdf_Color $color);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera kolor linii.
- *
- * @return Zend_Pdf_Color|null
- */
- public function getLineColor();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia grubość linii.
- *
- * @param float $width
- */
- public function setLineWidth($width);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera grubość linii.
- *
- * @return float
- */
- public function getLineWidth();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia ozdobny wzór linii
- *
- * @param array $pattern
- * @param float $phase
- */
- public function setLineDashingPattern($pattern, $phase = 0);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera ozdobny wzór linii
- *
- * @return array
- */
- public function getLineDashingPattern();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera okres ozdobnej fazy.
- *
- * @return float
- */
- public function getLineDashingPhase();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia kolor wypełnienia.
- *
- * @param Zend_Pdf_Color $color
- */
- public function setFillColor(Zend_Pdf_Color $color);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera kolor wypełnienia.
- *
- * @return Zend_Pdf_Color|null
- */
- public function getFillColor();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia bieżącą czcionkę.
- *
- * @param Zend_Pdf_Resource_Font $font
- * @param float $fontSize
- */
- public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Zmienia rozmiar bieżącej czcionki
- *
- * @param float $fontSize
- */
- public function setFontSize($fontSize);
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera bieżącą czcionkę.
- *
- * @return Zend_Pdf_Resource_Font $font
- */
- public function getFont();
- ]]>
- </programlisting>
- <programlisting role="php"><![CDATA[
- /**
- * Pobiera rozmiar bieżącej czcionki
- *
- * @return float $fontSize
- */
- public function getFontSize();
- ]]>
- </programlisting>
- </sect2>
- <sect2 id="zend.pdf.drawing.alpha">
- <title>Przezroczystość</title>
- <para>
- Moduł <code>Zend_Pdf</code> pozwala na obsługę przezroczystości.
- </para>
- <para>
- Przezroczystość może być ustawiona za pomocą metody <code>Zend_Pdf_Page::setAlpha()</code>:
- <programlisting role="php"><![CDATA[
- /**
- * Ustawia przezroczystość
- *
- * $alpha == 0 - przezroczysty
- * $alpha == 1 - nieprzezroczysty
- *
- * Tryby przezroczystości obsługiwane przez PDF:
- * Normal (default), Multiply, Screen, Overlay, Darken,
- * Lighten, ColorDodge, ColorBurn, HardLight,
- * SoftLight, Difference, Exclusion
- *
- * @param float $alpha
- * @param string $mode
- * @throws Zend_Pdf_Exception
- */
- public function setAlpha($alpha, $mode = 'Normal');
- ]]>
- </programlisting>
- </para>
- </sect2>
- </sect1>
|