eideticpdf 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (177) hide show
  1. data/fonts/AntiqueOlive-Bold.afm +406 -0
  2. data/fonts/AntiqueOlive-Bold.inf +27 -0
  3. data/fonts/AntiqueOlive-Compact.afm +401 -0
  4. data/fonts/AntiqueOlive-Compact.inf +27 -0
  5. data/fonts/AntiqueOlive-Italic.afm +401 -0
  6. data/fonts/AntiqueOlive-Italic.inf +27 -0
  7. data/fonts/AntiqueOlive-Roman.afm +409 -0
  8. data/fonts/AntiqueOlive-Roman.inf +27 -0
  9. data/fonts/AvantGarde-Book.afm +667 -0
  10. data/fonts/AvantGarde-Book.inf +26 -0
  11. data/fonts/AvantGarde-BookOblique.afm +667 -0
  12. data/fonts/AvantGarde-BookOblique.inf +26 -0
  13. data/fonts/AvantGarde-Demi.afm +673 -0
  14. data/fonts/AvantGarde-Demi.inf +26 -0
  15. data/fonts/AvantGarde-DemiOblique.afm +673 -0
  16. data/fonts/AvantGarde-DemiOblique.inf +26 -0
  17. data/fonts/Bookman-Demi.afm +669 -0
  18. data/fonts/Bookman-Demi.inf +25 -0
  19. data/fonts/Bookman-DemiItalic.afm +669 -0
  20. data/fonts/Bookman-DemiItalic.inf +25 -0
  21. data/fonts/Bookman-Light.afm +643 -0
  22. data/fonts/Bookman-Light.inf +25 -0
  23. data/fonts/Bookman-LightItalic.afm +620 -0
  24. data/fonts/Bookman-LightItalic.inf +25 -0
  25. data/fonts/Clarendon-Bold.afm +412 -0
  26. data/fonts/Clarendon-Bold.inf +27 -0
  27. data/fonts/Clarendon-Light.afm +410 -0
  28. data/fonts/Clarendon-Light.inf +27 -0
  29. data/fonts/Clarendon.afm +410 -0
  30. data/fonts/Clarendon.inf +27 -0
  31. data/fonts/CooperBlack-Italic.afm +421 -0
  32. data/fonts/CooperBlack-Italic.inf +26 -0
  33. data/fonts/CooperBlack.afm +427 -0
  34. data/fonts/CooperBlack.inf +26 -0
  35. data/fonts/Coronet-Regular.afm +327 -0
  36. data/fonts/Coronet-Regular.inf +25 -0
  37. data/fonts/Courier-Bold.afm +342 -0
  38. data/fonts/Courier-Bold.inf +26 -0
  39. data/fonts/Courier-BoldOblique.afm +342 -0
  40. data/fonts/Courier-BoldOblique.inf +26 -0
  41. data/fonts/Courier-Oblique.afm +342 -0
  42. data/fonts/Courier-Oblique.inf +26 -0
  43. data/fonts/Courier.afm +342 -0
  44. data/fonts/Courier.inf +26 -0
  45. data/fonts/Eurostile.afm +419 -0
  46. data/fonts/Eurostile.inf +27 -0
  47. data/fonts/Goudy-ExtraBold.afm +412 -0
  48. data/fonts/Goudy-ExtraBold.inf +27 -0
  49. data/fonts/Helvetica-Bold.afm +2827 -0
  50. data/fonts/Helvetica-Bold.inf +26 -0
  51. data/fonts/Helvetica-BoldOblique.afm +2827 -0
  52. data/fonts/Helvetica-BoldOblique.inf +26 -0
  53. data/fonts/Helvetica-Condensed-Bold.afm +623 -0
  54. data/fonts/Helvetica-Condensed-Bold.inf +25 -0
  55. data/fonts/Helvetica-Condensed-BoldObl.afm +623 -0
  56. data/fonts/Helvetica-Condensed-BoldObl.inf +25 -0
  57. data/fonts/Helvetica-Condensed-Oblique.afm +528 -0
  58. data/fonts/Helvetica-Condensed-Oblique.inf +25 -0
  59. data/fonts/Helvetica-Condensed.afm +528 -0
  60. data/fonts/Helvetica-Condensed.inf +25 -0
  61. data/fonts/Helvetica-Narrow-Bold.afm +1439 -0
  62. data/fonts/Helvetica-Narrow-Bold.inf +26 -0
  63. data/fonts/Helvetica-Narrow-BoldOblique.afm +1439 -0
  64. data/fonts/Helvetica-Narrow-BoldOblique.inf +26 -0
  65. data/fonts/Helvetica-Narrow-Oblique.afm +1556 -0
  66. data/fonts/Helvetica-Narrow-Oblique.inf +26 -0
  67. data/fonts/Helvetica-Narrow.afm +1556 -0
  68. data/fonts/Helvetica-Narrow.inf +26 -0
  69. data/fonts/Helvetica-Oblique.afm +3051 -0
  70. data/fonts/Helvetica-Oblique.inf +26 -0
  71. data/fonts/Helvetica.afm +3051 -0
  72. data/fonts/Helvetica.inf +26 -0
  73. data/fonts/LetterGothic-Bold.afm +443 -0
  74. data/fonts/LetterGothic-Bold.inf +26 -0
  75. data/fonts/LetterGothic-BoldSlanted.afm +443 -0
  76. data/fonts/LetterGothic-BoldSlanted.inf +26 -0
  77. data/fonts/LetterGothic-Slanted.afm +443 -0
  78. data/fonts/LetterGothic-Slanted.inf +26 -0
  79. data/fonts/LetterGothic.afm +443 -0
  80. data/fonts/LetterGothic.inf +26 -0
  81. data/fonts/LubalinGraph-Book.afm +351 -0
  82. data/fonts/LubalinGraph-Book.inf +25 -0
  83. data/fonts/LubalinGraph-BookOblique.afm +351 -0
  84. data/fonts/LubalinGraph-BookOblique.inf +25 -0
  85. data/fonts/LubalinGraph-Demi.afm +351 -0
  86. data/fonts/LubalinGraph-Demi.inf +25 -0
  87. data/fonts/LubalinGraph-DemiOblique.afm +351 -0
  88. data/fonts/LubalinGraph-DemiOblique.inf +25 -0
  89. data/fonts/Marigold.afm +491 -0
  90. data/fonts/Marigold.inf +27 -0
  91. data/fonts/MonaLisa-Recut.afm +663 -0
  92. data/fonts/MonaLisa-Recut.inf +27 -0
  93. data/fonts/NewCenturySchlbk-Bold.afm +886 -0
  94. data/fonts/NewCenturySchlbk-Bold.inf +25 -0
  95. data/fonts/NewCenturySchlbk-BoldItalic.afm +1521 -0
  96. data/fonts/NewCenturySchlbk-BoldItalic.inf +26 -0
  97. data/fonts/NewCenturySchlbk-Italic.afm +1113 -0
  98. data/fonts/NewCenturySchlbk-Italic.inf +26 -0
  99. data/fonts/NewCenturySchlbk-Roman.afm +1067 -0
  100. data/fonts/NewCenturySchlbk-Roman.inf +26 -0
  101. data/fonts/Optima-Bold.afm +515 -0
  102. data/fonts/Optima-Bold.inf +27 -0
  103. data/fonts/Optima-BoldItalic.afm +712 -0
  104. data/fonts/Optima-BoldItalic.inf +26 -0
  105. data/fonts/Optima-Italic.afm +737 -0
  106. data/fonts/Optima-Italic.inf +26 -0
  107. data/fonts/Optima.afm +501 -0
  108. data/fonts/Optima.inf +27 -0
  109. data/fonts/Palatino-Bold.afm +675 -0
  110. data/fonts/Palatino-Bold.inf +26 -0
  111. data/fonts/Palatino-BoldItalic.afm +702 -0
  112. data/fonts/Palatino-BoldItalic.inf +26 -0
  113. data/fonts/Palatino-Italic.afm +700 -0
  114. data/fonts/Palatino-Italic.inf +26 -0
  115. data/fonts/Palatino-Roman.afm +718 -0
  116. data/fonts/Palatino-Roman.inf +26 -0
  117. data/fonts/StempelGaramond-Bold.afm +412 -0
  118. data/fonts/StempelGaramond-Bold.inf +27 -0
  119. data/fonts/StempelGaramond-BoldItalic.afm +413 -0
  120. data/fonts/StempelGaramond-BoldItalic.inf +27 -0
  121. data/fonts/StempelGaramond-Italic.afm +413 -0
  122. data/fonts/StempelGaramond-Italic.inf +27 -0
  123. data/fonts/StempelGaramond-Roman.afm +412 -0
  124. data/fonts/StempelGaramond-Roman.inf +27 -0
  125. data/fonts/Symbol.afm +213 -0
  126. data/fonts/Symbol.inf +27 -0
  127. data/fonts/Times-Bold.afm +2588 -0
  128. data/fonts/Times-Bold.inf +26 -0
  129. data/fonts/Times-BoldItalic.afm +2384 -0
  130. data/fonts/Times-BoldItalic.inf +26 -0
  131. data/fonts/Times-Italic.afm +2667 -0
  132. data/fonts/Times-Italic.inf +26 -0
  133. data/fonts/Times-Roman.afm +2419 -0
  134. data/fonts/Times-Roman.inf +26 -0
  135. data/fonts/Univers-Bold.afm +712 -0
  136. data/fonts/Univers-Bold.inf +27 -0
  137. data/fonts/Univers-BoldOblique.afm +712 -0
  138. data/fonts/Univers-BoldOblique.inf +27 -0
  139. data/fonts/Univers-Condensed.afm +403 -0
  140. data/fonts/Univers-Condensed.inf +27 -0
  141. data/fonts/Univers-CondensedOblique.afm +403 -0
  142. data/fonts/Univers-CondensedOblique.inf +27 -0
  143. data/fonts/Univers-Light.afm +737 -0
  144. data/fonts/Univers-Light.inf +27 -0
  145. data/fonts/Univers-LightOblique.afm +737 -0
  146. data/fonts/Univers-LightOblique.inf +27 -0
  147. data/fonts/Univers-Oblique.afm +656 -0
  148. data/fonts/Univers-Oblique.inf +27 -0
  149. data/fonts/Univers.afm +656 -0
  150. data/fonts/Univers.inf +27 -0
  151. data/fonts/ZapfChancery-MediumItalic.afm +842 -0
  152. data/fonts/ZapfChancery-MediumItalic.inf +26 -0
  153. data/fonts/ZapfDingbats.afm +225 -0
  154. data/fonts/ZapfDingbats.inf +26 -0
  155. data/lib/epdfafm.rb +334 -0
  156. data/lib/epdfdw.rb +710 -0
  157. data/lib/epdfk.rb +3142 -0
  158. data/lib/epdfo.rb +882 -0
  159. data/lib/epdfpw.rb +1749 -0
  160. data/lib/epdfs.rb +101 -0
  161. data/lib/epdfsw.rb +267 -0
  162. data/lib/epdft.rb +145 -0
  163. data/lib/epdftt.rb +458 -0
  164. data/test/pdf_tests.rb +16 -0
  165. data/test/test.rb +816 -0
  166. data/test/test_epdfafm.rb +202 -0
  167. data/test/test_epdfdw.rb +369 -0
  168. data/test/test_epdfk.rb +47 -0
  169. data/test/test_epdfo.rb +762 -0
  170. data/test/test_epdfpw.rb +129 -0
  171. data/test/test_epdfs.rb +54 -0
  172. data/test/test_epdfsw.rb +314 -0
  173. data/test/test_epdft.rb +198 -0
  174. data/test/test_epdftt.rb +34 -0
  175. data/test/test_helpers.rb +18 -0
  176. data/test/testimg.jpg +0 -0
  177. metadata +247 -0
