[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Pdf-Drawing.xml
blobbc82436e64ff8e3644a27af0845a865e21f6b244
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.pdf.drawing">
5     <title>描画</title>
7     <sect2 id="zend.pdf.drawing.geometry">
8         <title>ジオメトリ</title>
9         <para>
10         <acronym>PDF</acronym> は PostScript と同じジオメトリを使用します。ページの左下隅を基準とし、
11         デフォルトではポイント数 (1 インチの 1/72) で場所を指定します。
12         </para>
13         <para>
14         ページの大きさはページオブジェクトから取得できます。
15         </para>
16         <para>
17             <programlisting language="php"><![CDATA[
18 $width  = $pdfPage->getWidth();
19 $height = $pdfPage->getHeight();
20 ]]></programlisting>
21         </para>
22     </sect2>
24     <sect2 id="zend.pdf.drawing.color">
25         <title>色</title>
26         <para>
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> クラスです。
33         </para>
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);
43 ]]></programlisting>
45         <para>
46         HTML 形式の色指定も <classname>Zend_Pdf_Color_Html</classname> クラスで使用できます。
47         </para>
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');
52 ]]></programlisting>
53     </sect2>
55     <sect2 id="zend.pdf.drawing.shape-drawing">
56         <title>図形の描画</title>
57         <para>
58         描画操作は、<acronym>PDF</acronym> のページに対して行われます。
59         </para>
60         <para>
61         基本図形のセットが <classname>Zend_Pdf_Page</classname> クラスで提供されています。
62         </para>
63         <programlisting language="php"><![CDATA[
64 /**
65  * x1,y1 から x2,y2 まで直線を描画します。
66  *
67  * @param float $x1
68  * @param float $y1
69  * @param float $x2
70  * @param float $y2
71  * @return Zend_Pdf_Page
72  */
73 public function drawLine($x1, $y1, $x2, $y2);
74 ]]></programlisting>
75         <programlisting language="php"><![CDATA[
76 /**
77  * 矩形を描画します。
78  *
79  * 描画方法
80  * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - 輪郭を描画して塗りつぶします (デフォルト)
81  * Zend_Pdf_Page::SHAPE_DRAW_STROKE          - 輪郭を描画します
82  * Zend_Pdf_Page::SHAPE_DRAW_FILL            - 矩形を塗りつぶします
83  *
84  * @param float $x1
85  * @param float $y1
86  * @param float $x2
87  * @param float $y2
88  * @param integer $fillType
89  * @return Zend_Pdf_Page
90  */
91 public function drawRectangle($x1, $y1, $x2, $y2,
92                     $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
93 ]]></programlisting>
94         <!-- TODO : to be translated -->
95         <programlisting language="php"><![CDATA[
96 /**
97  * Draw a rounded rectangle.
98  *
99  * Fill types:
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
106  * clockwise
108  * @param float $x1
109  * @param float $y1
110  * @param float $x2
111  * @param float $y2
112  * @param integer|array $radius
113  * @param integer $fillType
114  * @return Zend_Pdf_Page
115  */
116 public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
117                        $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
118 ]]></programlisting>
119         <programlisting language="php"><![CDATA[
121  * 多角形を描画します。
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)
126  * を参照ください。
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
133  */
134 public function drawPolygon($x, $y,
135                             $fillType =
136                                 Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
137                             $fillMethod =
138                                 Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
139 ]]></programlisting>
140         <programlisting language="php"><![CDATA[
142  * 中心が x, y で半径が radius の円を描画します。
144  * 角度はラジアンで指定します。
146  * Method signatures:
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 の場合は、円の正確な接線となります。
159  * @param float $x
160  * @param float $y
161  * @param float $radius
162  * @param mixed $param4
163  * @param mixed $param5
164  * @param mixed $param6
165  * @return Zend_Pdf_Page
166  */
167 public function  drawCircle($x,
168                             $y,
169                             $radius,
170                             $param4 = null,
171                             $param5 = null,
172                             $param6 = null);
173 ]]></programlisting>
174         <programlisting language="php"><![CDATA[
176  * 指定した矩形に内接する楕円を描画します。
178  * Method signatures:
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);
184  * 角度はラジアンで指定します。
186  * @param float $x1
187  * @param float $y1
188  * @param float $x2
189  * @param float $y2
190  * @param mixed $param5
191  * @param mixed $param6
192  * @param mixed $param7
193  * @return Zend_Pdf_Page
194  */
195 public function drawEllipse($x1,
196                             $y1,
197                             $x2,
198                             $y2,
199                             $param5 = null,
200                             $param6 = null,
201                             $param7 = null);
202 ]]></programlisting>
203     </sect2>
205     <sect2 id="zend.pdf.drawing.text-drawing">
206         <title>テキストの描画</title>
207         <para>
208         テキストに対する描画操作も、<acronym>PDF</acronym> のページに対して行われます。
209         ベースラインの x 座標および y 座標を指定することで、
210         ページ内の任意の場所にテキストを 1 行描画できます。
211         現在のフォントおよびフォントサイズを使用して、描画操作が行われます
212         (詳細は、以下を参照ください)。
213         </para>
214         <programlisting language="php"><![CDATA[
216  * 指定した位置にテキストを描画します。
218  * @param string $text
219  * @param float $x
220  * @param float $y
221  * @param string $charEncoding (オプション) ソーステキストの文字エンコーディング。
222  *   デフォルトは現在のロケールです。
223  * @throws Zend_Pdf_Exception
224  * @return Zend_Pdf_Page
225  */
226 public function drawText($text, $x, $y, $charEncoding = '');
227 ]]></programlisting>
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);
234 ]]></programlisting>
235         </example>
236         <para>
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         関数がサポートしているエンコーディングなら、すべて入力として使用することが可能です。
245         </para>
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);
253 // 文字列をページ上に描画します
254 $pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
256 ]]></programlisting>
257         </example>
258     </sect2>
260     <sect2 id="zend.pdf.drawing.using-fonts">
261         <title>フォントの使用</title>
262         <para>
263         <methodname>Zend_Pdf_Page::drawText()</methodname> は、
264         現在設定されているフォントおよびフォントサイズを使用します。
265         これは <methodname>Zend_Pdf_Page::setFont()</methodname> メソッドで設定できます。
266         </para>
267         <programlisting language="php"><![CDATA[
269  * 現在のフォントを設定します。
271  * @param Zend_Pdf_Resource_Font $font
272  * @param float $fontSize
273  * @return Zend_Pdf_Page
274  */
275 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
276 ]]></programlisting>
277         <para>
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 です。
283         </para>
284         <para>
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> です。
290         </para>
291         <example id="zend.pdf.drawing.using-fonts.example-1">
292             <title>標準フォントの作成</title>
293             <programlisting language="php"><![CDATA[
295 // 新しいフォントを作成します。
296 $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
298 // フォントを適用します。
299 $pdfPage->setFont($font, 36);
301 ]]></programlisting>
302         </example>
303         <para>
304         14 種類の標準フォント名を表す定数は、<classname>Zend_Pdf_Font</classname> クラスで定義されています。
305         <itemizedlist>
306             <listitem>
307                 <para>Zend_Pdf_Font::FONT_COURIER</para>
308             </listitem>
309             <listitem>
310                 <para>Zend_Pdf_Font::FONT_COURIER_BOLD</para>
311             </listitem>
312             <listitem>
313                 <para>Zend_Pdf_Font::FONT_COURIER_ITALIC</para>
314             </listitem>
315             <listitem>
316                 <para>Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC</para>
317             </listitem>
318             <listitem>
319                 <para>Zend_Pdf_Font::FONT_TIMES</para>
320             </listitem>
321             <listitem>
322                 <para>Zend_Pdf_Font::FONT_TIMES_BOLD</para>
323             </listitem>
324             <listitem>
325                 <para>Zend_Pdf_Font::FONT_TIMES_ITALIC</para>
326             </listitem>
327             <listitem>
328                 <para>Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC</para>
329             </listitem>
330             <listitem>
331                 <para>Zend_Pdf_Font::FONT_HELVETICA</para>
332             </listitem>
333             <listitem>
334                 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD</para>
335             </listitem>
336             <listitem>
337                 <para>Zend_Pdf_Font::FONT_HELVETICA_ITALIC</para>
338             </listitem>
339             <listitem>
340                 <para>Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC</para>
341             </listitem>
342             <listitem>
343                 <para>Zend_Pdf_Font::FONT_SYMBOL</para>
344             </listitem>
345             <listitem>
346                 <para>Zend_Pdf_Font::FONT_ZAPFDINGBATS</para>
347             </listitem>
348         </itemizedlist>
349         </para>
350         <para>
351         任意の TrueType フォント (通常は '.ttf' という拡張子です) も使用できますし、
352         TrueType アウトラインを含む OpenType フォント (拡張子は '.otf')
353         を使用することも可能です。現在はまだサポートしていませんが、将来は
354         Mac OS X の .dfont ファイルや Microsoft TrueType Collection
355         (拡張子 '.ttc') ファイルもサポートする予定です。
356         </para>
357         <para>
358         TrueType フォントを使用するには、フォントへのフルパスを指定しなければなりません。
359         何らかの理由でフォントが読み込めなかった場合、あるいはそれが TrueType
360         フォントでなかった場合は、ファクトリーメソッドが例外をスローします。
361         </para>
362         <example id="zend.pdf.drawing.using-fonts.example-2">
363             <title>TrueType フォントの作成</title>
364             <programlisting language="php"><![CDATA[
366 // 新しいフォントを作成します
367 $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');
369 // フォントを適用します
370 $pdfPage->setFont($goodDogCoolFont, 36);
372 ]]></programlisting>
373         </example>
374         <para>
375         デフォルトでは、独自のフォントは <acronym>PDF</acronym> ドキュメントに埋め込まれます。
376         そのため、閲覧者のシステムにそのフォントがインストールされていなくても、
377         ページをきちんと閲覧できるようになります。ファイルの大きさが気になる場合は、
378         ファクトリーメソッドのオプションで「フォントを埋め込まない」ことを指定できます。
379         </para>
380         <example id="zend.pdf.drawing.using-fonts.example-3">
381             <title>TrueType を作成するが、PDF ドキュメントには埋め込まない</title>
382             <programlisting language="php"><![CDATA[
384 // 新しいフォントを作成します
385 $goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
386                                                Zend_Pdf_Font::EMBED_DONT_EMBED);
388 // フォントを適用します
389 $pdfPage->setFont($goodDogCoolFont, 36);
391 ]]></programlisting>
392         </example>
393         <para>
394         <acronym>PDF</acronym> ファイルにフォントが埋め込まれていないけれども
395         閲覧者のシステムにはそのフォントがインストールされている場合は、ドキュメントは通常通りに閲覧できます。
396         もし適切なフォントがインストールされていないは、<acronym>PDF</acronym> 閲覧アプリケーションが適切な代替フォントを選択します。
397         </para>
398         <para>
399         中には、<acronym>PDF</acronym> ドキュメントへの埋め込みを禁止するようなライセンスを使用しているフォントもあります。
400         これをあなどってはいけません。もし埋め込めないフォントを利用しようとすると、
401         ファクトリーメソッドは例外をスローします。
402         </para>
403         <para>
404         このようなフォントを使用することも可能ですが、そのためには、
405         上で説明した「埋め込まない」フラグを使用するか、あるいは例外を抑制しなければなりません。
406         </para>
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
414         );
416 ]]></programlisting>
417         </example>
418         <para>
419         利用者にフォントを選択させる場合などは、この抑制方法を使用することをお勧めします。
420         <acronym>PDF</acronym> ドキュメントに埋め込めるフォントなら埋め込むでしょうし、
421         埋め込めないフォントは埋め込まないでしょう。
422         </para>
423         <para>
424         フォントのサイズは比較的大きく、中には 10 メガバイトに達するものもあります。
425         デフォルトでは埋め込みフォントは Flate 圧縮され、平均して 50% ほどサイズを節約できます。
426         何らかの理由でフォントを圧縮したくない場合は、以下のオプションで圧縮を無効にできます。
427         </para>
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);
435 ]]></programlisting>
436         </example>
437         <para>
438         最後に、必要に応じていくつかの埋め込みオプションをビット OR 演算子で連結することもできます。
439         </para>
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));
449 ]]></programlisting>
450         </example>
451     </sect2>
453     <sect2 id="zend.pdf.drawing.standard-fonts-limitations">
454         <title>標準 PDF フォントの制限</title>
455         <para>
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
460             フォントは例外です)。
461         </para>
462         <para>
463             <classname>Zend_Pdf</classname> は、標準フォントでのテキストの描画時に CP1252 (WinLatin1) を使用します。
464         </para>
465         <para>
466             他のエンコーディングでもテキストは描画できますが、
467             現在のロケールと異なる場合はそれを指定する必要があります。
468             実際に描画されるのは WinLatin1 の文字のみです。
469         </para>
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');
479 ]]></programlisting>
480         </example>
481     </sect2>
483     <sect2 id="zend.pdf.drawing.extracting-fonts">
484         <title>フォントの抽出</title>
485         <para>
486             <classname>Zend_Pdf</classname> モジュールを使用すると、読み込んだドキュメントからフォントを抽出できるようになります。
487         </para>
489         <para>
490             これは、ドキュメントをインクリメンタルに更新する際に便利です。
491             この機能がなければ、ドキュメントを更新するたびにフォントをアタッチしたり
492             ドキュメントに埋め込んだりしなければならなくなります。
493         </para>
495         <para>
496             <classname>Zend_Pdf</classname> オブジェクトおよび <classname>Zend_Pdf_Page</classname> オブジェクトには、
497             ドキュメントやページ内のすべてのフォントを抽出するためのメソッドが用意されています。
498         </para>
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));
508 $yPosition = 700;
509 foreach ($fontList as $font) {
510     $page->setFont($font, 15);
511     $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
512                                    'en',
513                                    'UTF-8');
514     $page->drawText($fontName . ': The quick brown fox jumps over the lazy dog',
515                     100,
516                     $yPosition,
517                     'UTF-8');
518     $yPosition -= 30;
521 // ドキュメントの最初のページで用いられているフォントを取得します
522 $firstPage = reset($pdf->pages);
523 $firstPageFonts = $firstPage->extractFonts();
525 ]]></programlisting>
526         </example>
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,
541                                'en',
542                                'UTF-8');
544 $pdf->save($docPath);
546 ]]></programlisting>
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 /* インクリメンタル更新モード */);
561 ]]></programlisting>
562         </example>
564         <para>
565             フォントの抽出はどこででもできますが、次のような制限があります。
566             <itemizedlist>
567                 <listitem><para>抽出したフォントは、そのフォントの抽出元と同じドキュメント内でしか使用できません。</para></listitem>
568                 <listitem>
569                     <para>
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);
579 $xPosition = $x;
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])
586              );
587     $xPosition += $width/$originalFont->getUnitsPerEm()*$fontSize;
590 ]]></programlisting>
591                     </para>
592                 </listitem>
593             </itemizedlist>
594         </para>
595     </sect2>
597     <sect2 id="zend.pdf.drawing.image-drawing">
598         <title>画像の描画</title>
599         <para>
600         <classname>Zend_Pdf_Page</classname> クラスの drawImage() メソッドで、
601         画像の描画を行います。
602         </para>
603         <programlisting language="php"><![CDATA[
605  * ページ内の指定した位置に画像を描画します。
607  * @param Zend_Pdf_Resource_Image $image
608  * @param float $x1
609  * @param float $y1
610  * @param float $x2
611  * @param float $y2
612  * @return Zend_Pdf_Page
613  */
614 public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);
615 ]]></programlisting>
616         <para>
617         画像オブジェクトは、<methodname>Zend_Pdf_Image::imageWithPath($filePath)</methodname>
618         メソッドで作成しなければなりません (現在は JPG、PNG および TIFF
619         画像をサポートしています)。
620         </para>
621         <example id="zend.pdf.drawing.image-drawing.example-1">
622             <title>画像の描画</title>
623             <programlisting language="php"><![CDATA[
625 // 画像を読み込みます
626 $image = Zend_Pdf_Image::imageWithPath('my_image.jpg');
628 $pdfPage->drawImage($image, 100, 100, 400, 300);
630 ]]></programlisting>
631         </example>
633         <para>
634             <emphasis>重要! JPEG のサポートには <acronym>PHP</acronym> の GD 拡張モジュールを必要とします。</emphasis>
635             <emphasis>重要! PNG でアルファチャネルを使用した画像を扱うには、ZLIB 拡張モジュールを必要とします。</emphasis>
636         </para>
637         <para>
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>)
641             を参照ください。
642         </para>
643     </sect2>
645     <sect2 id="zend.pdf.drawing.line-drawing-style">
646         <title>直線の描画スタイル</title>
647         <para>
648         直線の描画スタイルは、線幅と線の色、そして破線のパターンで定義されます。
649         これらはすべて、<classname>Zend_Pdf_Page</classname> クラスのメソッドで設定します。
650         </para>
651         <programlisting language="php"><![CDATA[
652 /** 線の色を設定します。*/
653 public function setLineColor(Zend_Pdf_Color $color);
655 /** 線の幅を設定します。*/
656 public function setLineWidth(float $width);
659  * 破線のパターンを設定します。
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
668  */
669 public function setLineDashingPattern($pattern, $phase = 0);
670 ]]></programlisting>
671     </sect2>
673     <sect2 id="zend.pdf.drawing.fill-style">
674         <title>塗りつぶしのスタイル</title>
675         <para>
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         を受け取ります。これは以下のいずれかの値となります。
680         </para>
682         <itemizedlist>
683             <listitem>
684                 <para>Zend_Pdf_Page::SHAPE_DRAW_STROKE - 図形の輪郭を描画します</para>
685             </listitem>
686             <listitem>
687                 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL - 図形を塗りつぶすだけです</para>
688             </listitem>
689             <listitem>
690                 <para>Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - 輪郭を描画し、塗りつぶします (デフォルトの挙動です)</para>
691             </listitem>
692         </itemizedlist>
694         <para>
695         <methodname>Zend_Pdf_Page::drawPolygon()</methodname> メソッドには、さらにパラメータ
696         <varname>$fillMethod</varname> を指定できます。
697         </para>
698         <itemizedlist>
699             <listitem>
700                 <para>Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (デフォルトの挙動)</para>
701                 <para>
702                 <citetitle><acronym>PDF</acronym> リファレンス</citetitle> によると、これは以下のように定義されています。
703                 <blockquote>
704                     <para>
705                         nonzero winding number ルールは、ある点がパスの内側にあるかどうかを
706                         判断するため、その点からどこかの方向に放射線を引いて
707                         その線がパスを構成する線と交わる場所を調べます。
708                         0 からカウントをはじめ、放射線の左から右にパスの線が横切った場合に
709                         +1、放射線の右から左に横切った場合に -1 します。
710                         すべての交点について調べた後、もし結果が 0 ならその点はパスの外側です。
711                         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                         「ドーナツの穴」の部分は外側という扱いになります。
728                     </para>
729                 </blockquote>
730                 </para>
731             </listitem>
732             <listitem>
733                 <para>Zend_Pdf_Const::FILLMETHOD_EVENODD</para>
734                 <para>
735                 <citetitle><acronym>PDF</acronym> リファレンス</citetitle> によると、これは以下のように定義されています。
736                 <blockquote>
737                     <para>
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                         これは、円の描画された方向に依存しません。
751                     </para>
752                 </blockquote>
753             </para>
754             </listitem>
755         </itemizedlist>
756     </sect2>
758     <sect2 id="zend.pdf.drawing.linear-transformations">
759         <title>線形変換</title>
760         <sect3 id="zend.pdf.drawing.linear-transformations.rotations">
761             <title>回転</title>
762             <para>
763             描画操作を適用する前に、<acronym>PDF</acronym> のページを回転させることができます。
764             それには <methodname>Zend_Pdf_Page::rotate()</methodname> メソッドを使用します。
765             </para>
766             <programlisting language="php"><![CDATA[
768  * ページを回転します。
770  * @param float $x  - 回転の中心の X 座標
771  * @param float $y  - 回転の中心の Y 座標
772  * @param float $angle - 回転角度
773  * @return Zend_Pdf_Page
774  */
775 public function rotate($x, $y, $angle);
776 ]]></programlisting>
777         </sect3>
779         <sect3 id="zend.pdf.drawing.linear-transformations.scale">
780             <title>ZF 1.8 以降で使用できる拡大/縮小</title>
781             <para>
782             倍率の変更は <methodname>Zend_Pdf_Page::scale()</methodname> メソッドで行います。
783             </para>
784             <programlisting language="php"><![CDATA[
786  * 座標系の拡大/縮小
788  * @param float $xScale - X 方向の倍率
789  * @param float $yScale - Y 方向の倍率
790  * @return Zend_Pdf_Page
791  */
792 public function scale($xScale, $yScale);
793 ]]></programlisting>
794         </sect3>
796         <sect3 id="zend.pdf.drawing.linear-transformations.translate">
797             <title>ZF 1.8 以降で使用できる移動</title>
798             <para>
799                 座標系の移動は <methodname>Zend_Pdf_Page::translate()</methodname> メソッドで行います。
800             </para>
801             <programlisting language="php"><![CDATA[
803  * 座標系の移動
805  * @param float $xShift - X 方向の移動
806  * @param float $yShift - Y 方向の移動
807  * @return Zend_Pdf_Page
808  */
809 public function translate($xShift, $yShift);
810 ]]></programlisting>
811         </sect3>
813         <sect3 id="zend.pdf.drawing.linear-transformations.skew">
814             <title>ZF 1.8 以降で使用できる傾斜</title>
815             <para>
816                 ページを傾けるには <methodname>Zend_Pdf_Page::skew()</methodname> メソッドを使用します。
817             </para>
818             <programlisting language="php"><![CDATA[
820  * 座標系の変換
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
827  */
828 public function skew($x, $y, $xAngle, $yAngle);
829 ]]></programlisting>
830         </sect3>
831     </sect2>
833     <sect2 id="zend.pdf.drawing.save-restore">
834         <title>グラフィックの状態の保存/復元</title>
835         <para>
836         好きな時点でのグラフィックの状態
837         (現在のフォント、フォントサイズ、線の色、塗りつぶしの色、線の形式、
838         ページの回転、クリップ領域) を保存/復元できます。
839         保存操作はグラフィックの状態をスタックに保存し、復元の際にはそこから取り出されます。
840         </para>
841         <para>
842         <classname>Zend_Pdf_Page</classname>
843         クラスには、これらの操作を行うための 2 つのメソッドがあります。
844         </para>
845         <programlisting language="php"><![CDATA[
847  * このページのグラフィックの状態を保存します。
848  * 現在適用されているスタイル・位置・クリップ領域および
849  * 回転/移動/拡大縮小などを情報を保存します。
851  * @return Zend_Pdf_Page
852  */
853 public function saveGS();
856  * 直近の saveGS() で保存されたグラフィックの状態を復元します。
858  * @return Zend_Pdf_Page
859  */
860 public function restoreGS();
861 ]]></programlisting>
862     </sect2>
864     <sect2 id="zend.pdf.drawing.clipping">
865         <title>描画領域のクリッピング</title>
866         <para>
867         <acronym>PDF</acronym> および <classname>Zend_Pdf</classname> モジュールは、描画領域のクリッピングに対応しています。
868         描画演算子が影響を及ぼす範囲を、このクリップ領域内に制限します。
869         クリップ領域の初期値は、ページ全体です。
870         </para>
871         <para>
872         <classname>Zend_Pdf_Page</classname> クラスでは、
873         クリッピングに関連するいくつかのメソッドを提供しています。
874         </para>
875         <programlisting language="php"><![CDATA[
877  * 矩形のクリップ領域を設定します。
879  * @param float $x1
880  * @param float $y1
881  * @param float $x2
882  * @param float $y2
883  * @return Zend_Pdf_Page
884  */
885 public function clipRectangle($x1, $y1, $x2, $y2);
886 ]]></programlisting>
887         <programlisting language="php"><![CDATA[
889  * 多角形のクリップ領域を設定します。
891  * @param array $x  - float の配列 (頂点の X 座標)
892  * @param array $y  - float の配列 (頂点の Y 座標)
893  * @param integer $fillMethod
894  * @return Zend_Pdf_Page
895  */
896 public function clipPolygon($x,
897                             $y,
898                             $fillMethod =
899                                 Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
900 ]]></programlisting>
901         <programlisting language="php"><![CDATA[
903  * 円形のクリップ領域を設定します。
905  * @param float $x
906  * @param float $y
907  * @param float $radius
908  * @param float $startAngle
909  * @param float $endAngle
910  * @return Zend_Pdf_Page
911  */
912 public function clipCircle($x,
913                            $y,
914                            $radius,
915                            $startAngle = null,
916                            $endAngle = null);
917 ]]></programlisting>
918         <programlisting language="php"><![CDATA[
920  * 楕円のクリップ領域を設定します。
922  * メソッドの書式
923  * drawEllipse($x1, $y1, $x2, $y2);
924  * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
926  * @todo $x2-$x1 == 0 や $y2-$y1 == 0 のような特別な場合への対応
928  * @param float $x1
929  * @param float $y1
930  * @param float $x2
931  * @param float $y2
932  * @param float $startAngle
933  * @param float $endAngle
934  * @return Zend_Pdf_Page
935  */
936 public function clipEllipse($x1,
937                             $y1,
938                             $x2,
939                             $y2,
940                             $startAngle = null,
941                             $endAngle = null);
942 ]]></programlisting>
943     </sect2>
945     <sect2 id="zend.pdf.drawing.styles">
946         <title>スタイル</title>
947         <para>
948         <classname>Zend_Pdf_Style</classname> クラスがスタイルに関する機能を提供します。
949         </para>
950         <para>
951         スタイルは、グラフィックの状態に関する複数の設定を保存し、
952         <acronym>PDF</acronym> のページに 1 回の操作でそれを適用するために使用されます。
953         </para>
954         <programlisting language="php"><![CDATA[
956  * このページの描画操作で使用する予定のスタイルを設定します。
958  * @param Zend_Pdf_Style $style
959  * @return Zend_Pdf_Page
960  */
961 public function setStyle(Zend_Pdf_Style $style);
964  * スタイルを返し、それをページに適用します。
966  * @return Zend_Pdf_Style|null
967  */
968 public function getStyle();
969 ]]></programlisting>
971         <para>
972         <classname>Zend_Pdf_Style</classname> クラスでは、
973         さまざまなグラフィックの状態を設定あるいは取得するためのメソッドが提供されています。
974         </para>
975         <programlisting language="php"><![CDATA[
977  * 線の色を設定します。
979  * @param Zend_Pdf_Color $color
980  * @return Zend_Pdf_Page
981  */
982 public function setLineColor(Zend_Pdf_Color $color);
983 ]]></programlisting>
984         <programlisting language="php"><![CDATA[
986  * 線の色を取得します。
988  * @return Zend_Pdf_Color|null
989  */
990 public function getLineColor();
991 ]]></programlisting>
992         <programlisting language="php"><![CDATA[
994  * 線の幅を設定します。
996  * @param float $width
997  * @return Zend_Pdf_Page
998  */
999 public function setLineWidth($width);
1000 ]]></programlisting>
1001         <programlisting language="php"><![CDATA[
1003  * 線の幅を取得します。
1005  * @return float
1006  */
1007 public function getLineWidth();
1008 ]]></programlisting>
1009         <programlisting language="php"><![CDATA[
1011  * 破線のパターンを設定します。
1013  * @param array $pattern
1014  * @param float $phase
1015  * @return Zend_Pdf_Page
1016  */
1017 public function setLineDashingPattern($pattern, $phase = 0);
1018 ]]></programlisting>
1019         <programlisting language="php"><![CDATA[
1021  * 破線のパターンを取得します。
1023  * @return array
1024  */
1025 public function getLineDashingPattern();
1026 ]]></programlisting>
1027         <programlisting language="php"><![CDATA[
1029  * 破線の位相を取得します。
1031  * @return float
1032  */
1033 public function getLineDashingPhase();
1034 ]]></programlisting>
1035         <programlisting language="php"><![CDATA[
1037  * 塗りつぶし色を設定します。
1039  * @param Zend_Pdf_Color $color
1040  * @return Zend_Pdf_Page
1041  */
1042 public function setFillColor(Zend_Pdf_Color $color);
1043 ]]></programlisting>
1044         <programlisting language="php"><![CDATA[
1046  * 塗りつぶし色を取得します。
1048  * @return Zend_Pdf_Color|null
1049  */
1050 public function getFillColor();
1051 ]]></programlisting>
1052         <programlisting language="php"><![CDATA[
1054  * 現在のフォントを設定します。
1056  * @param Zend_Pdf_Resource_Font $font
1057  * @param float $fontSize
1058  * @return Zend_Pdf_Page
1059  */
1060 public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
1061 ]]></programlisting>
1062         <programlisting language="php"><![CDATA[
1064  * 現在のフォントサイズを変更します。
1066  * @param float $fontSize
1067  * @return Zend_Pdf_Page
1068  */
1069 public function setFontSize($fontSize);
1070 ]]></programlisting>
1071         <programlisting language="php"><![CDATA[
1073  * 現在のフォントを取得します。
1075  * @return Zend_Pdf_Resource_Font $font
1076  */
1077 public function getFont();
1078 ]]></programlisting>
1079         <programlisting language="php"><![CDATA[
1081  * 現在のフォントサイズを取得します。
1083  * @return float $fontSize
1084  */
1085 public function getFontSize();
1086 ]]></programlisting>
1087     </sect2>
1089     <sect2 id="zend.pdf.drawing.alpha">
1090         <title>透明度</title>
1091         <para>
1092         <classname>Zend_Pdf</classname> モジュールは、透明度の処理に対応しています。
1093         </para>
1094         <para>
1095         透明度を設定するには <methodname>Zend_Pdf_Page::setAlpha()</methodname> メソッドを使用します。
1096         <programlisting language="php"><![CDATA[
1098  * 透明度を設定します
1100  * $alpha == 0  - 透明
1101  * $alpha == 1  - 不透明
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
1111  */
1112 public function setAlpha($alpha, $mode = 'Normal');
1113 ]]></programlisting>
1114         </para>
1115     </sect2>
1117 </sect1>