pdf-writer 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +44 -0
- data/LICENCE +118 -0
- data/README +32 -0
- data/bin/loader +54 -0
- data/bin/manual +22 -0
- data/bin/manual.bat +2 -0
- data/demo/chunkybacon.rb +28 -0
- data/demo/code.rb +63 -0
- data/demo/colornames.rb +843 -0
- data/demo/demo.rb +65 -0
- data/demo/gettysburg.rb +58 -0
- data/demo/hello.rb +18 -0
- data/demo/individual-i.rb +81 -0
- data/demo/pac.rb +62 -0
- data/demo/pagenumber.rb +67 -0
- data/demo/qr-language.rb +573 -0
- data/demo/qr-library.rb +371 -0
- data/images/chunkybacon.jpg +0 -0
- data/images/chunkybacon.png +0 -0
- data/images/pdfwriter-icon.jpg +0 -0
- data/images/pdfwriter-small.jpg +0 -0
- data/lib/pdf/charts.rb +13 -0
- data/lib/pdf/charts/stddev.rb +431 -0
- data/lib/pdf/grid.rb +135 -0
- data/lib/pdf/math.rb +108 -0
- data/lib/pdf/quickref.rb +330 -0
- data/lib/pdf/simpletable.rb +946 -0
- data/lib/pdf/techbook.rb +890 -0
- data/lib/pdf/writer.rb +2661 -0
- data/lib/pdf/writer/arc4.rb +63 -0
- data/lib/pdf/writer/fontmetrics.rb +201 -0
- data/lib/pdf/writer/fonts/Courier-Bold.afm +342 -0
- data/lib/pdf/writer/fonts/Courier-BoldOblique.afm +342 -0
- data/lib/pdf/writer/fonts/Courier-Oblique.afm +342 -0
- data/lib/pdf/writer/fonts/Courier.afm +342 -0
- data/lib/pdf/writer/fonts/Helvetica-Bold.afm +2827 -0
- data/lib/pdf/writer/fonts/Helvetica-BoldOblique.afm +2827 -0
- data/lib/pdf/writer/fonts/Helvetica-Oblique.afm +3051 -0
- data/lib/pdf/writer/fonts/Helvetica.afm +3051 -0
- data/lib/pdf/writer/fonts/MustRead.html +1 -0
- data/lib/pdf/writer/fonts/Symbol.afm +213 -0
- data/lib/pdf/writer/fonts/Times-Bold.afm +2588 -0
- data/lib/pdf/writer/fonts/Times-BoldItalic.afm +2384 -0
- data/lib/pdf/writer/fonts/Times-Italic.afm +2667 -0
- data/lib/pdf/writer/fonts/Times-Roman.afm +2419 -0
- data/lib/pdf/writer/fonts/ZapfDingbats.afm +225 -0
- data/lib/pdf/writer/graphics.rb +727 -0
- data/lib/pdf/writer/graphics/imageinfo.rb +365 -0
- data/lib/pdf/writer/lang.rb +43 -0
- data/lib/pdf/writer/lang/en.rb +77 -0
- data/lib/pdf/writer/object.rb +23 -0
- data/lib/pdf/writer/object/action.rb +40 -0
- data/lib/pdf/writer/object/annotation.rb +42 -0
- data/lib/pdf/writer/object/catalog.rb +39 -0
- data/lib/pdf/writer/object/contents.rb +68 -0
- data/lib/pdf/writer/object/destination.rb +40 -0
- data/lib/pdf/writer/object/encryption.rb +53 -0
- data/lib/pdf/writer/object/font.rb +76 -0
- data/lib/pdf/writer/object/fontdescriptor.rb +34 -0
- data/lib/pdf/writer/object/fontencoding.rb +39 -0
- data/lib/pdf/writer/object/image.rb +168 -0
- data/lib/pdf/writer/object/info.rb +55 -0
- data/lib/pdf/writer/object/outline.rb +30 -0
- data/lib/pdf/writer/object/outlines.rb +30 -0
- data/lib/pdf/writer/object/page.rb +195 -0
- data/lib/pdf/writer/object/pages.rb +115 -0
- data/lib/pdf/writer/object/procset.rb +46 -0
- data/lib/pdf/writer/object/viewerpreferences.rb +74 -0
- data/lib/pdf/writer/ohash.rb +58 -0
- data/lib/pdf/writer/oreader.rb +25 -0
- data/lib/pdf/writer/state.rb +48 -0
- data/lib/pdf/writer/strokestyle.rb +138 -0
- data/manual.pwd +5151 -0
- metadata +147 -0
@@ -0,0 +1,225 @@
|
|
1
|
+
StartFontMetrics 4.1
|
2
|
+
Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
|
3
|
+
Comment Creation Date: Thu May 1 15:14:13 1997
|
4
|
+
Comment UniqueID 43082
|
5
|
+
Comment VMusage 45775 55535
|
6
|
+
FontName ZapfDingbats
|
7
|
+
FullName ITC Zapf Dingbats
|
8
|
+
FamilyName ZapfDingbats
|
9
|
+
Weight Medium
|
10
|
+
ItalicAngle 0
|
11
|
+
IsFixedPitch false
|
12
|
+
CharacterSet Special
|
13
|
+
FontBBox -1 -143 981 820
|
14
|
+
UnderlinePosition -100
|
15
|
+
UnderlineThickness 50
|
16
|
+
Version 002.000
|
17
|
+
Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
|
18
|
+
EncodingScheme FontSpecific
|
19
|
+
StdHW 28
|
20
|
+
StdVW 90
|
21
|
+
StartCharMetrics 202
|
22
|
+
C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
|
23
|
+
C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
|
24
|
+
C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
|
25
|
+
C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
|
26
|
+
C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
|
27
|
+
C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
|
28
|
+
C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
|
29
|
+
C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
|
30
|
+
C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
|
31
|
+
C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
|
32
|
+
C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
|
33
|
+
C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
|
34
|
+
C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
|
35
|
+
C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
|
36
|
+
C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
|
37
|
+
C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
|
38
|
+
C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
|
39
|
+
C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
|
40
|
+
C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
|
41
|
+
C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
|
42
|
+
C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
|
43
|
+
C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
|
44
|
+
C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
|
45
|
+
C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
|
46
|
+
C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
|
47
|
+
C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
|
48
|
+
C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
|
49
|
+
C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
|
50
|
+
C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
|
51
|
+
C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
|
52
|
+
C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
|
53
|
+
C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
|
54
|
+
C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
|
55
|
+
C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
|
56
|
+
C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
|
57
|
+
C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
|
58
|
+
C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
|
59
|
+
C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
|
60
|
+
C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
|
61
|
+
C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
|
62
|
+
C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
|
63
|
+
C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
|
64
|
+
C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
|
65
|
+
C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
|
66
|
+
C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
|
67
|
+
C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
|
68
|
+
C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
|
69
|
+
C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
|
70
|
+
C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
|
71
|
+
C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
|
72
|
+
C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
|
73
|
+
C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
|
74
|
+
C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
|
75
|
+
C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
|
76
|
+
C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
|
77
|
+
C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
|
78
|
+
C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
|
79
|
+
C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
|
80
|
+
C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
|
81
|
+
C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
|
82
|
+
C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
|
83
|
+
C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
|
84
|
+
C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
|
85
|
+
C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
|
86
|
+
C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
|
87
|
+
C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
|
88
|
+
C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
|
89
|
+
C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
|
90
|
+
C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
|
91
|
+
C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
|
92
|
+
C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
|
93
|
+
C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
|
94
|
+
C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
|
95
|
+
C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
|
96
|
+
C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
|
97
|
+
C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
|
98
|
+
C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
|
99
|
+
C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
|
100
|
+
C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
|
101
|
+
C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
|
102
|
+
C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
|
103
|
+
C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
|
104
|
+
C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
|
105
|
+
C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
|
106
|
+
C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
|
107
|
+
C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
|
108
|
+
C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
|
109
|
+
C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
|
110
|
+
C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
|
111
|
+
C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
|
112
|
+
C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
|
113
|
+
C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
|
114
|
+
C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
|
115
|
+
C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
|
116
|
+
C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
|
117
|
+
C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
|
118
|
+
C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
|
119
|
+
C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
|
120
|
+
C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
|
121
|
+
C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
|
122
|
+
C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
|
123
|
+
C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
|
124
|
+
C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
|
125
|
+
C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
|
126
|
+
C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
|
127
|
+
C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
|
128
|
+
C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
|
129
|
+
C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
|
130
|
+
C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
|
131
|
+
C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
|
132
|
+
C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
|
133
|
+
C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
|
134
|
+
C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
|
135
|
+
C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
|
136
|
+
C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
|
137
|
+
C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
|
138
|
+
C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
|
139
|
+
C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
|
140
|
+
C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
|
141
|
+
C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
|
142
|
+
C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
|
143
|
+
C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
|
144
|
+
C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
|
145
|
+
C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
|
146
|
+
C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
|
147
|
+
C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
|
148
|
+
C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
|
149
|
+
C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
|
150
|
+
C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
|
151
|
+
C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
|
152
|
+
C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
|
153
|
+
C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
|
154
|
+
C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
|
155
|
+
C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
|
156
|
+
C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
|
157
|
+
C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
|
158
|
+
C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
|
159
|
+
C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
|
160
|
+
C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
|
161
|
+
C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
|
162
|
+
C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
|
163
|
+
C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
|
164
|
+
C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
|
165
|
+
C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
|
166
|
+
C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
|
167
|
+
C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
|
168
|
+
C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
|
169
|
+
C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
|
170
|
+
C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
|
171
|
+
C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
|
172
|
+
C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
|
173
|
+
C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
|
174
|
+
C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
|
175
|
+
C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
|
176
|
+
C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
|
177
|
+
C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
|
178
|
+
C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
|
179
|
+
C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
|
180
|
+
C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
|
181
|
+
C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
|
182
|
+
C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
|
183
|
+
C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
|
184
|
+
C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
|
185
|
+
C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
|
186
|
+
C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
|
187
|
+
C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
|
188
|
+
C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
|
189
|
+
C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
|
190
|
+
C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
|
191
|
+
C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
|
192
|
+
C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
|
193
|
+
C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
|
194
|
+
C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
|
195
|
+
C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
|
196
|
+
C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
|
197
|
+
C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
|
198
|
+
C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
|
199
|
+
C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
|
200
|
+
C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
|
201
|
+
C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
|
202
|
+
C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
|
203
|
+
C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
|
204
|
+
C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
|
205
|
+
C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
|
206
|
+
C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
|
207
|
+
C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
|
208
|
+
C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
|
209
|
+
C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
|
210
|
+
C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
|
211
|
+
C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
|
212
|
+
C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
|
213
|
+
C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
|
214
|
+
C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
|
215
|
+
C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
|
216
|
+
C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
|
217
|
+
C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
|
218
|
+
C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
|
219
|
+
C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
|
220
|
+
C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
|
221
|
+
C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
|
222
|
+
C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
|
223
|
+
C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
|
224
|
+
EndCharMetrics
|
225
|
+
EndFontMetrics
|
@@ -0,0 +1,727 @@
|
|
1
|
+
#--
|
2
|
+
# PDF::Writer for Ruby.
|
3
|
+
# http://rubyforge.org/projects/ruby-pdf/
|
4
|
+
# Copyright 2003 - 2005 Austin Ziegler.
|
5
|
+
#
|
6
|
+
# Licensed under a MIT-style licence. See LICENCE in the main distribution
|
7
|
+
# for full licensing information.
|
8
|
+
#
|
9
|
+
# $Id: graphics.rb,v 1.10 2005/06/08 12:16:11 austin Exp $
|
10
|
+
#++
|
11
|
+
# Points for use in the drawing of polygons.
|
12
|
+
class PDF::Writer::PolygonPoint
|
13
|
+
def initialize(x, y, connector = :line)
|
14
|
+
@x, @y, @connector = x, y, connector
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :x, :y, :connector
|
18
|
+
end
|
19
|
+
|
20
|
+
# This module contains graphics primitives. Objects that include this
|
21
|
+
# module must respond to #add_content.
|
22
|
+
#
|
23
|
+
# The PDF::Writer coordinate system is in PDF userspace units. The
|
24
|
+
# coordinate system in PDF::Writer is slightly different than might be
|
25
|
+
# expected, in that <tt>(0, 0)</tt> is at the lower left-hand corner of
|
26
|
+
# the canvas (page), not the normal top left-hand corner of the canvas.
|
27
|
+
# (See the diagram below.)
|
28
|
+
#
|
29
|
+
# Y Y
|
30
|
+
# 0+-----+X
|
31
|
+
# | |
|
32
|
+
# | |
|
33
|
+
# | |
|
34
|
+
# 0+-----+X
|
35
|
+
# 0 0
|
36
|
+
#
|
37
|
+
# Each primitive provided below indicates the <em>New Point</em>, or the
|
38
|
+
# coordinates new drawing point at the completion of the drawing
|
39
|
+
# operation. Drawing operations themselves do *not* draw or fill the path.
|
40
|
+
# This must be done by one of the stroke or fill operators, #stroke,
|
41
|
+
# #close_stroke, #fill, #close_fill, #fill_stroke, or #close_fill_stroke.
|
42
|
+
#
|
43
|
+
# Drawing operations return +self+ (the canvas) so that operations may be
|
44
|
+
# chained.
|
45
|
+
module PDF::Writer::Graphics
|
46
|
+
# Close the current path by appending a straight line segment from the
|
47
|
+
# drawing point to the starting point of the path. If the path is
|
48
|
+
# closed, this does nothing. This operator terminates the current
|
49
|
+
# subpath.
|
50
|
+
def close
|
51
|
+
add_content(" h")
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
# Stroke the path. This operation terminates a path object and draws it.
|
56
|
+
def stroke
|
57
|
+
add_content(" S")
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
# Close the current path by appending a straight line segment from the
|
62
|
+
# drawing point to the starting point of the path, and then stroke it.
|
63
|
+
# This does the same as #close followed by #stroke.
|
64
|
+
def close_stroke
|
65
|
+
add_content(" s")
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# Fills the path. Open subpaths are implicitly closed before being
|
70
|
+
# filled. PDF offers two methods for determining the fill region. The
|
71
|
+
# first is called the "nonzero winding number" and is the default fill.
|
72
|
+
# The second is called "even-odd".
|
73
|
+
#
|
74
|
+
# Use the even-odd rule (called with <tt>#fill(:even_odd)</tt>) with
|
75
|
+
# caution, as this will cause certain portions of the path to be
|
76
|
+
# considered outside of the fill region, resulting in interesting cutout
|
77
|
+
# patterns.
|
78
|
+
def fill(rule = nil)
|
79
|
+
if :even_odd == rule
|
80
|
+
add_content(" f*")
|
81
|
+
else
|
82
|
+
add_content(" f")
|
83
|
+
end
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
87
|
+
# Close the current path by appending a straight line segment from the
|
88
|
+
# drawing point to the starting point of the path, and then fill it.
|
89
|
+
# This does the same as #close followed by #fill.
|
90
|
+
#
|
91
|
+
# See #fill for more information on fill rules.
|
92
|
+
def close_fill(rule = nil)
|
93
|
+
close
|
94
|
+
fill(rule)
|
95
|
+
self
|
96
|
+
end
|
97
|
+
|
98
|
+
# Fills and then strokes the path. Open subpaths are implicitly closed
|
99
|
+
# before being filled. This is the same as constructing two identical
|
100
|
+
# path objects, calling #fill on one and #stroke on the other. Paths
|
101
|
+
# filled and stroked in this manner are treated as if they were one
|
102
|
+
# object for PDF transparency purposes (the PDF transparency model is
|
103
|
+
# not yet supported by PDF::Writer).
|
104
|
+
#
|
105
|
+
# See #fill for more information on fill rules.
|
106
|
+
def fill_stroke(rule = nil)
|
107
|
+
if :even_odd == rule
|
108
|
+
add_content(" B*")
|
109
|
+
else
|
110
|
+
add_content(" B")
|
111
|
+
end
|
112
|
+
self
|
113
|
+
end
|
114
|
+
|
115
|
+
# Closes, fills and then strokes the path. Open subpaths are explicitly
|
116
|
+
# closed before being filled (as if #close and then #fill_stroke had
|
117
|
+
# been called). This is the same as constructing two identical path
|
118
|
+
# objects, calling #fill on one and #stroke on the other. Paths filled
|
119
|
+
# and stroked in this manner are treated as if they were one object for
|
120
|
+
# PDF transparency purposes (PDF transparency is not yet supported by
|
121
|
+
# PDF::Writer).
|
122
|
+
#
|
123
|
+
# See #fill for more information on fill rules.
|
124
|
+
def close_fill_stroke(rule = nil)
|
125
|
+
if :even_odd == rule
|
126
|
+
add_content(" b*")
|
127
|
+
else
|
128
|
+
add_content(" b")
|
129
|
+
end
|
130
|
+
self
|
131
|
+
end
|
132
|
+
|
133
|
+
# Move the drawing point to the specified coordinates <tt>(x, y)</tt>.
|
134
|
+
#
|
135
|
+
# New Point:: <tt>(x, y)</tt>
|
136
|
+
# Subpath:: New
|
137
|
+
def move_to(x, y)
|
138
|
+
add_content("\n%.3f %.3f m" % [ x, y ])
|
139
|
+
self
|
140
|
+
end
|
141
|
+
|
142
|
+
# Draw a straight line from the drawing point to <tt>(x, y)</tt>.
|
143
|
+
#
|
144
|
+
# New Point:: <tt>(x, y)</tt>
|
145
|
+
# Subpath:: Current
|
146
|
+
def line_to(x, y)
|
147
|
+
add_content("\n%.3f %.3f l" % [ x, y ])
|
148
|
+
self
|
149
|
+
end
|
150
|
+
|
151
|
+
# Draws a cubic Bezier curve from the drawing point to <tt>(x2, y2)</tt>
|
152
|
+
# using <tt>(x0, y0)</tt> and <tt>(x1, y1)</tt> as the control points
|
153
|
+
# for the curve.
|
154
|
+
#
|
155
|
+
# New Point:: <tt>(x2, y2)</tt>
|
156
|
+
# Subpath:: Current
|
157
|
+
def curve_to(x0, y0, x1, y1, x2, y2)
|
158
|
+
add_content("\n%.3f %.3f %.3f %.3f %.3f %.3f c" % [ x0, y0, x1, y1, x2, y2 ])
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
# Draws a cubic Bezier curve from the drawing point to <tt>(x1, y1)</tt>
|
163
|
+
# using the drawing point and <tt>(x0, y0)</tt> as the control points
|
164
|
+
# for the curve.
|
165
|
+
#
|
166
|
+
# New Point:: <tt>(x1, y1)</tt>
|
167
|
+
# Subpath:: Current
|
168
|
+
def scurve_to(x0, y0, x1, y1)
|
169
|
+
add_content("\n%.3f %.3f %.3f %.3f v" % [ x0, y0, x1, y1 ])
|
170
|
+
self
|
171
|
+
end
|
172
|
+
|
173
|
+
# Draws a cubic Bezier curve from the drawing point to <tt>(x1, y1)</tt>
|
174
|
+
# using <tt>(x0, y0)</tt> and <tt>(x1, y1)</tt> as the control points
|
175
|
+
# for the curve.
|
176
|
+
#
|
177
|
+
# New Point:: <tt>(x1, y1)</tt>
|
178
|
+
# Subpath:: Current
|
179
|
+
def ecurve_to(x0, y0, x1, y1)
|
180
|
+
add_content("\n%.3f %.3f %.3f %.3f y" % [ x0, y0, x1, y1 ])
|
181
|
+
self
|
182
|
+
end
|
183
|
+
|
184
|
+
# Draw a straight line from <tt>(x0, y0)</tt> to <tt>(x1, y1)</tt>. The
|
185
|
+
# line is a new subpath.
|
186
|
+
#
|
187
|
+
# New Point:: <tt>(x1, y1)</tt>.
|
188
|
+
# Subpath:: New
|
189
|
+
def line(x0, y0, x1, y1)
|
190
|
+
move_to(x0, y0).line_to(x1, y1)
|
191
|
+
end
|
192
|
+
|
193
|
+
# Draw a cubic Bezier curve from <tt>(x0, y0)</tt> to <tt>(x3, y3)</tt>
|
194
|
+
# using <tt>(x1, y1)</tt> and <tt>(x2, y2)</tt> as control points.
|
195
|
+
#
|
196
|
+
# New Point:: <tt>(x3, y3)</tt>
|
197
|
+
# Subpath:: New
|
198
|
+
def curve(x0, y0, x1, y1, x2, y2, x3, y3)
|
199
|
+
move_to(x0, y0).curve_to(x1, y1, x2, y2, x3, y3)
|
200
|
+
end
|
201
|
+
|
202
|
+
# Draw a cubic Bezier curve from <tt>(x0, y0)</tt> to <tt>(x2, y2)</tt>
|
203
|
+
# using <tt>(x0, y0)</tt> and <tt>(x1, y1)</tt> as control points.
|
204
|
+
#
|
205
|
+
# New Point:: <tt>(x2, y2)</tt>
|
206
|
+
# Subpath:: New
|
207
|
+
def scurve(x0, y0, x1, y1, x2, y2)
|
208
|
+
move_to(x0, y0).scurve_to(x1, y1, x2, y2)
|
209
|
+
end
|
210
|
+
|
211
|
+
# Draw a cubic Bezier curve from <tt>(x0, y0)</tt> to <tt>(x2, y2)</tt>
|
212
|
+
# using <tt>(x1, y1)</tt> and <tt>(x2, y2)</tt> as control points.
|
213
|
+
#
|
214
|
+
# New Point:: <tt>(x2, y2)</tt>
|
215
|
+
# Subpath:: New
|
216
|
+
def ecurve(x0, y0, x1, y1, x2, y2)
|
217
|
+
move_to(x0, y0).ecurve_to(x1, y1, x2, y2)
|
218
|
+
end
|
219
|
+
|
220
|
+
# This constant is used to approximate a symmetrical arc using a cubic
|
221
|
+
# Bezier curve.
|
222
|
+
KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0)
|
223
|
+
|
224
|
+
# Draws a circle of radius +r+ with the centre-point at <tt>(x, y)</tt>
|
225
|
+
# as a complete subpath. The drawing point will be moved to the
|
226
|
+
# centre-point upon completion of the drawing the circle.
|
227
|
+
def circle_at(x, y, r)
|
228
|
+
ellipse_at(x, y, r, r)
|
229
|
+
end
|
230
|
+
|
231
|
+
# Draws an ellipse of +x+ radius <tt>r1</tt> and +y+ radius <tt>r2</tt>
|
232
|
+
# with the centre-point at <tt>(x, y)</tt> as a complete subpath. The
|
233
|
+
# drawing point will be moved to the centre-point upon completion of the
|
234
|
+
# drawing the ellipse.
|
235
|
+
def ellipse_at(x, y, r1, r2 = r1)
|
236
|
+
l1 = r1 * KAPPA
|
237
|
+
l2 = r2 * KAPPA
|
238
|
+
move_to(x + r1, y)
|
239
|
+
# Upper right hand corner
|
240
|
+
curve_to(x + r1, y + l1, x + l2, y + r2, x, y + r2)
|
241
|
+
# Upper left hand corner
|
242
|
+
curve_to(x - l2, y + r2, x - r1, y + l1, x - r1, y)
|
243
|
+
# Lower left hand corner
|
244
|
+
curve_to(x - r1, y - l1, x - l2, y - r2, x, y - r2)
|
245
|
+
# Lower right hand corner
|
246
|
+
curve_to(x + l2, y - r2, x + r1, y - l1, x + r1, y)
|
247
|
+
move_to(x, y)
|
248
|
+
end
|
249
|
+
|
250
|
+
# Draw an ellipse centered at <tt>(x, y)</tt> with +x+ radius
|
251
|
+
# <tt>r1</tt> and +y+ radius <tt>r2</tt>. A partial ellipse can be drawn
|
252
|
+
# by specifying the starting and finishing angles.
|
253
|
+
#
|
254
|
+
# New Point:: <tt>(x, y)</tt>
|
255
|
+
# Subpath:: New
|
256
|
+
def ellipse2_at(x, y, r1, r2 = r1, start = 0, stop = 359.99, segments = 8)
|
257
|
+
segments = 2 if segments < 2
|
258
|
+
|
259
|
+
start = PDF::Math.deg2rad(start)
|
260
|
+
stop = PDF::Math.deg2rad(stop)
|
261
|
+
|
262
|
+
arc = stop - start
|
263
|
+
segarc = arc / segments.to_f
|
264
|
+
dtm = segarc / 3.0
|
265
|
+
|
266
|
+
theta = start
|
267
|
+
a0 = x + r1 * Math.cos(theta)
|
268
|
+
b0 = y + r2 * Math.sin(theta)
|
269
|
+
c0 = -r1 * Math.sin(theta)
|
270
|
+
d0 = r2 * Math.cos(theta)
|
271
|
+
|
272
|
+
move_to(a0, b0)
|
273
|
+
|
274
|
+
(1..segments).each do |ii|
|
275
|
+
theta = ii * segarc + start
|
276
|
+
|
277
|
+
a1 = x + r1 * Math.cos(theta)
|
278
|
+
b1 = y + r2 * Math.sin(theta)
|
279
|
+
c1 = -r1 * Math.sin(theta)
|
280
|
+
d1 = r2 * Math.cos(theta)
|
281
|
+
|
282
|
+
curve_to(a0 + (c0 * dtm),
|
283
|
+
b0 + (d0 * dtm),
|
284
|
+
a1 - (c1 * dtm),
|
285
|
+
b1 - (d1 * dtm), a1, b1)
|
286
|
+
|
287
|
+
a0 = a1
|
288
|
+
b0 = b1
|
289
|
+
c0 = c1
|
290
|
+
d0 = d1
|
291
|
+
end
|
292
|
+
|
293
|
+
move_to(x, y)
|
294
|
+
self
|
295
|
+
end
|
296
|
+
|
297
|
+
# Draws an ellipse segment. Draws a closed partial ellipse.
|
298
|
+
#
|
299
|
+
# New Point:: <tt>(x, y)</tt>
|
300
|
+
# Subpath:: New
|
301
|
+
def segment_at(x, y, r1, r2 = r1, start = 0, stop = 360, segments = 8)
|
302
|
+
ellipse2_at(x, y, r1, r2, start, stop, segments)
|
303
|
+
|
304
|
+
start = PDF::Math.deg2rad(start)
|
305
|
+
stop = PDF::Math.deg2rad(stop)
|
306
|
+
|
307
|
+
ax = x + r1 * Math.cos(start)
|
308
|
+
ay = y + r2 * Math.sin(start)
|
309
|
+
bx = x + r1 * Math.cos(stop)
|
310
|
+
by = y + r2 * Math.sin(stop)
|
311
|
+
|
312
|
+
move_to(ax, ay)
|
313
|
+
line_to(x, y)
|
314
|
+
line_to(bx, by)
|
315
|
+
move_to(x, y)
|
316
|
+
self
|
317
|
+
end
|
318
|
+
|
319
|
+
# Draw a polygon. +points+ is an array of PolygonPoint objects, or an
|
320
|
+
# array that can be converted to an array of PolygonPoint objects with
|
321
|
+
# <tt>PDF::Writer::PolygonPoint.new(*value)</tt>.
|
322
|
+
#
|
323
|
+
# New Point:: <tt>(points[-1].x, points[-1].y)</tt>
|
324
|
+
# Subpath:: New
|
325
|
+
def polygon(points)
|
326
|
+
points = points.map { |pp|
|
327
|
+
pp.kind_of?(Array) ? PDF::Writer::PolygonPoint.new(*pp) : pp
|
328
|
+
}
|
329
|
+
|
330
|
+
point = points.shift
|
331
|
+
|
332
|
+
move_to(point.x, point.y)
|
333
|
+
|
334
|
+
while not points.empty?
|
335
|
+
point = points.shift
|
336
|
+
|
337
|
+
case point.connector
|
338
|
+
when :curve
|
339
|
+
c1 = point
|
340
|
+
c2 = points.shift
|
341
|
+
point = points.shift
|
342
|
+
|
343
|
+
curve_to(c1.x, c1.y, c2.x, c2.y, point.x, point.y)
|
344
|
+
when :scurve
|
345
|
+
c1 = point
|
346
|
+
point = points.shift
|
347
|
+
scurve_to(c1.x, c1.y, point.x, point.y)
|
348
|
+
when :ecurve
|
349
|
+
c1 = point
|
350
|
+
point = points.shift
|
351
|
+
ecurve_to(c1.x, c1.y, point.x, point.y)
|
352
|
+
else
|
353
|
+
line_to(point.x, point.y)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
self
|
358
|
+
end
|
359
|
+
|
360
|
+
# Draw a rectangle. The first corner is <tt>(x, y)</tt> and the second
|
361
|
+
# corner is <tt>(x + w, y - h)</tt>.
|
362
|
+
#
|
363
|
+
# New Point:: <tt>(x + w, y - h)</tt>
|
364
|
+
# Subpath:: Current
|
365
|
+
def rectangle(x, y, w, h = w)
|
366
|
+
add_content("\n%.3f %.3f %.3f %.3f re" % [ x, y, w, h ])
|
367
|
+
self
|
368
|
+
end
|
369
|
+
|
370
|
+
# Draw a rounded rectangle with corners <tt>(x, y)</tt> and <tt>(x + w,
|
371
|
+
# y - h)</tt> and corner radius +r+. The radius should be significantly
|
372
|
+
# smaller than +h+ and +w+.
|
373
|
+
#
|
374
|
+
# New Point:: <tt>(x + w, y - h)</tt>
|
375
|
+
# Subpath:: New
|
376
|
+
def rounded_rectangle(x, y, w, h, r)
|
377
|
+
x1 = x
|
378
|
+
x2 = x1 + w
|
379
|
+
y1 = y
|
380
|
+
y2 = y1 - h
|
381
|
+
|
382
|
+
r1 = r
|
383
|
+
r2 = r / 2.0
|
384
|
+
|
385
|
+
points = [
|
386
|
+
[ x1 + r1, y1, :line ],
|
387
|
+
[ x2 - r1, y1, :line ],
|
388
|
+
[ x2 - r2, y1, :curve ], # cp1
|
389
|
+
[ x2, y1 - r2, ], # cp2
|
390
|
+
[ x2, y1 - r1, ], # ep
|
391
|
+
[ x2, y2 + r1, :line ],
|
392
|
+
[ x2, y2 + r2, :curve ], # cp1
|
393
|
+
[ x2 - r2, y2, ], # cp2
|
394
|
+
[ x2 - r1, y2, ], # ep
|
395
|
+
[ x1 + r1, y2, :line ],
|
396
|
+
[ x1 + r2, y2, :curve ], # cp1
|
397
|
+
[ x1, y2 + r2, ], # cp2
|
398
|
+
[ x1, y2 + r1, ], # ep
|
399
|
+
[ x1, y1 - r1, :line ],
|
400
|
+
[ x1, y1 - r2, :curve ], # cp1
|
401
|
+
[ x1 + r2, y1, ], # cp2
|
402
|
+
[ x1 + r1, y1, ], # ep
|
403
|
+
]
|
404
|
+
polygon(points)
|
405
|
+
move_to(x2, y2)
|
406
|
+
self
|
407
|
+
end
|
408
|
+
|
409
|
+
# Draws a star centered on <tt>(x, y)</tt> with +rays+ portions of
|
410
|
+
# +length+ from the centre. Stars with an odd number of rays should have
|
411
|
+
# the top ray pointing toward the top of the document. This will not
|
412
|
+
# create a "star" with fewer than four points.
|
413
|
+
#
|
414
|
+
# New Point:: <tt>(cx, cy)</tt>
|
415
|
+
# Subpath:: New
|
416
|
+
def star(cx, cy, length, rays = 5)
|
417
|
+
rays = 4 if rays < 4
|
418
|
+
points = []
|
419
|
+
part = Math::PI / rays.to_f
|
420
|
+
|
421
|
+
0.step((rays * 4), 2) do |ray|
|
422
|
+
if ((ray / 2) % 2 == 0)
|
423
|
+
dist = length / 2.0
|
424
|
+
else
|
425
|
+
dist = length
|
426
|
+
end
|
427
|
+
|
428
|
+
x = cx + Math.cos((1.5 + ray / 2.0) * part) * dist
|
429
|
+
y = cy + Math.sin((1.5 + ray / 2.0) * part) * dist
|
430
|
+
points << [ x, y ]
|
431
|
+
end
|
432
|
+
|
433
|
+
polygon(points)
|
434
|
+
move_to(cx, cy)
|
435
|
+
self
|
436
|
+
end
|
437
|
+
|
438
|
+
# This sets the line drawing style. This *must* be a
|
439
|
+
# PDF::Writer::StrokeStyle object.
|
440
|
+
def stroke_style(style)
|
441
|
+
stroke_style!(style) if @current_stroke_style.nil? or style != @current_stroke_style
|
442
|
+
end
|
443
|
+
|
444
|
+
# Forces the line drawing style to be set, even if it's the same as the
|
445
|
+
# current color. Emits the current stroke style if +nil+ is provided.
|
446
|
+
def stroke_style!(style = nil)
|
447
|
+
@current_stroke_style = style if style
|
448
|
+
add_content "\n#{@current_stroke_style.render}" if @current_stroke_style
|
449
|
+
end
|
450
|
+
|
451
|
+
# Returns the current stroke style.
|
452
|
+
def stroke_style?
|
453
|
+
@current_stroke_style
|
454
|
+
end
|
455
|
+
|
456
|
+
# Set the text rendering style. This may be one of the following
|
457
|
+
# options:
|
458
|
+
#
|
459
|
+
# 0:: fill
|
460
|
+
# 1:: stroke
|
461
|
+
# 2:: fill then stroke
|
462
|
+
# 3:: invisible
|
463
|
+
# 4:: fill and add to clipping path
|
464
|
+
# 5:: stroke and add to clipping path
|
465
|
+
# 6:: fill and stroke and add to clipping path
|
466
|
+
# 7:: add to clipping path
|
467
|
+
def text_render_style(style)
|
468
|
+
text_render_style!(style) unless @current_text_render_style and style == @current_text_render_style
|
469
|
+
end
|
470
|
+
|
471
|
+
# Forces the text rendering style to be set, even if it's the same as
|
472
|
+
# the current style.
|
473
|
+
def text_render_style!(style)
|
474
|
+
@current_text_render_style = style
|
475
|
+
end
|
476
|
+
|
477
|
+
# Reutnrs the current text rendering style.
|
478
|
+
def text_render_style?
|
479
|
+
@current_text_render_style
|
480
|
+
end
|
481
|
+
|
482
|
+
# Sets the color for fill operations.
|
483
|
+
def fill_color(color)
|
484
|
+
fill_color!(color) if @current_fill_color.nil? or color != @current_fill_color
|
485
|
+
end
|
486
|
+
|
487
|
+
# Forces the color for fill operations to be set, even if the color
|
488
|
+
# is the same as the current color. Does nothing if +nil+ is provided.
|
489
|
+
def fill_color!(color = nil)
|
490
|
+
if color
|
491
|
+
@current_fill_color = color
|
492
|
+
add_content "\n#{@current_fill_color.pdf_fill}"
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
# Returns the current fill color.
|
497
|
+
def fill_color?
|
498
|
+
@current_fill_color
|
499
|
+
end
|
500
|
+
|
501
|
+
# Sets the color for stroke operations.
|
502
|
+
def stroke_color(color)
|
503
|
+
stroke_color!(color) if @current_stroke_color.nil? or color != @current_stroke_color
|
504
|
+
end
|
505
|
+
|
506
|
+
# Forces the color for stroke operations to be set, even if the color
|
507
|
+
# is the same as the current color. Does nothing if +nil+ is provided.
|
508
|
+
def stroke_color!(color = nil)
|
509
|
+
if color
|
510
|
+
@current_stroke_color = color
|
511
|
+
add_content "\n#{@current_stroke_color.pdf_stroke}"
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
# Returns the current stroke color.
|
516
|
+
def stroke_color?
|
517
|
+
@current_stroke_color
|
518
|
+
end
|
519
|
+
|
520
|
+
# Add an image from a file to the current page at position <tt>(x,
|
521
|
+
# y)</tt> (the upper left-hand corner of the image). The image will be
|
522
|
+
# scaled to +width+ by +height+ units. The image may be a PNG or JPEG
|
523
|
+
# image.
|
524
|
+
#
|
525
|
+
# The +image+ parameter may be a filename or an object that returns the
|
526
|
+
# full image data when #read is called with no parameters (such as an IO
|
527
|
+
# object). If 'open-uri' is loaded, then the image name may be an URI.
|
528
|
+
def add_image_from_file(image, x, y, width = nil, height = nil)
|
529
|
+
data = nil
|
530
|
+
|
531
|
+
if image.respond_to?(:read)
|
532
|
+
data = image.read
|
533
|
+
else
|
534
|
+
open(image, 'rb') { |ff| data = ff.read }
|
535
|
+
end
|
536
|
+
|
537
|
+
add_image(data, x, y, width, height)
|
538
|
+
end
|
539
|
+
|
540
|
+
# Add an image from a loaded image (JPEG or PNG) resource at position
|
541
|
+
# <tt>(x, y)</tt> (the upper left-hand corner of the image) and scaled
|
542
|
+
# to +width+ by +height+ units. If provided, +image_info+ is a
|
543
|
+
# PDF::Writer::Graphics::ImageInfo object.
|
544
|
+
def add_image(image, x, y, width = nil, height = nil, image_info = nil)
|
545
|
+
unless image.kind_of?(PDF::Writer::External::Image)
|
546
|
+
image_info ||= PDF::Writer::Graphics::ImageInfo.new(image)
|
547
|
+
|
548
|
+
tt = Time.now
|
549
|
+
@images << tt
|
550
|
+
id = @images.index(tt)
|
551
|
+
label = "I#{id}"
|
552
|
+
image_obj = PDF::Writer::External::Image.new(self, image, image_info, label)
|
553
|
+
@images[id] = image_obj
|
554
|
+
else
|
555
|
+
label = image.label
|
556
|
+
image_obj = image
|
557
|
+
image_info ||= image.image_info
|
558
|
+
end
|
559
|
+
|
560
|
+
if width.nil? and height.nil?
|
561
|
+
width = image_info.width
|
562
|
+
height = image_info.height
|
563
|
+
end
|
564
|
+
|
565
|
+
width ||= height / image_info.height.to_f * image_info.width
|
566
|
+
height ||= width * image_info.height / image_info.width.to_f
|
567
|
+
|
568
|
+
tt = "\nq\n%.3f 0 0 %.3f %.3f %.3f cm\n/%s Do\nQ"
|
569
|
+
add_content(tt % [ width, height, x, y, label ])
|
570
|
+
image_obj
|
571
|
+
end
|
572
|
+
|
573
|
+
# Add an image easily to a PDF document. +image+ is the name of a JPG or
|
574
|
+
# PNG image. +options+ is a Hash:
|
575
|
+
#
|
576
|
+
# <tt>:pad</tt>:: The number of PDF userspace units that will
|
577
|
+
# be on all sides of the image. The default is
|
578
|
+
# <tt>5</tt> units.
|
579
|
+
# <tt>:width</tt>:: The desired width of the image. The image
|
580
|
+
# will be resized to this width with the
|
581
|
+
# aspect ratio kept. If unspecified, the
|
582
|
+
# image's natural width will be used.
|
583
|
+
# <tt>:resize</tt>:: How to resize the image, either :width
|
584
|
+
# (resizes the image to be as wide as the
|
585
|
+
# margins) or :full (resizes the image to be
|
586
|
+
# as large as possible). May be a numeric
|
587
|
+
# value, used as a multiplier for the image
|
588
|
+
# size (e.g., 0.5 will shrink the image to
|
589
|
+
# half-sized). If this and <tt>:width</tt> are
|
590
|
+
# unspecified, the image's natural size will be
|
591
|
+
# used. Mutually exclusive with the
|
592
|
+
# <tt>:width<tt> option.
|
593
|
+
# <tt>:justification</tt>:: The placement of the image. May be :center,
|
594
|
+
# :right, or :left. Defaults to :left.
|
595
|
+
# <tt>:border</tt>:: The border options. No default border. If
|
596
|
+
# specified, must be either +true+, which uses
|
597
|
+
# the default border, or a Hash.
|
598
|
+
#
|
599
|
+
# Image borders are specified as a hash with two options:
|
600
|
+
#
|
601
|
+
# <tt>:color</tt>:: The colour of the border. Defaults to 50% grey.
|
602
|
+
# <tt>:style</tt>:: The stroke style of the border. This must be a
|
603
|
+
# StrokeStyle object and defaults to the default line.
|
604
|
+
def image(image, options = {})
|
605
|
+
width = options[:width]
|
606
|
+
pad = options[:pad] || 5
|
607
|
+
resize = options[:resize]
|
608
|
+
just = options[:justification] || :left
|
609
|
+
border = options[:border]
|
610
|
+
|
611
|
+
if image.kind_of?(PDF::Writer::External::Image)
|
612
|
+
info = image.image_info
|
613
|
+
image_data = image
|
614
|
+
else
|
615
|
+
if image.respond_to?(:read)
|
616
|
+
image_data = image.read
|
617
|
+
else
|
618
|
+
image_data = open(image, "rb") { |file| file.read }
|
619
|
+
end
|
620
|
+
info = PDF::Writer::Graphics::ImageInfo.new(image_data)
|
621
|
+
end
|
622
|
+
|
623
|
+
raise "Unsupported Image Type" unless %w(JPEG PNG).include?(info.format)
|
624
|
+
|
625
|
+
width = info.width if width.nil?
|
626
|
+
aspect = info.width.to_f / info.height.to_f
|
627
|
+
|
628
|
+
# Get the maximum width of the image on insertion.
|
629
|
+
if @columns_on
|
630
|
+
max_width = @columns[:width] - (pad * 2)
|
631
|
+
else
|
632
|
+
max_width = @page_width - (pad * 2) - @left_margin - @right_margin
|
633
|
+
end
|
634
|
+
|
635
|
+
if resize == :full or resize == :width or width > max_width
|
636
|
+
width = max_width
|
637
|
+
end
|
638
|
+
|
639
|
+
# Keep the height in an appropriate aspect ratio of the width.
|
640
|
+
height = (width / aspect.to_f)
|
641
|
+
|
642
|
+
# Resize the image.
|
643
|
+
if resize.kind_of?(Numeric)
|
644
|
+
width *= resize
|
645
|
+
height *= resize
|
646
|
+
end
|
647
|
+
|
648
|
+
# Resize the image *again*, if it is wider than what is available.
|
649
|
+
if width > max_width
|
650
|
+
height = (width / aspect.to_f)
|
651
|
+
end
|
652
|
+
|
653
|
+
# If the height is greater than the available space:
|
654
|
+
havail = @y - @bottom_margin - (pad * 2)
|
655
|
+
if height > havail
|
656
|
+
# If the image is to be resized to :full (remaining space
|
657
|
+
# available), adjust the image size appropriately. Otherwise, start
|
658
|
+
# a new page and flow to the next page.
|
659
|
+
if resize == :full
|
660
|
+
height = havail
|
661
|
+
width = (height * aspect)
|
662
|
+
else
|
663
|
+
start_new_page
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
667
|
+
# Find the x and y positions.
|
668
|
+
y = @y - pad - height
|
669
|
+
x = @left_margin + pad
|
670
|
+
|
671
|
+
if (width < max_width)
|
672
|
+
case just
|
673
|
+
when :center
|
674
|
+
x += (max_width - width) / 2.0
|
675
|
+
when :right
|
676
|
+
x += (max_width - width)
|
677
|
+
end
|
678
|
+
end
|
679
|
+
|
680
|
+
image_obj = add_image(image_data, x, y, width, height, info)
|
681
|
+
|
682
|
+
if border
|
683
|
+
border = {} if true == border
|
684
|
+
border[:color] ||= Color::Grey50
|
685
|
+
border[:style] ||= PDF::Writer::StrokeStyle::DEFAULT
|
686
|
+
|
687
|
+
save_state
|
688
|
+
stroke_color border[:color]
|
689
|
+
stroke_style border[:style]
|
690
|
+
rectangle(x, y - pad, width, height - pad).stroke
|
691
|
+
restore_state
|
692
|
+
end
|
693
|
+
|
694
|
+
@y = @y - pad - height
|
695
|
+
|
696
|
+
image_obj
|
697
|
+
end
|
698
|
+
|
699
|
+
# Translate the coordinate system axis by the specified user space
|
700
|
+
# coordinates.
|
701
|
+
def translate_axis(x, y)
|
702
|
+
add_content("\n1 0 0 1 %.3f %.3f cm" % [ x, y ])
|
703
|
+
self
|
704
|
+
end
|
705
|
+
|
706
|
+
# Rotate the axis of the coordinate system by the specified clockwise
|
707
|
+
# angle.
|
708
|
+
def rotate_axis(angle)
|
709
|
+
rad = PDF::Math.deg2rad(angle)
|
710
|
+
add_content("\n1 %.3f %.3f 1 0 0 cm" % [ rad, -rad ])
|
711
|
+
self
|
712
|
+
end
|
713
|
+
|
714
|
+
# Scale the coordinate system axis by the specified factors.
|
715
|
+
def scale_axis(x = 1, y = 1)
|
716
|
+
add_content("\n%.3f 0 0 %.3f 0 0 cm" % [ x, y ])
|
717
|
+
self
|
718
|
+
end
|
719
|
+
|
720
|
+
# Skew the coordinate system axis by the specified angles.
|
721
|
+
def skew_axis(xangle = 0, yangle = 0)
|
722
|
+
xr = PDF::Math.deg2rad(xangle)
|
723
|
+
yr = PDF::Math.deg2rad(yangle)
|
724
|
+
add_content("\n1 %.3f %.3f 1 0 0 cm" % [ xr, -yr ])
|
725
|
+
self
|
726
|
+
end
|
727
|
+
end
|