@@ -0,0 +1,762 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Created by Brent Rowland on 2007-07-14.
4
+ # Copyright (c) 2007, Eidetic Software. All rights reserved.
5
+
6
+ $: << File.dirname(__FILE__) + '/../lib'
7
+ require 'test/unit'
8
+ require 'epdfo'
9
+
10
+ include EideticPDF::PdfObjects
11
+
12
+ class HeaderTestCases < Test::Unit::TestCase
13
+ def setup
14
+ @header = Header.new
15
+ @header11 = Header.new(1.1)
16
+ end
17
+
18
+ def test_to_s
19
+ assert_equal("%PDF-1.3\n", @header.to_s)
20
+ assert_equal("%PDF-1.1\n", @header11.to_s)
21
+ end
22
+ end
23
+
24
+ class IndirectObjectRefTestCases < Test::Unit::TestCase
25
+ def test_to_s
26
+ io = IndirectObject.new(1,0)
27
+ ior = IndirectObjectRef.new(io)
28
+ assert_equal("1 0 R ", ior.to_s)
29
+ end
30
+ end
31
+
32
+ class IndirectObjectTestCases < Test::Unit::TestCase
33
+ def setup
34
+ @io = IndirectObject.new(1,0)
35
+ end
36
+
37
+ def test_header
38
+ assert_equal("1 0 obj\n", @io.header)
39
+ end
40
+
41
+ def test_body
42
+ assert_equal('', @io.body)
43
+ end
44
+
45
+ def test_footer
46
+ assert_equal("endobj\n", @io.footer)
47
+ end
48
+
49
+ def test_to_s
50
+ assert_equal("1 0 obj\n" + "endobj\n", @io.to_s)
51
+ end
52
+ end
53
+
54
+ class PdfBooleanTestCases < Test::Unit::TestCase
55
+ def setup
56
+ @t = PdfBoolean.new(true)
57
+ @f = PdfBoolean.new(false)
58
+ end
59
+
60
+ def test_to_s
61
+ assert_equal('true ', @t.to_s)
62
+ assert_equal('false ', @f.to_s)
63
+ end
64
+ end
65
+
66
+ class PdfIntegerTestCases < Test::Unit::TestCase
67
+ def test_to_s
68
+ seven = PdfInteger.new(7)
69
+ assert_equal('7 ', seven.to_s)
70
+ end
71
+
72
+ def test_ary1
73
+ a = PdfInteger.ary([1, 2, 3])
74
+ assert_equal("[1 2 3 ] ", a.to_s)
75
+ end
76
+
77
+ def test_ary2
78
+ a = PdfInteger.ary([1, 2, [3, 4]])
79
+ assert_equal("[1 2 [3 4 ] ] ", a.to_s)
80
+ end
81
+ end
82
+
83
+ class PdfRealTestCases < Test::Unit::TestCase
84
+ def test_to_s
85
+ five_five = PdfReal.new(5.5)
86
+ assert_equal('5.5 ', five_five.to_s)
87
+ end
88
+ end
89
+
90
+ class PdfStringTestCases < Test::Unit::TestCase
91
+ def test_to_s
92
+ string = PdfString.new('a\b(cd)')
93
+ assert_equal(%q/(a\\\\b\(cd\)) /, string.to_s)
94
+ end
95
+
96
+ def test_escape
97
+ assert_equal('a\\\\b\(cd\)', PdfString.escape('a\\b(cd)'))
98
+ end
99
+ end
100
+
101
+ class PdfNameTestCases < Test::Unit::TestCase
102
+ def test_to_s
103
+ name = PdfName.new('name')
104
+ assert_equal('/name ', name.to_s)
105
+ end
106
+ end
107
+
108
+ class PdfArrayTestCases < Test::Unit::TestCase
109
+ def setup
110
+ @ary1 = PdfArray.new([1, 2, 3, 4, 5])
111
+ @ary2 = PdfArray.new([1, 2, 3, 4, 5], 3)
112
+ end
113
+
114
+ def test_to_s
115
+ assert_equal("[12345] ", @ary1.to_s)
116
+ assert_equal("[123\n45] ", @ary2.to_s)
117
+ end
118
+ end
119
+
120
+ class PdfDictionaryTestCases < Test::Unit::TestCase
121
+ def test_to_s
122
+ h = {
123
+ PdfName.new('foo') => PdfString.new('bar'),
124
+ PdfName.new('baz') => PdfInteger.new(7)
125
+ }
126
+ d = PdfDictionary.new(h)
127
+ assert_equal("<<\n/baz 7 \n/foo (bar) \n>>\n", d.to_s)
128
+ end
129
+ end
130
+
131
+ class PdfDictionaryObjectTestCases < Test::Unit::TestCase
132
+ def test_body
133
+ h = {
134
+ 'foo' => PdfString.new('bar'),
135
+ 'baz' => PdfInteger.new(7)
136
+ }
137
+ pdo = PdfDictionaryObject.new(1,0,h)
138
+ assert_equal("<<\n/baz 7 \n/foo (bar) \n>>\n", pdo.body)
139
+ end
140
+ end
141
+
142
+ class PdfStreamTestCases < Test::Unit::TestCase
143
+ def setup
144
+ @ps = PdfStream.new(1,0,'test')
145
+ # @ps.length = 4
146
+ @ps.filter = 'bogus'
147
+ end
148
+
149
+ def test_length
150
+ assert_equal(PdfInteger.new(4), @ps.dictionary['Length'])
151
+ end
152
+
153
+ def test_filter
154
+ assert_equal(PdfName.new('bogus'), @ps.dictionary['Filter'])
155
+ end
156
+
157
+ def test_body
158
+ assert_equal("<<\n/Filter /bogus \n/Length 4 \n>>\nstream\ntestendstream\n", @ps.body)
159
+ end
160
+
161
+ def test_to_s
162
+ assert_equal("1 0 obj\n<<\n/Filter /bogus \n/Length 4 \n>>\nstream\ntestendstream\nendobj\n", @ps.to_s)
163
+ end
164
+ end
165
+
166
+ class PdfNullTestCases < Test::Unit::TestCase
167
+ def test_to_s
168
+ null = PdfNull.new
169
+ assert_equal("null ", null.to_s)
170
+ end
171
+ end
172
+
173
+ class InUseXRefEntryTestCases < Test::Unit::TestCase
174
+ def test_to_s
175
+ entry = InUseXRefEntry.new(500,0)
176
+ assert_equal("0000000500 00000 n\n", entry.to_s)
177
+ end
178
+ end
179
+
180
+ class FreeXRefEntryTestCases < Test::Unit::TestCase
181
+ def test_to_s
182
+ entry = FreeXRefEntry.new(1,0)
183
+ assert_equal("0000000001 00000 f\n", entry.to_s)
184
+ end
185
+ end
186
+
187
+ class XRefSubSectionTestCases < Test::Unit::TestCase
188
+ def setup
189
+ @sub_section = XRefSubSection.new
190
+ @sub_section << InUseXRefEntry.new(0,0)
191
+ @sub_section << InUseXRefEntry.new(100,1)
192
+ end
193
+
194
+ def test_to_s
195
+ assert_equal("0 3\n0000000000 65535 f\n0000000000 00000 n\n0000000100 00001 n\n", @sub_section.to_s)
196
+ end
197
+ end
198
+
199
+ class XRefTableTestCases < Test::Unit::TestCase
200
+ def setup
201
+ @table = XRefTable.new
202
+ @sub_section = XRefSubSection.new
203
+ @sub_section << InUseXRefEntry.new(0,0)
204
+ @sub_section << InUseXRefEntry.new(100,1)
205
+ @table << @sub_section
206
+ end
207
+
208
+ def test_to_s
209
+ assert_equal("xref\n0 3\n0000000000 65535 f\n0000000000 00000 n\n0000000100 00001 n\n", @table.to_s)
210
+ end
211
+ end
212
+
213
+ class BodyTestCases < Test::Unit::TestCase
214
+ def setup
215
+ @io_int = IndirectObject.new(1,0,PdfInteger.new(7))
216
+ @io_str = IndirectObject.new(2,0,PdfString.new("Hello"))
217
+ @body = Body.new
218
+ end
219
+
220
+ def test_write_and_xref
221
+ @body << @io_int << @io_str
222
+ s = ''
223
+ sub_section = XRefSubSection.new
224
+ @body.write_and_xref(s, sub_section)
225
+ assert_equal(@io_int.to_s + @io_str.to_s, s)
226
+ assert_equal("0 3\n0000000000 65535 f\n0000000000 00000 n\n0000000018 00000 n\n", sub_section.to_s)
227
+ end
228
+ end
229
+
230
+ class PdfCatalogTestCases < Test::Unit::TestCase
231
+ def setup
232
+ @pages = PdfPages.new(1, 0)
233
+ @outlines = PdfOutlines.new(2, 0)
234
+ @cat = PdfCatalog.new(3, 0, :use_none, @pages, @outlines)
235
+ end
236
+
237
+ def test_to_s
238
+ assert_equal("3 0 obj\n<<\n/Outlines 2 0 R \n/PageMode /UseNone \n/Pages 1 0 R \n/Type /Catalog \n>>\nendobj\n", @cat.to_s)
239
+ end
240
+ end
241
+
242
+ class TrailerTestCases < Test::Unit::TestCase
243
+ def setup
244
+ @trailer = Trailer.new
245
+ @trailer.xref_table_start = 0
246
+ @trailer.xref_table_size = 3
247
+ end
248
+
249
+ def test_xref_table_size
250
+ assert_equal(3, @trailer.xref_table_size)
251
+ assert_equal(3, @trailer['Size'].value)
252
+ end
253
+
254
+ def test_to_s
255
+ assert_equal("trailer\n<<\n/Size 3 \n>>\nstartxref\n0\n%%EOF\n", @trailer.to_s)
256
+ end
257
+ end
258
+
259
+ class RectangleTestCases < Test::Unit::TestCase
260
+ def setup
261
+ @rect = Rectangle.new(1,2,3,4)
262
+ end
263
+
264
+ def test_attributes
265
+ assert_equal(1, @rect.x1)
266
+ assert_equal(2, @rect.y1)
267
+ assert_equal(3, @rect.x2)
268
+ assert_equal(4, @rect.y2)
269
+ end
270
+
271
+ def test_to_s
272
+ assert_equal("[1 2 3 4 ] ", @rect.to_s)
273
+ end
274
+ end
275
+
276
+ module FontFactory
277
+ def make_font_descriptor
278
+ PdfFontDescriptor.new(100, 0,
279
+ 'ArialMT', 32, [-665, -325, 2029, 1006], 0, 0, 0, 0,
280
+ 723, 525,
281
+ 905, -212, 33,
282
+ 2000, 0)
283
+ end
284
+ end
285
+
286
+ class PdfFontTestCases < Test::Unit::TestCase
287
+ include FontFactory
288
+
289
+ def setup
290
+ @widths = PdfArray.new([1, 3, 5, 7])
291
+ @io_widths = IndirectObject.new(2, 0, @widths)
292
+ @font_descriptor = make_font_descriptor
293
+ @font = PdfFont.new(1, 0, 'TrueType', 'ArialMT', 32, 169, @io_widths, @font_descriptor)
294
+ end
295
+
296
+ def test_to_s
297
+ expected = "1 0 obj\n" <<
298
+ "<<\n" <<
299
+ "/BaseFont /ArialMT \n" <<
300
+ "/FirstChar 32 \n" <<
301
+ "/FontDescriptor 100 0 R \n" <<
302
+ "/LastChar 169 \n" <<
303
+ "/Subtype /TrueType \n" <<
304
+ "/Type /Font \n" <<
305
+ "/Widths 2 0 R \n" <<
306
+ ">>\n" <<
307
+ "endobj\n"
308
+ assert_equal(expected, @font.to_s)
309
+ end
310
+
311
+ def test_encoding=
312
+ @font.encoding = 'WinAnsiEncoding'
313
+ assert_equal(PdfName.new('WinAnsiEncoding'), @font.dictionary['Encoding'])
314
+ end
315
+ end
316
+
317
+ class PdfFontDescriptorTestCases < Test::Unit::TestCase
318
+ include FontFactory
319
+
320
+ def setup
321
+ @font_descriptor = make_font_descriptor
322
+ end
323
+
324
+ def test_to_s
325
+ expected = "100 0 obj\n" <<
326
+ "<<\n" <<
327
+ "/Ascent 905 \n" <<
328
+ "/AvgWidth 0 \n" <<
329
+ "/CapHeight 723 \n" <<
330
+ "/Descent -212 \n" <<
331
+ "/Flags 32 \n" <<
332
+ "/FontBBox [-665 -325 2029 1006 ] \n" <<
333
+ "/FontName /ArialMT \n" <<
334
+ "/ItalicAngle 0.0 \n" <<
335
+ "/Leading 33 \n" <<
336
+ "/MaxWidth 2000 \n" <<
337
+ "/MissingWidth 0 \n" <<
338
+ "/StemH 0 \n" <<
339
+ "/StemV 0 \n" <<
340
+ "/Type /FontDescriptor \n" <<
341
+ "/XHeight 525 \n" <<
342
+ ">>\n" <<
343
+ "endobj\n"
344
+ assert_equal(expected, @font_descriptor.to_s)
345
+ end
346
+ end
347
+
348
+ class PdfFontEncodingTestCases < Test::Unit::TestCase
349
+ def setup
350
+ differences = PdfArray.new([PdfInteger.new(32), PdfName.new('space')])
351
+ @font_encoding = PdfFontEncoding.new(1, 0, "MacRomanEncoding", differences)
352
+ end
353
+
354
+ def test_to_s
355
+ expected = "1 0 obj\n" <<
356
+ "<<\n" <<
357
+ "/BaseEncoding /MacRomanEncoding \n" <<
358
+ "/Differences [32 /space ] \n" <<
359
+ "/Type /Encoding \n" <<
360
+ ">>\n" <<
361
+ "endobj\n"
362
+ assert_equal(expected, @font_encoding.to_s)
363
+ end
364
+ end
365
+
366
+ class PdfXObjectTestCases < Test::Unit::TestCase
367
+ def test_initialize
368
+ xobj = PdfXObject.new(1,0)
369
+ assert_equal(PdfName.new('XObject'), xobj.dictionary['Type'])
370
+ end
371
+ end
372
+
373
+ class PdfImageTestCases < Test::Unit::TestCase
374
+ def setup
375
+ @image = PdfImage.new(1,0,'test')
376
+ end
377
+
378
+ def test_initialize
379
+ assert_equal(PdfName.new('XObject'), @image.dictionary['Type'])
380
+ assert_equal(PdfName.new('Image'), @image.dictionary['Subtype'])
381
+ end
382
+
383
+ def test_body
384
+ assert_equal("<<\n/Length 4 \n/Subtype /Image \n/Type /XObject \n>>\nstream\ntestendstream\n", @image.body)
385
+ assert_equal(PdfInteger.new(4), @image.dictionary['Length'])
386
+ end
387
+
388
+ def test_filter=
389
+ @image.filter = 'ASCIIHexDecode'
390
+ assert_equal(PdfName.new('ASCIIHexDecode'), @image.dictionary['Filter'])
391
+ end
392
+
393
+ def test_filters=
394
+ filters = PdfArray.new ['ASCII85Decode', 'LZWDecode'].map { |s| PdfName.new(s) }
395
+ @image.filters = filters
396
+ assert_equal(filters, @image.dictionary['Filter'])
397
+ end
398
+
399
+ def test_width
400
+ @image.width = 320
401
+ assert_equal(320, @image.width)
402
+ assert_equal(PdfInteger.new(320), @image.dictionary['Width'])
403
+ end
404
+
405
+ def test_height
406
+ @image.height = 200
407
+ assert_equal(200, @image.height)
408
+ assert_equal(PdfInteger.new(200), @image.dictionary['Height'])
409
+ end
410
+
411
+ def test_bits_per_component=
412
+ @image.bits_per_component = 8
413
+ assert_equal(PdfInteger.new(8), @image.dictionary['BitsPerComponent'])
414
+ end
415
+
416
+ def test_color_space=
417
+ @image.color_space = 'DeviceCMYK'
418
+ assert_equal(PdfName.new('DeviceCMYK'), @image.dictionary['ColorSpace'])
419
+ # todo: test other types of values, such as indirect objects
420
+ end
421
+
422
+ def test_decode=
423
+ decode = PdfArray.new [1, 0].map { |i| PdfInteger.new(i )}
424
+ @image.decode = decode
425
+ assert_equal(decode, @image.dictionary['Decode'])
426
+ end
427
+
428
+ def test_interpolate=
429
+ @image.interpolate = true
430
+ assert_equal(PdfBoolean.new(true), @image.dictionary['Interpolate'])
431
+ end
432
+
433
+ def test_image_mask=
434
+ @image.image_mask = false
435
+ assert_equal(PdfBoolean.new(false), @image.dictionary['ImageMask'])
436
+ end
437
+
438
+ def test_intent=
439
+ @image.intent = 'AbsoluteColorimetric'
440
+ assert_equal(PdfName.new('AbsoluteColorimetric'), @image.dictionary['Intent'])
441
+ end
442
+ end
443
+
444
+ class PdfAnnotTestCases < Test::Unit::TestCase
445
+ def setup
446
+ @rect = Rectangle.new(1,2,3,4)
447
+ @annot = PdfAnnot.new(1, 0, 'Text', @rect)
448
+ end
449
+
450
+ def test_initialize
451
+ assert_equal(1, @annot.seq)
452
+ assert_equal(0, @annot.gen)
453
+ assert_equal(PdfName.new('Annot'), @annot.dictionary['Type'])
454
+ assert_equal(PdfName.new('Text'), @annot.dictionary['Subtype'])
455
+ assert_equal(@rect, @annot.dictionary['Rect'])
456
+ end
457
+
458
+ def test_border=
459
+ border = [0, 0, 1]
460
+ @annot.border = border
461
+ assert_equal(PdfInteger.ary(border), @annot.dictionary['Border'])
462
+ end
463
+
464
+ def test_color=
465
+ color = [0.2, 0.4, 0.6]
466
+ @annot.color = color
467
+ assert_equal(PdfReal.ary(color), @annot.dictionary['C'])
468
+ end
469
+
470
+ def test_title=
471
+ @annot.title = 'Joe'
472
+ assert_equal(PdfString.new('Joe'), @annot.dictionary['T'])
473
+ end
474
+
475
+ def test_mod_date=
476
+ t = Time.local(2007, 9, 8, 14, 30, 0, 0)
477
+ @annot.mod_date = t
478
+ assert_equal(PdfString.new('20070908143000'), @annot.dictionary['M'])
479
+ end
480
+
481
+ def test_flags=
482
+ @annot.flags = 0
483
+ assert_equal(PdfInteger.new(0), @annot.dictionary['F'])
484
+ end
485
+
486
+ def test_highlight=
487
+ @annot.highlight = :none
488
+ assert_equal(PdfName.new('N'), @annot.dictionary['H'])
489
+ @annot.highlight = :invert
490
+ assert_equal(PdfName.new('I'), @annot.dictionary['H'])
491
+ @annot.highlight = :outline
492
+ assert_equal(PdfName.new('O'), @annot.dictionary['H'])
493
+ @annot.highlight = :push
494
+ assert_equal(PdfName.new('P'), @annot.dictionary['H'])
495
+
496
+ @annot.highlight = 'N'
497
+ assert_equal(PdfName.new('N'), @annot.dictionary['H'])
498
+ @annot.highlight = 'I'
499
+ assert_equal(PdfName.new('I'), @annot.dictionary['H'])
500
+ @annot.highlight = 'O'
501
+ assert_equal(PdfName.new('O'), @annot.dictionary['H'])
502
+ @annot.highlight = 'P'
503
+ assert_equal(PdfName.new('P'), @annot.dictionary['H'])
504
+ end
505
+
506
+ def test_border_style=
507
+ border_style = {
508
+ 'Type' => PdfName.new('Border'),
509
+ 'W' => PdfInteger.new(1),
510
+ 'S' => PdfName.new('D'),
511
+ 'D' => PdfInteger.ary([3, 2])
512
+ }
513
+ @annot.border_style = border_style
514
+ assert_equal(PdfDictionary.new(border_style).to_s, @annot.dictionary['BS'].to_s)
515
+ end
516
+
517
+ def test_appearance_dictionary=
518
+ io = IndirectObject.new(1,0)
519
+ appearance = { 'N' => io.reference_object }
520
+ @annot.appearance_dictionary = appearance
521
+ assert_equal("<<\n/N 1 0 R \n>>\n", @annot.dictionary['AP'].to_s)
522
+ end
523
+
524
+ def test_appearance_state=
525
+ @annot.appearance_state = 'Yes'
526
+ assert_equal(PdfName.new('Yes'), @annot.dictionary['AS'])
527
+ end
528
+ end
529
+
530
+ class PdfTextAnnotTestCases < Test::Unit::TestCase
531
+ def setup
532
+ @rect = Rectangle.new(1,2,3,4)
533
+ @annot = PdfTextAnnot.new(1, 0, @rect, 'Hello')
534
+ end
535
+
536
+ def test_initialize
537
+ assert_equal(PdfName.new('Text'), @annot.dictionary['Subtype'])
538
+ assert_equal(PdfString.new('Hello'), @annot.dictionary['Contents'])
539
+ end
540
+
541
+ def test_open=
542
+ @annot.open = true
543
+ assert_equal(PdfBoolean.new(true), @annot.dictionary['Open'])
544
+ @annot.open = false
545
+ assert_equal(PdfBoolean.new(false), @annot.dictionary['Open'])
546
+ end
547
+ end
548
+
549
+ #class PdfLinkAnnotTestCases < Test::Unit::TestCase
550
+ #end
551
+
552
+ #class PdfMovieAnnotTestCases < Test::Unit::TestCase
553
+ #end
554
+
555
+ class PdfSoundAnnotTestCases < Test::Unit::TestCase
556
+ def test_initialize
557
+ rect = Rectangle.new(1,2,3,4)
558
+ stream = PdfStream.new(1, 0, 'test')
559
+ sound = PdfSoundAnnot.new(2, 0, rect, stream)
560
+ assert_equal(PdfName.new('Sound'), sound.dictionary['Subtype'])
561
+ assert_equal(stream, sound.dictionary['Sound'])
562
+ end
563
+ end
564
+
565
+ #class PdfURIActionTestCases < Test::Unit::TestCase
566
+ #end
567
+
568
+ #class PdfAnnotBorderTestCases < Test::Unit::TestCase
569
+ #end
570
+
571
+ class PdfResourcesTestCases < Test::Unit::TestCase
572
+ def setup
573
+ @res = PdfResources.new(1,0)
574
+ end
575
+
576
+ def test_proc_set=
577
+ a = PdfName.ary ['PDF','Text','ImageB','ImageC']
578
+ @res.proc_set = a
579
+ assert_equal(a, @res.dictionary['ProcSet'])
580
+ end
581
+
582
+ def test_fonts
583
+ io = IndirectObject.new(2,0)
584
+ @res.fonts['F1'] = io.reference_object
585
+ assert_equal("1 0 obj\n<<\n/Font <<\n/F1 2 0 R \n>>\n\n>>\nendobj\n", @res.to_s)
586
+ end
587
+
588
+ def test_x_objects
589
+ io = IndirectObject.new(2,0)
590
+ @res.x_objects['Im1'] = io.reference_object
591
+ assert_equal("1 0 obj\n<<\n/XObject <<\n/Im1 2 0 R \n>>\n\n>>\nendobj\n", @res.to_s)
592
+ end
593
+ end
594
+
595
+ class PdfPageBaseTestCases < Test::Unit::TestCase
596
+ def setup
597
+ @io = IndirectObject.new(1, 0)
598
+ @base = PdfPageBase.new(2, 0, @io)
599
+ end
600
+
601
+ def test_initialize
602
+ assert_equal('1 0 R ', @base.dictionary['Parent'].to_s)
603
+ end
604
+
605
+ def test_media_box=
606
+ r = Rectangle.new(1, 2, 3, 4)
607
+ @base.media_box = r
608
+ assert_equal('[1 2 3 4 ] ', @base.dictionary['MediaBox'].to_s)
609
+ end
610
+
611
+ def test_resources=
612
+ resources = PdfResources.new(3, 0)
613
+ @base.resources = resources
614
+ assert_equal('3 0 R ', @base.dictionary['Resources'].to_s)
615
+ end
616
+
617
+ def test_crop_box=
618
+ r = Rectangle.new(1, 2, 3, 4)
619
+ @base.crop_box = r
620
+ assert_equal('[1 2 3 4 ] ', @base.dictionary['CropBox'].to_s)
621
+ end
622
+
623
+ def test_rotate=
624
+ @base.rotate = 90
625
+ assert_equal(PdfInteger.new(90), @base.dictionary['Rotate'])
626
+ end
627
+
628
+ def test_duration=
629
+ @base.duration = 5
630
+ assert_equal('5 ', @base.dictionary['Dur'].to_s)
631
+ @base.duration = 6.5
632
+ assert_equal('6.5 ', @base.dictionary['Dur'].to_s)
633
+ end
634
+
635
+ def test_hidden=
636
+ @base.hidden = true
637
+ assert_equal('true ', @base.dictionary['Hid'].to_s)
638
+ end
639
+
640
+ def test_transition=
641
+ t = {
642
+ 'Type' => PdfName.new('Trans'),
643
+ 'D' => PdfReal.new(3.5),
644
+ 'S' => PdfName.new('Split'),
645
+ 'Dm' => PdfName.new('V'),
646
+ 'M' => PdfName.new('O')
647
+ }
648
+ @base.transition = t
649
+ assert_equal("<<\n/D 3.5 \n/Dm /V \n/M /O \n/S /Split \n/Type /Trans \n>>\n", @base.dictionary['Trans'].to_s)
650
+ end
651
+
652
+ def test_additional_actions=
653
+ aa = { 'Foo' => PdfName.new('Bar') }
654
+ @base.additional_actions = aa
655
+ assert_equal("<<\n/Foo /Bar \n>>\n", @base.dictionary['AA'].to_s)
656
+ end
657
+ end
658
+
659
+ class PdfPageTestCases < Test::Unit::TestCase
660
+ def setup
661
+ pages = PdfPages.new(1, 0)
662
+ @page = PdfPage.new(2, 0, pages)
663
+ @stream = PdfStream.new(3, 0, 'test')
664
+ @page.contents << @stream
665
+ end
666
+
667
+ def test_initialize
668
+ assert_equal(PdfName.new('Page'), @page.dictionary['Type'])
669
+ end
670
+
671
+ def test_body
672
+ assert_equal("<<\n/Contents 3 0 R \n/Parent 1 0 R \n/Type /Page \n>>\n", @page.body)
673
+ end
674
+
675
+ def test_contents
676
+ @page.body # Cause dictionary to be updated.
677
+ assert_equal(@stream.reference_object, @page.dictionary['Contents'])
678
+
679
+ @page.contents << @stream
680
+ @page.body
681
+ assert_equal(PdfArray.new([@stream.reference_object, @stream.reference_object]), @page.dictionary['Contents'])
682
+ end
683
+
684
+ # xxx these methods to be implemented if necessary
685
+ def test_thumb=
686
+ @page.thumb = @stream
687
+ assert_equal(@stream.reference_object, @page.dictionary['Thumb'])
688
+ end
689
+
690
+ def test_annots=
691
+ rect = Rectangle.new(1,2,3,4)
692
+ annot = PdfTextAnnot.new(4, 0, rect, 'Hello')
693
+ @page.annots = [annot]
694
+ annots = PdfArray.new([annot.reference_object])
695
+ assert_equal(annots, @page.dictionary['Annots'])
696
+ end
697
+
698
+ def test_beads=
699
+ b1 = IndirectObject.new(4, 0)
700
+ b2 = IndirectObject.new(5, 0)
701
+ @page.beads = [b1, b2]
702
+ assert_equal(PdfArray.new([b1.reference_object, b2.reference_object]), @page.dictionary['B'])
703
+ end
704
+ end
705
+
706
+ class PdfPagesTestCases < Test::Unit::TestCase
707
+ def setup
708
+ @pages = PdfPages.new(1, 0)
709
+ @page = PdfPage.new(2, 0, @pages)
710
+ end
711
+
712
+ def test_initialize
713
+ assert_equal(PdfName.new('Pages'), @pages.dictionary['Type'])
714
+ assert_equal([], @pages.kids)
715
+ end
716
+
717
+ def test_to_s
718
+ @pages.kids << @page
719
+ assert_equal("1 0 obj\n<<\n/Count 1 \n/Kids [2 0 R ] \n/Type /Pages \n>>\nendobj\n", @pages.to_s)
720
+ end
721
+ end
722
+
723
+ class PdfOutlinesTestCases < Test::Unit::TestCase
724
+ def setup
725
+ @outlines = PdfOutlines.new(1, 0)
726
+ end
727
+
728
+ def test_initialize
729
+ assert_equal(PdfName.new('Outlines'), @outlines.dictionary['Type'])
730
+ end
731
+
732
+ def test_to_s
733
+ assert_equal("1 0 obj\n<<\n/Count 0 \n/Type /Outlines \n>>\nendobj\n", @outlines.to_s)
734
+ end
735
+ end
736
+
737
+ class PdfFileTestCases < Test::Unit::TestCase
738
+ def setup
739
+ @file = PdfFile.new
740
+ end
741
+
742
+ def test_initialize
743
+ assert_not_nil(@file.body)
744
+ assert_not_nil(@file.trailer)
745
+ end
746
+
747
+ def test_header
748
+ assert_equal("%PDF-1.3\n", @file.header.to_s)
749
+ end
750
+
751
+ def test_body
752
+ assert_equal("", @file.body.to_s)
753
+ end
754
+
755
+ def test_trailer
756
+ assert_equal("trailer\n<<\n>>\nstartxref\n\n%%EOF\n", @file.trailer.to_s)
757
+ end
758
+
759
+ def test_to_s
760
+ assert_equal("%PDF-1.3\nxref\n0 1\n0000000000 65535 f\ntrailer\n<<\n/Size 1 \n>>\nstartxref\n9\n%%EOF\n", @file.to_s)
761
+ end
762
+ end