1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.pdf.drawing">
7 <sect2 id="zend.pdf.drawing.geometry">
10 <acronym>PDF</acronym> は PostScript と同じジオメトリを使用します。ページの左下隅を基準とし、
11 デフォルトではポイント数 (1 インチの 1/72) で場所を指定します。
14 ページの大きさはページオブジェクトから取得できます。
17 <programlisting language="php"><![CDATA[
18 $width = $pdfPage->getWidth();
19 $height = $pdfPage->getHeight();
24 <sect2 id="zend.pdf.drawing.color">
27 <acronym>PDF</acronym> には、色を表現するためのさまざまな方法があります。<classname>Zend_Pdf</classname> では、
28 グレイスケール、RGB および CMYK 色空間をサポートしています。
29 <classname>Zend_Pdf_Color</classname> オブジェクトが要求される箇所では、
30 これらのどれでも使用できます。それぞれの色空間に対応する機能を提供するのが
31 <classname>Zend_Pdf_Color_GrayScale</classname>、<classname>Zend_Pdf_Color_Rgb</classname> および
32 <classname>Zend_Pdf_Color_Cmyk</classname> クラスです。
34 <programlisting language="php"><![CDATA[
35 // $grayLevel (float 型の数値)。0.0 (黒) - 1.0 (白)
36 $color1 = new Zend_Pdf_Color_GrayScale($grayLevel);
38 // $r, $g, $b (float 型の数値)。0.0 (最低の強度) - 1.0 (最大の強度)
39 $color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);
41 // $c, $m, $y, $k (float 型の数値)。0.0 (最小の強度) - 1.0 (最大の強度)
42 $color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);
46 HTML 形式の色指定も <classname>Zend_Pdf_Color_Html</classname> クラスで使用できます。
48 <programlisting language="php"><![CDATA[
49 $color1 = new Zend_Pdf_Color_Html('#3366FF');
50 $color2 = new Zend_Pdf_Color_Html('silver');
51 $color3 = new Zend_Pdf_Color_Html('forestgreen');
55 <sect2 id="zend.pdf.drawing.shape-drawing">
58 描画操作は、<acronym>PDF</acronym> のページに対して行われます。
61 基本図形のセットが <classname>Zend_Pdf_Page</classname> クラスで提供されています。
63 <programlisting language="php"><![CDATA[
65 * x1,y1 から x2,y2 まで直線を描画します。
71 * @return Zend_Pdf_Page
73 public function drawLine($x1, $y1, $x2, $y2);
75 <programlisting language="php"><![CDATA[
80 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - 輪郭を描画して塗りつぶします (デフォルト)
81 * Zend_Pdf_Page::SHAPE_DRAW_STROKE - 輪郭を描画します
82 * Zend_Pdf_Page::SHAPE_DRAW_FILL - 矩形を塗りつぶします
88 * @param integer $fillType
89 * @return Zend_Pdf_Page
91 public function drawRectangle($x1, $y1, $x2, $y2,
92 $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
94 <!-- TODO : to be translated -->
95 <programlisting language="php"><![CDATA[
97 * Draw a rounded rectangle.
100 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle and stroke (default)
101 * Zend_Pdf_Page::SHAPE_DRAW_STROKE - stroke rectangle
102 * Zend_Pdf_Page::SHAPE_DRAW_FILL - fill rectangle
104 * radius is an integer representing radius of the four corners, or an array
105 * of four integers representing the radius starting at top left, going
112 * @param integer|array $radius
113 * @param integer $fillType
114 * @return Zend_Pdf_Page
116 public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
117 $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
119 <programlisting language="php"><![CDATA[
123 * $fillType が Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE あるいは Zend_Pdf_Page::SHAPE_DRAW_FILL
124 * の場合、多角形は自動的に閉じられます。このメソッドについての詳細は、
125 * PDF のドキュメント (section 4.4.2 Path painting Operators, Filling)
128 * @param array $x - float の配列 (頂点の X 座標)
129 * @param array $y - float の配列 (頂点の Y 座標)
130 * @param integer $fillType
131 * @param integer $fillMethod
132 * @return Zend_Pdf_Page
134 public function drawPolygon($x, $y,
136 Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
138 Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
140 <programlisting language="php"><![CDATA[
142 * 中心が x, y で半径が radius の円を描画します。
147 * drawCircle($x, $y, $radius);
148 * drawCircle($x, $y, $radius, $fillType);
149 * drawCircle($x, $y, $radius, $startAngle, $endAngle);
150 * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
153 * これは本当の円ではありません。PDF は 3 次ベジエ曲線しかサポートしていないからです。
154 * とはいえ、本当の円にかなり近くなります。
155 * 本当の円との誤差は、最大でも半径の 0.00026 倍にしかなりません
156 * (角度が PI/8, 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 そして 15*PI/8 の場合)。
157 * 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 そして 7*PI/4 の場合は、円の正確な接線となります。
161 * @param float $radius
162 * @param mixed $param4
163 * @param mixed $param5
164 * @param mixed $param6
165 * @return Zend_Pdf_Page
167 public function drawCircle($x,
174 <programlisting language="php"><![CDATA[
176 * 指定した矩形に内接する楕円を描画します。
179 * drawEllipse($x1, $y1, $x2, $y2);
180 * drawEllipse($x1, $y1, $x2, $y2, $fillType);
181 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
182 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
190 * @param mixed $param5
191 * @param mixed $param6
192 * @param mixed $param7
193 * @return Zend_Pdf_Page
195 public function drawEllipse($x1,
205 <sect2 id="zend.pdf.drawing.text-drawing">
206 <title>テキストの描画</title>
208 テキストに対する描画操作も、<acronym>PDF</acronym> のページに対して行われます。
209 ベースラインの x 座標および y 座標を指定することで、
210 ページ内の任意の場所にテキストを 1 行描画できます。
211 現在のフォントおよびフォントサイズを使用して、描画操作が行われます
214 <programlisting language="php"><![CDATA[
218 * @param string $text
221 * @param string $charEncoding (オプション) ソーステキストの文字エンコーディング。
223 * @throws Zend_Pdf_Exception
224 * @return Zend_Pdf_Page
226 public function drawText($text, $x, $y, $charEncoding = '');
228 <example id="zend.pdf.drawing.text-drawing.example-1">
229 <title>ページ上への文字列の描画</title>
230 <programlisting language="php"><![CDATA[
232 $pdfPage->drawText('Hello world!', 72, 720);
237 デフォルトでは、現在のロケールのエンコーディングによって
238 テキストの文字列が解釈されます。異なるエンコーディングを使用している場合
239 (例えば、ディスク上のファイルから UTF-8 の文字列を読み込んだり
240 レガシーなデータベースから MacRoman の文字列を取得したりなど) は、
241 描画の際に文字エンコーディングを指定できます。
242 そうすることで、<classname>Zend_Pdf</classname> が変換処理を行います。<acronym>PHP</acronym> の
243 <code><ulink url="http://www.php.net/manual/function.iconv.php">iconv()</ulink></code>
244 関数がサポートしているエンコーディングなら、すべて入力として使用することが可能です。
246 <example id="zend.pdf.drawing.text-drawing.example-2">
247 <title>UTF-8 でエンコードされた文字列をページに描画する</title>
248 <programlisting language="php"><![CDATA[
250 // UTF-8 エンコードされた文字列をディスクから読み込みます
251 $unicodeString = fread($fp, 1024);
254 $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
260 <sect2 id="zend.pdf.drawing.using-fonts">
261 <title>フォントの使用</title>
263 <methodname>Zend_Pdf_Page::drawText()</methodname> は、
264 現在設定されているフォントおよびフォントサイズを使用します。
265 これは <methodname>Zend_Pdf_Page::setFont()</methodname> メソッドで設定できます。
267 <programlisting language="php"><![CDATA[
271 * @param Zend_Pdf_Resource_Font $font
272 * @param float $fontSize
273 * @return Zend_Pdf_Page
275 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
278 <acronym>PDF</acronym> ドキュメントは、PostScript Type 1 フォントおよび TrueType フォントだけでなく、
279 <acronym>PDF</acronym> 用の特別な形式である Type 3 フォントや複合フォントもサポートしています。
280 すべての <acronym>PDF</acronym> ビューアには、以下の 14 種類の標準 Type 1 フォントが組み込まれています。
281 その内容は Courier (4 種類)、Helvetica (4 種類)、Times (4 種類)、Symbol
282 そして Zapf Dingbats です。
285 現在 <classname>Zend_Pdf</classname> は、標準の 14 種類の <acronym>PDF</acronym> フォントだけでなく
286 独自の TrueType フォントもサポートしています。フォントオブジェクトを取得するには、
287 2 種類のファクトリーメソッドのいずれかを使用します。使用するメソッドは、
288 標準の 14 種類の <acronym>PDF</acronym> フォントの場合は <methodname>Zend_Pdf_Font::fontWithName($fontName)</methodname>、
289 独自のフォントの場合は <methodname>Zend_Pdf_Font::fontWithPath($filePath)</methodname> です。
291 <example id="zend.pdf.drawing.using-fonts.example-1">
292 <title>標準フォントの作成</title>
293 <programlisting language="php"><![CDATA[
296 $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
299 $pdfPage->setFont($font, 36);
304 14 種類の標準フォント名を表す定数は、<classname>Zend_Pdf_Font</classname> クラスで定義されています。
307 <para>Zend_Pdf_Font::FONT_COURIER</para>
310 <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
313 <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
316 <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
319 <para>Zend_Pdf_Font::FONT_TIMES</para>
322 <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
325 <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
328 <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
331 <para>Zend_Pdf_Font::FONT_HELVETICA</para>
334 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
337 <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
340 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
343 <para>Zend_Pdf_Font::FONT_SYMBOL</para>
346 <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
351 任意の TrueType フォント (通常は '.ttf' という拡張子です) も使用できますし、
352 TrueType アウトラインを含む OpenType フォント (拡張子は '.otf')
353 を使用することも可能です。現在はまだサポートしていませんが、将来は
354 Mac OS X の .dfont ファイルや Microsoft TrueType Collection
355 (拡張子 '.ttc') ファイルもサポートする予定です。
358 TrueType フォントを使用するには、フォントへのフルパスを指定しなければなりません。
359 何らかの理由でフォントが読み込めなかった場合、あるいはそれが TrueType
360 フォントでなかった場合は、ファクトリーメソッドが例外をスローします。
362 <example id="zend.pdf.drawing.using-fonts.example-2">
363 <title>TrueType フォントの作成</title>
364 <programlisting language="php"><![CDATA[
367 $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
370 $pdfPage->setFont($goodDogCoolFont, 36);
375 デフォルトでは、独自のフォントは <acronym>PDF</acronym> ドキュメントに埋め込まれます。
376 そのため、閲覧者のシステムにそのフォントがインストールされていなくても、
377 ページをきちんと閲覧できるようになります。ファイルの大きさが気になる場合は、
378 ファクトリーメソッドのオプションで「フォントを埋め込まない」ことを指定できます。
380 <example id="zend.pdf.drawing.using-fonts.example-3">
381 <title>TrueType を作成するが、PDF ドキュメントには埋め込まない</title>
382 <programlisting language="php"><![CDATA[
385 $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
386 Zend_Pdf_Font::EMBED_DONT_EMBED);
389 $pdfPage->setFont($goodDogCoolFont, 36);
394 <acronym>PDF</acronym> ファイルにフォントが埋め込まれていないけれども
395 閲覧者のシステムにはそのフォントがインストールされている場合は、ドキュメントは通常通りに閲覧できます。
396 もし適切なフォントがインストールされていないは、<acronym>PDF</acronym> 閲覧アプリケーションが適切な代替フォントを選択します。
399 中には、<acronym>PDF</acronym> ドキュメントへの埋め込みを禁止するようなライセンスを使用しているフォントもあります。
400 これをあなどってはいけません。もし埋め込めないフォントを利用しようとすると、
401 ファクトリーメソッドは例外をスローします。
404 このようなフォントを使用することも可能ですが、そのためには、
405 上で説明した「埋め込まない」フラグを使用するか、あるいは例外を抑制しなければなりません。
407 <example id="zend.pdf.drawing.using-fonts.example-4">
408 <title>埋め込みが禁止されているフォントで、例外をスローさせないようにする</title>
409 <programlisting language="php"><![CDATA[
411 $font = Zend_Pdf_Font::fontWithPath(
412 '/path/to/unEmbeddableFont.ttf',
413 Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION
419 利用者にフォントを選択させる場合などは、この抑制方法を使用することをお勧めします。
420 <acronym>PDF</acronym> ドキュメントに埋め込めるフォントなら埋め込むでしょうし、
421 埋め込めないフォントは埋め込まないでしょう。
424 フォントのサイズは比較的大きく、中には 10 メガバイトに達するものもあります。
425 デフォルトでは埋め込みフォントは Flate 圧縮され、平均して 50% ほどサイズを節約できます。
426 何らかの理由でフォントを圧縮したくない場合は、以下のオプションで圧縮を無効にできます。
428 <example id="zend.pdf.drawing.using-fonts.example-5">
429 <title>埋め込みフォントを圧縮しない</title>
430 <programlisting language="php"><![CDATA[
432 $font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
433 Zend_Pdf_Font::EMBED_DONT_COMPRESS);
438 最後に、必要に応じていくつかの埋め込みオプションをビット OR 演算子で連結することもできます。
440 <example id="zend.pdf.drawing.using-fonts.example-6">
441 <title>フォントの埋め込みオプションを組み合わせる</title>
442 <programlisting language="php"><![CDATA[
444 $font = Zend_Pdf_Font::fontWithPath(
445 $someUserSelectedFontPath,
446 (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
447 Zend_Pdf_Font::EMBED_DONT_COMPRESS));
453 <sect2 id="zend.pdf.drawing.standard-fonts-limitations">
454 <title>標準 PDF フォントの制限</title>
456 標準 <acronym>PDF</acronym> フォントは、いくつかのシングルバイトエンコーディング
457 (詳細は <ulink url="http://www.adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf"><acronym>PDF</acronym> Reference, Sixth Edition, version 1.7</ulink>
458 の Appendix D を参照ください) を内部的に使用しています。
459 これらは、ほぼ Latin1 文字セットと同じものです (Symbol フォントと ZapfDingbats
463 <classname>Zend_Pdf</classname> は、標準フォントでのテキストの描画時に CP1252 (WinLatin1) を使用します。
466 他のエンコーディングでもテキストは描画できますが、
467 現在のロケールと異なる場合はそれを指定する必要があります。
468 実際に描画されるのは WinLatin1 の文字のみです。
470 <example id="zend.pdf.drawing.using-fonts.example-7">
471 <title>フォント埋め込みオプションの使用</title>
472 <programlisting language="php"><![CDATA[
474 $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER);
475 $pdfPage->setFont($font, 36)
476 ->drawText('Euro sign - €', 72, 720, 'UTF-8')
477 ->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
483 <sect2 id="zend.pdf.drawing.extracting-fonts">
484 <title>フォントの抽出</title>
486 <classname>Zend_Pdf</classname> モジュールを使用すると、読み込んだドキュメントからフォントを抽出できるようになります。
490 これは、ドキュメントをインクリメンタルに更新する際に便利です。
491 この機能がなければ、ドキュメントを更新するたびにフォントをアタッチしたり
492 ドキュメントに埋め込んだりしなければならなくなります。
496 <classname>Zend_Pdf</classname> オブジェクトおよび <classname>Zend_Pdf_Page</classname> オブジェクトには、
497 ドキュメントやページ内のすべてのフォントを抽出するためのメソッドが用意されています。
499 <example id="zend.pdf.drawing.extracting-fonts.example-1">
500 <title>読み込んだドキュメントからのフォントの抽出</title>
501 <programlisting language="php"><![CDATA[
503 $pdf = Zend_Pdf::load($documentPath);
505 // ドキュメントのすべてのフォントを取得します
506 $fontList = $pdf->extractFonts();
507 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
509 foreach ($fontList as $font) {
510 $page->setFont($font, 15);
511 $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
514 $page->drawText($fontName . ': The quick brown fox jumps over the lazy dog',
521 // ドキュメントの最初のページで用いられているフォントを取得します
522 $firstPage = reset($pdf->pages);
523 $firstPageFonts = $firstPage->extractFonts();
527 <example id="zend.pdf.drawing.extracting-fonts.example-2">
528 <title>フォント名の指定による、読み込んだドキュメントからのフォントの抽出</title>
529 <programlisting language="php"><![CDATA[
531 $pdf = new Zend_Pdf();
533 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
535 $font = Zend_Pdf_Font::fontWithPath($fontPath);
536 $page->setFont($font, $fontSize);
537 $page->drawText($text, $x, $y);
539 // フォント名をどこかに保存しておきます...
540 $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
544 $pdf->save($docPath);
547 <programlisting language="php"><![CDATA[
549 $pdf = Zend_Pdf::load($docPath);
551 $pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
553 /* $srcPage->extractFont($fontName) としてもかまいません */
554 $font = $pdf->extractFont($fontName);
556 $page->setFont($font, $fontSize);
557 $page->drawText($text, $x, $y);
559 $pdf->save($docPath, true /* インクリメンタル更新モード */);
565 フォントの抽出はどこででもできますが、次のような制限があります。
567 <listitem><para>抽出したフォントは、そのフォントの抽出元と同じドキュメント内でしか使用できません。</para></listitem>
570 埋め込まれたフォントプログラムは実際には抽出されません。
571 つまり、抽出されたフォントは元のフォントメトリクス
572 (テキストの幅の計算に使用するもの) と同じものになりません。
573 <programlisting language="php"><![CDATA[
575 $font = $pdf->extractFont($fontName);
576 $originalFont = Zend_Pdf_Font::fontWithPath($fontPath);
578 $page->setFont($font /* 描画用に抽出したフォント */, $fontSize);
580 for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
581 $page->drawText($text[$charIndex], xPosition, $y);
583 // テキストの幅の計算には元のフォントを使用します
584 $width = $originalFont->widthForGlyph(
585 $originalFont->glyphNumberForCharacter($text[$charIndex])
587 $xPosition += $width/$originalFont->getUnitsPerEm()*$fontSize;
597 <sect2 id="zend.pdf.drawing.image-drawing">
600 <classname>Zend_Pdf_Page</classname> クラスの drawImage() メソッドで、
603 <programlisting language="php"><![CDATA[
605 * ページ内の指定した位置に画像を描画します。
607 * @param Zend_Pdf_Resource_Image $image
612 * @return Zend_Pdf_Page
614 public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
617 画像オブジェクトは、<methodname>Zend_Pdf_Image::imageWithPath($filePath)</methodname>
618 メソッドで作成しなければなりません (現在は JPG、PNG および TIFF
621 <example id="zend.pdf.drawing.image-drawing.example-1">
623 <programlisting language="php"><![CDATA[
626 $image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
628 $pdfPage->drawImage($image, 100, 100, 400, 300);
634 <emphasis>重要! JPEG のサポートには <acronym>PHP</acronym> の GD 拡張モジュールを必要とします。</emphasis>
635 <emphasis>重要! PNG でアルファチャネルを使用した画像を扱うには、ZLIB 拡張モジュールを必要とします。</emphasis>
638 詳細な情報は、<acronym>PHP</acronym> のドキュメント
639 (<ulink url="http://www.php.net/manual/ja/ref.image.php">http://www.php.net/manual/ja/ref.image.php</ulink>),
640 (<ulink url="http://www.php.net/manual/ja/ref.zlib.php">http://www.php.net/manual/ja/ref.zlib.php</ulink>)
645 <sect2 id="zend.pdf.drawing.line-drawing-style">
646 <title>直線の描画スタイル</title>
648 直線の描画スタイルは、線幅と線の色、そして破線のパターンで定義されます。
649 これらはすべて、<classname>Zend_Pdf_Page</classname> クラスのメソッドで設定します。
651 <programlisting language="php"><![CDATA[
653 public function setLineColor(Zend_Pdf_Color $color);
656 public function setLineWidth(float $width);
661 * pattern は float の配列です:
662 * array(on_length, off_length, on_length, off_length, ...)
663 * phase は線の開始位置から移動する距離です。
665 * @param array $pattern
666 * @param array $phase
667 * @return Zend_Pdf_Page
669 public function setLineDashingPattern($pattern, $phase = 0);
673 <sect2 id="zend.pdf.drawing.fill-style">
674 <title>塗りつぶしのスタイル</title>
676 <methodname>Zend_Pdf_Page::drawRectangle()</methodname>、<methodname>Zend_Pdf_Page::drawPolygon()</methodname>、
677 <methodname>Zend_Pdf_Page::drawCircle()</methodname> および <methodname>Zend_Pdf_Page::drawEllipse()</methodname>
678 メソッドは、オプションのパラメータとして <varname>$fillType</varname>
679 を受け取ります。これは以下のいずれかの値となります。
684 <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - 図形の輪郭を描画します</para>
687 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - 図形を塗りつぶすだけです</para>
690 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - 輪郭を描画し、塗りつぶします (デフォルトの挙動です)</para>
695 <methodname>Zend_Pdf_Page::drawPolygon()</methodname> メソッドには、さらにパラメータ
696 <varname>$fillMethod</varname> を指定できます。
700 <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (デフォルトの挙動)</para>
702 <citetitle><acronym>PDF</acronym> リファレンス</citetitle> によると、これは以下のように定義されています。
705 nonzero winding number ルールは、ある点がパスの内側にあるかどうかを
706 判断するため、その点からどこかの方向に放射線を引いて
707 その線がパスを構成する線と交わる場所を調べます。
708 0 からカウントをはじめ、放射線の左から右にパスの線が横切った場合に
709 +1、放射線の右から左に横切った場合に -1 します。
710 すべての交点について調べた後、もし結果が 0 ならその点はパスの外側です。
713 注意: この方式では、放射線とパスの線が同一になった場合や
714 放射線がパスの線の接線となった場合のことを指定していません。
715 放射線は任意の方向に伸ばせるので、このような状況にならないような放射線が選ばれます。
716 単純な凸状のパスの場合、この方式で判断した内側・外側は、
717 直感的に予想できるのと同じ結果になります。
718 ただ、パスを構成する線自身が交わっているなどの複雑なパスの場合は、
719 興味深い結果となります。この例を、(<acronym>PDF</acronym> リファレンスの) 図 4.10 に示します。
721 5 本の直線を互いに交差させて作成した星型の場合、このルールでは
722 星型で囲まれるすべての部分をパスの内側として扱います。真ん中の
723 五角形も内側となります。2 つの同心円からなるパスの場合、
724 2 つの円が同じ方向に描画された際には両方の円に囲まれている部分が
725 内側となります。2 つの円が反対方向に描画された際には、2 つの円からなる
726 「ドーナツ型」の部分が内側となります。このルールの場合は、
727 「ドーナツの穴」の部分は外側という扱いになります。
733 <para>Zend_Pdf_Const::FILLMETHOD_EVENODD</para>
735 <citetitle><acronym>PDF</acronym> リファレンス</citetitle> によると、これは以下のように定義されています。
738 nonzero winding number ルールに対するもうひとつのルールが even-odd ルールです。
739 このルールでは、ある点が「内側である」かどうかを判断する材料として、
740 その点からどこかの方向に放射線を引いてその線がパスを構成する線と何回交わるか
741 ということを用います。交わる回数が奇数だった場合、その点は内側です。
742 交わる回数が偶数だった場合、その点は外側です。単純なパスの場合は、
743 これは nonzero winding number ルールと同じ結果になります。
744 しかし、複雑な図形の場合は異なる結果となります。
746 複雑なパスに対して even-odd ルールを適用した場合の例を (<acronym>PDF</acronym> リファレンスの)
747 図 4.11 に示します。このルールの場合、5 本の交差する直線からなる星型では、
748 三角形の部分のみが内側として扱われます。真ん中の五角形は、内側とはみなされません。
749 2 つの同心円の場合、2 つの円からなる「ドーナツ型」の部分のみが内側として扱われます。
750 これは、円の描画された方向に依存しません。
758 <sect2 id="zend.pdf.drawing.linear-transformations">
760 <sect3 id="zend.pdf.drawing.linear-transformations.rotations">
763 描画操作を適用する前に、<acronym>PDF</acronym> のページを回転させることができます。
764 それには <methodname>Zend_Pdf_Page::rotate()</methodname> メソッドを使用します。
766 <programlisting language="php"><![CDATA[
770 * @param float $x - 回転の中心の X 座標
771 * @param float $y - 回転の中心の Y 座標
772 * @param float $angle - 回転角度
773 * @return Zend_Pdf_Page
775 public function rotate($x, $y, $angle);
779 <sect3 id="zend.pdf.drawing.linear-transformations.scale">
780 <title>ZF 1.8 以降で使用できる拡大/縮小</title>
782 倍率の変更は <methodname>Zend_Pdf_Page::scale()</methodname> メソッドで行います。
784 <programlisting language="php"><![CDATA[
788 * @param float $xScale - X 方向の倍率
789 * @param float $yScale - Y 方向の倍率
790 * @return Zend_Pdf_Page
792 public function scale($xScale, $yScale);
796 <sect3 id="zend.pdf.drawing.linear-transformations.translate">
797 <title>ZF 1.8 以降で使用できる移動</title>
799 座標系の移動は <methodname>Zend_Pdf_Page::translate()</methodname> メソッドで行います。
801 <programlisting language="php"><![CDATA[
805 * @param float $xShift - X 方向の移動
806 * @param float $yShift - Y 方向の移動
807 * @return Zend_Pdf_Page
809 public function translate($xShift, $yShift);
813 <sect3 id="zend.pdf.drawing.linear-transformations.skew">
814 <title>ZF 1.8 以降で使用できる傾斜</title>
816 ページを傾けるには <methodname>Zend_Pdf_Page::skew()</methodname> メソッドを使用します。
818 <programlisting language="php"><![CDATA[
822 * @param float $x - 傾斜点の X 座標
823 * @param float $y - 傾斜点の Y 座標
824 * @param float $xAngle - X 軸の傾斜角度
825 * @param float $yAngle - Y 軸の傾斜角度
826 * @return Zend_Pdf_Page
828 public function skew($x, $y, $xAngle, $yAngle);
833 <sect2 id="zend.pdf.drawing.save-restore">
834 <title>グラフィックの状態の保存/復元</title>
837 (現在のフォント、フォントサイズ、線の色、塗りつぶしの色、線の形式、
838 ページの回転、クリップ領域) を保存/復元できます。
839 保存操作はグラフィックの状態をスタックに保存し、復元の際にはそこから取り出されます。
842 <classname>Zend_Pdf_Page</classname>
843 クラスには、これらの操作を行うための 2 つのメソッドがあります。
845 <programlisting language="php"><![CDATA[
847 * このページのグラフィックの状態を保存します。
848 * 現在適用されているスタイル・位置・クリップ領域および
849 * 回転/移動/拡大縮小などを情報を保存します。
851 * @return Zend_Pdf_Page
853 public function saveGS();
856 * 直近の saveGS() で保存されたグラフィックの状態を復元します。
858 * @return Zend_Pdf_Page
860 public function restoreGS();
864 <sect2 id="zend.pdf.drawing.clipping">
865 <title>描画領域のクリッピング</title>
867 <acronym>PDF</acronym> および <classname>Zend_Pdf</classname> モジュールは、描画領域のクリッピングに対応しています。
868 描画演算子が影響を及ぼす範囲を、このクリップ領域内に制限します。
872 <classname>Zend_Pdf_Page</classname> クラスでは、
873 クリッピングに関連するいくつかのメソッドを提供しています。
875 <programlisting language="php"><![CDATA[
883 * @return Zend_Pdf_Page
885 public function clipRectangle($x1, $y1, $x2, $y2);
887 <programlisting language="php"><![CDATA[
891 * @param array $x - float の配列 (頂点の X 座標)
892 * @param array $y - float の配列 (頂点の Y 座標)
893 * @param integer $fillMethod
894 * @return Zend_Pdf_Page
896 public function clipPolygon($x,
899 Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
901 <programlisting language="php"><![CDATA[
907 * @param float $radius
908 * @param float $startAngle
909 * @param float $endAngle
910 * @return Zend_Pdf_Page
912 public function clipCircle($x,
918 <programlisting language="php"><![CDATA[
923 * drawEllipse($x1, $y1, $x2, $y2);
924 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
926 * @todo $x2-$x1 == 0 や $y2-$y1 == 0 のような特別な場合への対応
932 * @param float $startAngle
933 * @param float $endAngle
934 * @return Zend_Pdf_Page
936 public function clipEllipse($x1,
945 <sect2 id="zend.pdf.drawing.styles">
948 <classname>Zend_Pdf_Style</classname> クラスがスタイルに関する機能を提供します。
951 スタイルは、グラフィックの状態に関する複数の設定を保存し、
952 <acronym>PDF</acronym> のページに 1 回の操作でそれを適用するために使用されます。
954 <programlisting language="php"><![CDATA[
956 * このページの描画操作で使用する予定のスタイルを設定します。
958 * @param Zend_Pdf_Style $style
959 * @return Zend_Pdf_Page
961 public function setStyle(Zend_Pdf_Style $style);
964 * スタイルを返し、それをページに適用します。
966 * @return Zend_Pdf_Style|null
968 public function getStyle();
972 <classname>Zend_Pdf_Style</classname> クラスでは、
973 さまざまなグラフィックの状態を設定あるいは取得するためのメソッドが提供されています。
975 <programlisting language="php"><![CDATA[
979 * @param Zend_Pdf_Color $color
980 * @return Zend_Pdf_Page
982 public function setLineColor(Zend_Pdf_Color $color);
984 <programlisting language="php"><![CDATA[
988 * @return Zend_Pdf_Color|null
990 public function getLineColor();
992 <programlisting language="php"><![CDATA[
996 * @param float $width
997 * @return Zend_Pdf_Page
999 public function setLineWidth($width);
1000 ]]></programlisting>
1001 <programlisting language="php"><![CDATA[
1007 public function getLineWidth();
1008 ]]></programlisting>
1009 <programlisting language="php"><![CDATA[
1013 * @param array $pattern
1014 * @param float $phase
1015 * @return Zend_Pdf_Page
1017 public function setLineDashingPattern($pattern, $phase = 0);
1018 ]]></programlisting>
1019 <programlisting language="php"><![CDATA[
1025 public function getLineDashingPattern();
1026 ]]></programlisting>
1027 <programlisting language="php"><![CDATA[
1033 public function getLineDashingPhase();
1034 ]]></programlisting>
1035 <programlisting language="php"><![CDATA[
1039 * @param Zend_Pdf_Color $color
1040 * @return Zend_Pdf_Page
1042 public function setFillColor(Zend_Pdf_Color $color);
1043 ]]></programlisting>
1044 <programlisting language="php"><![CDATA[
1048 * @return Zend_Pdf_Color|null
1050 public function getFillColor();
1051 ]]></programlisting>
1052 <programlisting language="php"><![CDATA[
1056 * @param Zend_Pdf_Resource_Font $font
1057 * @param float $fontSize
1058 * @return Zend_Pdf_Page
1060 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
1061 ]]></programlisting>
1062 <programlisting language="php"><![CDATA[
1066 * @param float $fontSize
1067 * @return Zend_Pdf_Page
1069 public function setFontSize($fontSize);
1070 ]]></programlisting>
1071 <programlisting language="php"><![CDATA[
1075 * @return Zend_Pdf_Resource_Font $font
1077 public function getFont();
1078 ]]></programlisting>
1079 <programlisting language="php"><![CDATA[
1083 * @return float $fontSize
1085 public function getFontSize();
1086 ]]></programlisting>
1089 <sect2 id="zend.pdf.drawing.alpha">
1092 <classname>Zend_Pdf</classname> モジュールは、透明度の処理に対応しています。
1095 透明度を設定するには <methodname>Zend_Pdf_Page::setAlpha()</methodname> メソッドを使用します。
1096 <programlisting language="php"><![CDATA[
1103 * PDF でサポートするモードは次のとおりです
1104 * Normal (デフォルト), Multiply, Screen, Overlay, Darken, Lighten,
1105 * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion
1107 * @param float $alpha
1108 * @param string $mode
1109 * @throws Zend_Pdf_Exception
1110 * @return Zend_Pdf_Page
1112 public function setAlpha($alpha, $mode = 'Normal');
1113 ]]></programlisting>