prawn-layout 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. data/Rakefile +1 -1
  2. data/examples/example_helper.rb +5 -1
  3. data/examples/grid/bounding_boxes.rb +21 -0
  4. data/examples/grid/column_gutter_grid.rb +20 -0
  5. data/examples/grid/multi_boxes.rb +51 -0
  6. data/examples/grid/show_grid.rb +13 -0
  7. data/lib/prawn/layout.rb +1 -1
  8. data/lib/prawn/layout/grid.rb +36 -18
  9. data/lib/prawn/table.rb +20 -8
  10. data/lib/prawn/table/cell.rb +24 -15
  11. data/spec/spec_helper.rb +2 -1
  12. data/spec/table_spec.rb +32 -0
  13. data/vendor/prawn-core/COPYING +340 -0
  14. data/vendor/prawn-core/HACKING +46 -0
  15. data/vendor/prawn-core/LICENSE +56 -0
  16. data/vendor/prawn-core/README +142 -0
  17. data/vendor/prawn-core/Rakefile +75 -0
  18. data/vendor/prawn-core/bench/afm_text_bench.rb +18 -0
  19. data/vendor/prawn-core/bench/png_type_6.rb +15 -0
  20. data/vendor/prawn-core/bench/ttf_text_bench.rb +19 -0
  21. data/vendor/prawn-core/bugs/canvas_sets_y_to_0.rb +15 -0
  22. data/vendor/prawn-core/bugs/png_barcode_issue.rb +11 -0
  23. data/vendor/prawn-core/bugs/resolved/canvas_sets_y_to_0.rb +15 -0
  24. data/vendor/prawn-core/data/encodings/win_ansi.txt +29 -0
  25. data/vendor/prawn-core/data/fonts/Action Man.dfont +0 -0
  26. data/vendor/prawn-core/data/fonts/Activa.ttf +0 -0
  27. data/vendor/prawn-core/data/fonts/Chalkboard.ttf +0 -0
  28. data/vendor/prawn-core/data/fonts/Courier-Bold.afm +342 -0
  29. data/vendor/prawn-core/data/fonts/Courier-BoldOblique.afm +342 -0
  30. data/vendor/prawn-core/data/fonts/Courier-Oblique.afm +342 -0
  31. data/vendor/prawn-core/data/fonts/Courier.afm +342 -0
  32. data/vendor/prawn-core/data/fonts/DejaVuSans.ttf +0 -0
  33. data/vendor/prawn-core/data/fonts/Dustismo_Roman.ttf +0 -0
  34. data/vendor/prawn-core/data/fonts/Helvetica-Bold.afm +2827 -0
  35. data/vendor/prawn-core/data/fonts/Helvetica-BoldOblique.afm +2827 -0
  36. data/vendor/prawn-core/data/fonts/Helvetica-Oblique.afm +3051 -0
  37. data/vendor/prawn-core/data/fonts/Helvetica.afm +3051 -0
  38. data/vendor/prawn-core/data/fonts/MustRead.html +19 -0
  39. data/vendor/prawn-core/data/fonts/Symbol.afm +213 -0
  40. data/vendor/prawn-core/data/fonts/Times-Bold.afm +2588 -0
  41. data/vendor/prawn-core/data/fonts/Times-BoldItalic.afm +2384 -0
  42. data/vendor/prawn-core/data/fonts/Times-Italic.afm +2667 -0
  43. data/vendor/prawn-core/data/fonts/Times-Roman.afm +2419 -0
  44. data/vendor/prawn-core/data/fonts/ZapfDingbats.afm +225 -0
  45. data/vendor/prawn-core/data/fonts/comicsans.ttf +0 -0
  46. data/vendor/prawn-core/data/fonts/gkai00mp.ttf +0 -0
  47. data/vendor/prawn-core/data/images/16bit.alpha +0 -0
  48. data/vendor/prawn-core/data/images/16bit.dat +0 -0
  49. data/vendor/prawn-core/data/images/16bit.png +0 -0
  50. data/vendor/prawn-core/data/images/arrow.png +0 -0
  51. data/vendor/prawn-core/data/images/arrow2.png +0 -0
  52. data/vendor/prawn-core/data/images/barcode_issue.png +0 -0
  53. data/vendor/prawn-core/data/images/dice.alpha +0 -0
  54. data/vendor/prawn-core/data/images/dice.dat +0 -0
  55. data/vendor/prawn-core/data/images/dice.png +0 -0
  56. data/vendor/prawn-core/data/images/dice_interlaced.png +0 -0
  57. data/vendor/prawn-core/data/images/fractal.jpg +0 -0
  58. data/vendor/prawn-core/data/images/letterhead.jpg +0 -0
  59. data/vendor/prawn-core/data/images/page_white_text.alpha +0 -0
  60. data/vendor/prawn-core/data/images/page_white_text.dat +0 -0
  61. data/vendor/prawn-core/data/images/page_white_text.png +0 -0
  62. data/vendor/prawn-core/data/images/pigs.jpg +0 -0
  63. data/vendor/prawn-core/data/images/rails.dat +0 -0
  64. data/vendor/prawn-core/data/images/rails.png +0 -0
  65. data/vendor/prawn-core/data/images/ruport.png +0 -0
  66. data/vendor/prawn-core/data/images/ruport_data.dat +0 -0
  67. data/vendor/prawn-core/data/images/ruport_transparent.png +0 -0
  68. data/vendor/prawn-core/data/images/ruport_type0.png +0 -0
  69. data/vendor/prawn-core/data/images/stef.jpg +0 -0
  70. data/vendor/prawn-core/data/images/tru256.bmp +0 -0
  71. data/vendor/prawn-core/data/images/web-links.dat +1 -0
  72. data/vendor/prawn-core/data/images/web-links.png +0 -0
  73. data/vendor/prawn-core/data/shift_jis_text.txt +1 -0
  74. data/vendor/prawn-core/examples/bounding_box/bounding_boxes.rb +43 -0
  75. data/vendor/prawn-core/examples/bounding_box/indentation.rb +34 -0
  76. data/vendor/prawn-core/examples/bounding_box/russian_boxes.rb +36 -0
  77. data/vendor/prawn-core/examples/bounding_box/stretched_nesting.rb +67 -0
  78. data/vendor/prawn-core/examples/column_box/column_box_example.rb +43 -0
  79. data/vendor/prawn-core/examples/example_helper.rb +3 -0
  80. data/vendor/prawn-core/examples/general/background.rb +23 -0
  81. data/vendor/prawn-core/examples/general/canvas.rb +15 -0
  82. data/vendor/prawn-core/examples/general/margin.rb +36 -0
  83. data/vendor/prawn-core/examples/general/measurement_units.rb +51 -0
  84. data/vendor/prawn-core/examples/general/metadata-info.rb +16 -0
  85. data/vendor/prawn-core/examples/general/multi_page_layout.rb +18 -0
  86. data/vendor/prawn-core/examples/general/page_geometry.rb +31 -0
  87. data/vendor/prawn-core/examples/general/page_numbering.rb +15 -0
  88. data/vendor/prawn-core/examples/general/stamp.rb +45 -0
  89. data/vendor/prawn-core/examples/graphics/basic_images.rb +23 -0
  90. data/vendor/prawn-core/examples/graphics/cmyk.rb +12 -0
  91. data/vendor/prawn-core/examples/graphics/curves.rb +11 -0
  92. data/vendor/prawn-core/examples/graphics/hexagon.rb +13 -0
  93. data/vendor/prawn-core/examples/graphics/image_fit.rb +15 -0
  94. data/vendor/prawn-core/examples/graphics/image_flow.rb +37 -0
  95. data/vendor/prawn-core/examples/graphics/image_position.rb +17 -0
  96. data/vendor/prawn-core/examples/graphics/line.rb +32 -0
  97. data/vendor/prawn-core/examples/graphics/png_types.rb +22 -0
  98. data/vendor/prawn-core/examples/graphics/polygons.rb +16 -0
  99. data/vendor/prawn-core/examples/graphics/remote_images.rb +12 -0
  100. data/vendor/prawn-core/examples/graphics/ruport_style_helpers.rb +19 -0
  101. data/vendor/prawn-core/examples/graphics/stroke_bounds.rb +20 -0
  102. data/vendor/prawn-core/examples/graphics/stroke_cap_and_join.rb +45 -0
  103. data/vendor/prawn-core/examples/graphics/stroke_dash.rb +42 -0
  104. data/vendor/prawn-core/examples/graphics/transparency.rb +26 -0
  105. data/vendor/prawn-core/examples/m17n/chinese_text_wrapping.rb +19 -0
  106. data/vendor/prawn-core/examples/m17n/euro.rb +15 -0
  107. data/vendor/prawn-core/examples/m17n/sjis.rb +28 -0
  108. data/vendor/prawn-core/examples/m17n/utf8.rb +13 -0
  109. data/vendor/prawn-core/examples/m17n/win_ansi_charset.rb +54 -0
  110. data/vendor/prawn-core/examples/text/alignment.rb +18 -0
  111. data/vendor/prawn-core/examples/text/dfont.rb +48 -0
  112. data/vendor/prawn-core/examples/text/family_based_styling.rb +24 -0
  113. data/vendor/prawn-core/examples/text/font_calculations.rb +91 -0
  114. data/vendor/prawn-core/examples/text/font_size.rb +33 -0
  115. data/vendor/prawn-core/examples/text/kerning.rb +30 -0
  116. data/vendor/prawn-core/examples/text/simple_text.rb +17 -0
  117. data/vendor/prawn-core/examples/text/simple_text_ttf.rb +17 -0
  118. data/vendor/prawn-core/examples/text/span.rb +29 -0
  119. data/vendor/prawn-core/examples/text/text_box.rb +25 -0
  120. data/vendor/prawn-core/examples/text/text_box_returning_excess.rb +51 -0
  121. data/vendor/prawn-core/examples/text/text_flow.rb +67 -0
  122. data/vendor/prawn-core/lib/prawn/byte_string.rb +7 -0
  123. data/vendor/prawn-core/lib/prawn/compatibility.rb +38 -0
  124. data/vendor/prawn-core/lib/prawn/core.rb +85 -0
  125. data/vendor/prawn-core/lib/prawn/document.rb +534 -0
  126. data/vendor/prawn-core/lib/prawn/document/annotations.rb +65 -0
  127. data/vendor/prawn-core/lib/prawn/document/bounding_box.rb +390 -0
  128. data/vendor/prawn-core/lib/prawn/document/column_box.rb +102 -0
  129. data/vendor/prawn-core/lib/prawn/document/destinations.rb +92 -0
  130. data/vendor/prawn-core/lib/prawn/document/internals.rb +180 -0
  131. data/vendor/prawn-core/lib/prawn/document/page_geometry.rb +153 -0
  132. data/vendor/prawn-core/lib/prawn/document/snapshot.rb +71 -0
  133. data/vendor/prawn-core/lib/prawn/document/span.rb +55 -0
  134. data/vendor/prawn-core/lib/prawn/document/text.rb +184 -0
  135. data/vendor/prawn-core/lib/prawn/document/text/box.rb +90 -0
  136. data/vendor/prawn-core/lib/prawn/document/text/wrapping.rb +62 -0
  137. data/vendor/prawn-core/lib/prawn/encoding.rb +121 -0
  138. data/vendor/prawn-core/lib/prawn/errors.rb +61 -0
  139. data/vendor/prawn-core/lib/prawn/font.rb +297 -0
  140. data/vendor/prawn-core/lib/prawn/font/afm.rb +202 -0
  141. data/vendor/prawn-core/lib/prawn/font/dfont.rb +34 -0
  142. data/vendor/prawn-core/lib/prawn/font/ttf.rb +329 -0
  143. data/vendor/prawn-core/lib/prawn/graphics.rb +264 -0
  144. data/vendor/prawn-core/lib/prawn/graphics/cap_style.rb +35 -0
  145. data/vendor/prawn-core/lib/prawn/graphics/color.rb +141 -0
  146. data/vendor/prawn-core/lib/prawn/graphics/dash.rb +69 -0
  147. data/vendor/prawn-core/lib/prawn/graphics/join_style.rb +35 -0
  148. data/vendor/prawn-core/lib/prawn/graphics/transparency.rb +56 -0
  149. data/vendor/prawn-core/lib/prawn/images.rb +339 -0
  150. data/vendor/prawn-core/lib/prawn/images/jpg.rb +46 -0
  151. data/vendor/prawn-core/lib/prawn/images/png.rb +219 -0
  152. data/vendor/prawn-core/lib/prawn/literal_string.rb +14 -0
  153. data/vendor/prawn-core/lib/prawn/measurement_extensions.rb +46 -0
  154. data/vendor/prawn-core/lib/prawn/measurements.rb +71 -0
  155. data/vendor/prawn-core/lib/prawn/name_tree.rb +166 -0
  156. data/vendor/prawn-core/lib/prawn/object_store.rb +63 -0
  157. data/vendor/prawn-core/lib/prawn/pdf_object.rb +81 -0
  158. data/vendor/prawn-core/lib/prawn/reference.rb +72 -0
  159. data/vendor/prawn-core/lib/prawn/stamp.rb +87 -0
  160. data/vendor/prawn-core/meta/Rakefile +62 -0
  161. data/vendor/prawn-core/meta/lib/prawn.rb +2 -0
  162. data/vendor/prawn-core/reference_pdfs/alignment.pdf +229 -0
  163. data/vendor/prawn-core/reference_pdfs/background.pdf +0 -0
  164. data/vendor/prawn-core/reference_pdfs/basic_images.pdf +0 -0
  165. data/vendor/prawn-core/reference_pdfs/bounding_boxes.pdf +128 -0
  166. data/vendor/prawn-core/reference_pdfs/canvas.pdf +78 -0
  167. data/vendor/prawn-core/reference_pdfs/chinese_flow.pdf +0 -0
  168. data/vendor/prawn-core/reference_pdfs/cmyk.pdf +0 -0
  169. data/vendor/prawn-core/reference_pdfs/column_box.pdf +3671 -0
  170. data/vendor/prawn-core/reference_pdfs/curves.pdf +62 -0
  171. data/vendor/prawn-core/reference_pdfs/dfont.pdf +0 -0
  172. data/vendor/prawn-core/reference_pdfs/euro.pdf +75 -0
  173. data/vendor/prawn-core/reference_pdfs/family_style.pdf +286 -0
  174. data/vendor/prawn-core/reference_pdfs/flow.pdf +964 -0
  175. data/vendor/prawn-core/reference_pdfs/font_calculations.pdf +0 -0
  176. data/vendor/prawn-core/reference_pdfs/font_size.pdf +142 -0
  177. data/vendor/prawn-core/reference_pdfs/hexagon.pdf +61 -0
  178. data/vendor/prawn-core/reference_pdfs/image-flow.pdf +0 -0
  179. data/vendor/prawn-core/reference_pdfs/image_fit.pdf +0 -0
  180. data/vendor/prawn-core/reference_pdfs/image_position.pdf +0 -0
  181. data/vendor/prawn-core/reference_pdfs/indentation.pdf +124 -0
  182. data/vendor/prawn-core/reference_pdfs/kerning.pdf +0 -0
  183. data/vendor/prawn-core/reference_pdfs/landscape_a4.pdf +52 -0
  184. data/vendor/prawn-core/reference_pdfs/landscape_legal.pdf +52 -0
  185. data/vendor/prawn-core/reference_pdfs/landscape_letter.pdf +52 -0
  186. data/vendor/prawn-core/reference_pdfs/lines.pdf +116 -0
  187. data/vendor/prawn-core/reference_pdfs/margin.pdf +3850 -0
  188. data/vendor/prawn-core/reference_pdfs/measurement_units.pdf +4667 -0
  189. data/vendor/prawn-core/reference_pdfs/metadata-info.pdf +88 -0
  190. data/vendor/prawn-core/reference_pdfs/multi-layout.pdf +209 -0
  191. data/vendor/prawn-core/reference_pdfs/page_with_numbering.pdf +156 -0
  192. data/vendor/prawn-core/reference_pdfs/png_types.pdf +0 -0
  193. data/vendor/prawn-core/reference_pdfs/portrait_a4.pdf +52 -0
  194. data/vendor/prawn-core/reference_pdfs/portrait_legal.pdf +52 -0
  195. data/vendor/prawn-core/reference_pdfs/portrait_letter.pdf +52 -0
  196. data/vendor/prawn-core/reference_pdfs/pretty_polygons.pdf +122 -0
  197. data/vendor/prawn-core/reference_pdfs/remote_images.pdf +0 -0
  198. data/vendor/prawn-core/reference_pdfs/ruport.pdf +101 -0
  199. data/vendor/prawn-core/reference_pdfs/russian_boxes.pdf +2780 -0
  200. data/vendor/prawn-core/reference_pdfs/simple_text.pdf +136 -0
  201. data/vendor/prawn-core/reference_pdfs/simple_text_ttf.pdf +0 -0
  202. data/vendor/prawn-core/reference_pdfs/sjis.pdf +0 -0
  203. data/vendor/prawn-core/reference_pdfs/span.pdf +1975 -0
  204. data/vendor/prawn-core/reference_pdfs/stamp.pdf +696 -0
  205. data/vendor/prawn-core/reference_pdfs/stretched_nesting.pdf +200 -0
  206. data/vendor/prawn-core/reference_pdfs/stroke_bounds.pdf +135 -0
  207. data/vendor/prawn-core/reference_pdfs/stroke_cap_and_join.pdf +80 -0
  208. data/vendor/prawn-core/reference_pdfs/stroke_dash.pdf +457 -0
  209. data/vendor/prawn-core/reference_pdfs/text_box.pdf +315 -0
  210. data/vendor/prawn-core/reference_pdfs/text_box_returning_excess.pdf +271 -0
  211. data/vendor/prawn-core/reference_pdfs/transparency.pdf +347 -0
  212. data/vendor/prawn-core/reference_pdfs/utf8.pdf +0 -0
  213. data/vendor/prawn-core/reference_pdfs/win-ansi.pdf +6172 -0
  214. data/vendor/prawn-core/spec/annotations_spec.rb +90 -0
  215. data/vendor/prawn-core/spec/bounding_box_spec.rb +185 -0
  216. data/vendor/prawn-core/spec/destinations_spec.rb +15 -0
  217. data/vendor/prawn-core/spec/document_spec.rb +231 -0
  218. data/vendor/prawn-core/spec/font_spec.rb +273 -0
  219. data/vendor/prawn-core/spec/graphics_spec.rb +209 -0
  220. data/vendor/prawn-core/spec/images_spec.rb +79 -0
  221. data/vendor/prawn-core/spec/jpg_spec.rb +25 -0
  222. data/vendor/prawn-core/spec/measurement_units_spec.rb +23 -0
  223. data/vendor/prawn-core/spec/name_tree_spec.rb +112 -0
  224. data/vendor/prawn-core/spec/object_store_spec.rb +42 -0
  225. data/vendor/prawn-core/spec/pdf_object_spec.rb +122 -0
  226. data/vendor/prawn-core/spec/png_spec.rb +236 -0
  227. data/vendor/prawn-core/spec/reference_spec.rb +82 -0
  228. data/vendor/prawn-core/spec/snapshot_spec.rb +115 -0
  229. data/vendor/prawn-core/spec/span_spec.rb +45 -0
  230. data/vendor/prawn-core/spec/spec_helper.rb +20 -0
  231. data/vendor/prawn-core/spec/stamp_spec.rb +98 -0
  232. data/vendor/prawn-core/spec/stroke_styles_spec.rb +152 -0
  233. data/vendor/prawn-core/spec/text_box_spec.rb +109 -0
  234. data/vendor/prawn-core/spec/text_spec.rb +185 -0
  235. data/vendor/prawn-core/spec/transparency_spec.rb +61 -0
  236. data/vendor/prawn-core/vendor/pdf-inspector/README +18 -0
  237. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector.rb +26 -0
  238. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/extgstate.rb +18 -0
  239. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/graphics.rb +119 -0
  240. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/page.rb +25 -0
  241. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/text.rb +31 -0
  242. data/vendor/prawn-core/vendor/pdf-inspector/lib/pdf/inspector/xobject.rb +19 -0
  243. data/vendor/prawn-core/vendor/ttfunk/data/fonts/DejaVuSans.ttf +0 -0
  244. data/vendor/prawn-core/vendor/ttfunk/data/fonts/comicsans.ttf +0 -0
  245. data/vendor/prawn-core/vendor/ttfunk/example.rb +45 -0
  246. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk.rb +102 -0
  247. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/directory.rb +17 -0
  248. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/encoding/mac_roman.rb +88 -0
  249. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/encoding/windows_1252.rb +69 -0
  250. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/reader.rb +44 -0
  251. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/resource_file.rb +78 -0
  252. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset.rb +18 -0
  253. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/base.rb +141 -0
  254. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/mac_roman.rb +46 -0
  255. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/unicode.rb +48 -0
  256. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/unicode_8bit.rb +63 -0
  257. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset/windows_1252.rb +51 -0
  258. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/subset_collection.rb +72 -0
  259. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table.rb +46 -0
  260. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap.rb +34 -0
  261. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/format00.rb +54 -0
  262. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/format04.rb +126 -0
  263. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/cmap/subtable.rb +79 -0
  264. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf.rb +64 -0
  265. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf/compound.rb +81 -0
  266. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/glyf/simple.rb +37 -0
  267. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/head.rb +44 -0
  268. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/hhea.rb +41 -0
  269. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/hmtx.rb +47 -0
  270. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/kern.rb +79 -0
  271. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/kern/format0.rb +62 -0
  272. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/loca.rb +43 -0
  273. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/maxp.rb +40 -0
  274. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/name.rb +119 -0
  275. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/os2.rb +78 -0
  276. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post.rb +91 -0
  277. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format10.rb +43 -0
  278. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format20.rb +35 -0
  279. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format25.rb +23 -0
  280. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format30.rb +17 -0
  281. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/post/format40.rb +17 -0
  282. data/vendor/prawn-core/vendor/ttfunk/lib/ttfunk/table/simple.rb +14 -0
  283. data/vendor/prawn-core/www/index.html +196 -0
  284. data/vendor/prawn-core/www/media/bounding_boxes.pdf +146 -0
  285. data/vendor/prawn-core/www/media/bounding_boxes.png +0 -0
  286. data/vendor/prawn-core/www/media/bounding_boxes_out.png +0 -0
  287. data/vendor/prawn-core/www/media/fancy_table.pdf +350 -0
  288. data/vendor/prawn-core/www/media/image.pdf +0 -0
  289. data/vendor/prawn-core/www/media/images.png +0 -0
  290. data/vendor/prawn-core/www/media/prawn_logo.png +0 -0
  291. data/vendor/prawn-core/www/media/tables.png +0 -0
  292. data/vendor/prawn-core/www/media/utf8.pdf +0 -0
  293. data/vendor/prawn-core/www/media/utf8.png +0 -0
  294. data/vendor/prawn-core/www/prawn-Chinese.html +113 -0
  295. data/vendor/prawn-core/www/prawn.css +86 -0
  296. data/vendor/prawn-core/www/twilight.css +266 -0
  297. metadata +291 -3
@@ -0,0 +1,534 @@
1
+ # encoding: utf-8
2
+
3
+ # document.rb : Implements PDF document generation for Prawn
4
+ #
5
+ # Copyright April 2008, Gregory Brown. All Rights Reserved.
6
+ #
7
+ # This is free software. Please see the LICENSE and COPYING files for details.
8
+
9
+ require "stringio"
10
+ require "prawn/document/page_geometry"
11
+ require "prawn/document/bounding_box"
12
+ require "prawn/document/column_box"
13
+ require "prawn/document/internals"
14
+ require "prawn/document/span"
15
+ require "prawn/document/text"
16
+ require "prawn/document/annotations"
17
+ require "prawn/document/destinations"
18
+ require "prawn/document/snapshot"
19
+
20
+ module Prawn
21
+
22
+ # The Prawn::Document class is how you start creating a PDF document.
23
+ #
24
+ # There are three basic ways you can instantiate PDF Documents in Prawn, they
25
+ # are through assignment, implicit block or explicit block. Below is an exmple
26
+ # of each type, each example does exactly the same thing, makes a PDF document
27
+ # with all the defaults and puts in the default font "Hello There" and then
28
+ # saves it to the current directory as "example.pdf"
29
+ #
30
+ # For example, assignment can be like this:
31
+ #
32
+ # pdf = Prawn::Document.new
33
+ # pdf.text "Hello There"
34
+ # pdf.render_file "example.pdf"
35
+ #
36
+ # Or you can do an implied block form:
37
+ #
38
+ # Prawn::Document.generate "example.pdf" do
39
+ # text "Hello There"
40
+ # end
41
+ #
42
+ # Or if you need to access a variable outside the scope of the block, the
43
+ # explicit block form:
44
+ #
45
+ # words = "Hello There"
46
+ # Prawn::Document.generate "example.pdf" do |pdf|
47
+ # pdf.text words
48
+ # end
49
+ #
50
+ # Usually, the block forms are used when you are simply creating a PDF document
51
+ # that you want to immediately save or render out.
52
+ #
53
+ # See the new and generate methods for further details on the above.
54
+ #
55
+ class Document
56
+
57
+ include Text
58
+ include PageGeometry
59
+ include Internals
60
+ include Annotations
61
+ include Destinations
62
+ include Snapshot
63
+ include Prawn::Graphics
64
+ include Prawn::Images
65
+ include Prawn::Stamp
66
+
67
+ attr_accessor :margin_box
68
+ attr_reader :margins, :page_size, :page_layout, :y
69
+ attr_writer :font_size
70
+
71
+
72
+ def self.extensions
73
+ @extensions ||= []
74
+ end
75
+
76
+ # Creates and renders a PDF document.
77
+ #
78
+ # When using the implicit block form, Prawn will evaluate the block
79
+ # within an instance of Prawn::Document, simplifying your syntax.
80
+ # However, please note that you will not be able to reference variables
81
+ # from the enclosing scope within this block.
82
+ #
83
+ # # Using implicit block form and rendering to a file
84
+ # Prawn::Document.generate "example.pdf" do
85
+ # # self here is set to the newly instantiated Prawn::Document
86
+ # # and so any variables in the outside scope are unavailable
87
+ # font "Times-Roman"
88
+ # text "Hello World", :at => [200,720], :size => 32
89
+ # end
90
+ #
91
+ # If you need to access your local and instance variables, use the explicit
92
+ # block form shown below. In this case, Prawn yields an instance of
93
+ # PDF::Document and the block is an ordinary closure:
94
+ #
95
+ # # Using explicit block form and rendering to a file
96
+ # content = "Hello World"
97
+ # Prawn::Document.generate "example.pdf" do |pdf|
98
+ # # self here is left alone
99
+ # pdf.font "Times-Roman"
100
+ # pdf.text content, :at => [200,720], :size => 32
101
+ # end
102
+ #
103
+ def self.generate(filename,options={},&block)
104
+ pdf = new(options,&block)
105
+ pdf.render_file(filename)
106
+ end
107
+
108
+ # Creates a new PDF Document. The following options are available (with
109
+ # the default values marked in [])
110
+ #
111
+ # <tt>:page_size</tt>:: One of the Document::PageGeometry sizes [LETTER]
112
+ # <tt>:page_layout</tt>:: Either <tt>:portrait</tt> or <tt>:landscape</tt>
113
+ # <tt>:margin</tt>:: Sets the margin on all sides in points [0.5 inch]
114
+ # <tt>:left_margin</tt>:: Sets the left margin in points [0.5 inch]
115
+ # <tt>:right_margin</tt>:: Sets the right margin in points [0.5 inch]
116
+ # <tt>:top_margin</tt>:: Sets the top margin in points [0.5 inch]
117
+ # <tt>:bottom_margin</tt>:: Sets the bottom margin in points [0.5 inch]
118
+ # <tt>:skip_page_creation</tt>:: Creates a document without starting the first page [false]
119
+ # <tt>:compress</tt>:: Compresses content streams before rendering them [false]
120
+ # <tt>:background</tt>:: An image path to be used as background on all pages [nil]
121
+ # <tt>:info</tt>:: Generic hash allowing for custom metadata properties [nil]
122
+ # <tt>:text_options</tt>:: A set of default options to be handed to text(). Be careful with this.
123
+ #
124
+ # Setting e.g. the :margin to 100 points and the :left_margin to 50 will result in margins
125
+ # of 100 points on every side except for the left, where it will be 50.
126
+ #
127
+ # The :margin can also be an array much like CSS shorthand:
128
+ #
129
+ # # Top and bottom are 20, left and right are 100.
130
+ # :margin => [20, 100]
131
+ # # Top is 50, left and right are 100, bottom is 20.
132
+ # :margin => [50, 100, 20]
133
+ # # Top is 10, right is 20, bottom is 30, left is 40.
134
+ # :margin => [10, 20, 30, 40]
135
+ #
136
+ # Additionally, :page_size can be specified as a simple two value array giving
137
+ # the width and height of the document you need in PDF Points.
138
+ #
139
+ # Usage:
140
+ #
141
+ # # New document, US Letter paper, portrait orientation
142
+ # pdf = Prawn::Document.new
143
+ #
144
+ # # New document, A4 paper, landscaped
145
+ # pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape)
146
+ #
147
+ # # New document, Custom size
148
+ # pdf = Prawn::Document.new(:page_size => [200, 300])
149
+ #
150
+ # # New document, with background
151
+ # pdf = Prawn::Document.new(:background => "#{Prawn::BASEDIR}/data/images/pigs.jpg")
152
+ #
153
+ def initialize(options={},&block)
154
+ Prawn.verify_options [:page_size, :page_layout, :margin, :left_margin,
155
+ :right_margin, :top_margin, :bottom_margin, :skip_page_creation,
156
+ :compress, :skip_encoding, :text_options, :background, :info], options
157
+
158
+ self.class.extensions.reverse_each { |e| extend e }
159
+
160
+ options[:info] ||= {}
161
+ options[:info][:Creator] ||= "Prawn"
162
+ options[:info][:Producer] = "Prawn"
163
+
164
+ options[:info].keys.each do |key|
165
+ if options[:info][key].kind_of?(String)
166
+ options[:info][key] = Prawn::LiteralString.new(options[:info][key])
167
+ end
168
+ end
169
+
170
+ @version = 1.3
171
+ @store = ObjectStore.new(options[:info])
172
+ @trailer = {}
173
+
174
+ @page_size = options[:page_size] || "LETTER"
175
+ @page_layout = options[:page_layout] || :portrait
176
+ @compress = options[:compress] || false
177
+ @skip_encoding = options[:skip_encoding]
178
+ @background = options[:background]
179
+ @font_size = 12
180
+ @page_content = nil
181
+ @bounding_box = nil
182
+ @margin_box = nil
183
+
184
+ @text_options = options[:text_options] || {}
185
+
186
+ apply_margin_option(options) if options[:margin]
187
+
188
+ default_margin = 36 # 0.5 inch
189
+ @margins = { :left => options[:left_margin] || default_margin,
190
+ :right => options[:right_margin] || default_margin,
191
+ :top => options[:top_margin] || default_margin,
192
+ :bottom => options[:bottom_margin] || default_margin }
193
+
194
+ generate_margin_box
195
+
196
+ @bounding_box = @margin_box
197
+
198
+ start_new_page unless options[:skip_page_creation]
199
+
200
+ if block
201
+ block.arity < 1 ? instance_eval(&block) : block[self]
202
+ end
203
+ end
204
+
205
+ # Creates and advances to a new page in the document.
206
+ #
207
+ # Page size, margins, and layout can also be set when generating a
208
+ # new page. These values will become the new defaults for page creation
209
+ #
210
+ # pdf.start_new_page #=> Starts new page keeping current values
211
+ # pdf.start_new_page(:size => "LEGAL", :layout => :landscape)
212
+ # pdf.start_new_page(:left_margin => 50, :right_margin => 50)
213
+ # pdf.start_new_page(:margin => 100)
214
+ #
215
+ def start_new_page(options = {})
216
+ @page_size = options[:size] if options[:size]
217
+ @page_layout = options[:layout] if options[:layout]
218
+
219
+ apply_margin_option(options) if options[:margin]
220
+
221
+ [:left,:right,:top,:bottom].each do |side|
222
+ if margin = options[:"#{side}_margin"]
223
+ @margins[side] = margin
224
+ end
225
+ end
226
+
227
+ finish_page_content if @page_content
228
+ build_new_page_content
229
+
230
+ @store.pages.data[:Kids] << current_page
231
+ @store.pages.data[:Count] += 1
232
+
233
+ add_content "q"
234
+
235
+ @y = @bounding_box.absolute_top
236
+
237
+ image(@background, :at => [0,@y]) if @background
238
+ end
239
+
240
+ # Returns the number of pages in the document
241
+ #
242
+ # pdf = Prawn::Document.new
243
+ # pdf.page_count #=> 1
244
+ # 3.times { pdf.start_new_page }
245
+ # pdf.page_count #=> 4
246
+ #
247
+ def page_count
248
+ @store.pages.data[:Count]
249
+ end
250
+
251
+ def y=(new_y)
252
+ @y = new_y
253
+ bounds.update_height
254
+ end
255
+
256
+ # The current y drawing position relative to the innermost bounding box,
257
+ # or to the page margins at the top level.
258
+ #
259
+ def cursor
260
+ y - bounds.absolute_bottom
261
+ end
262
+
263
+
264
+ # Moves to the specified y position in relative terms to the bottom margin.
265
+ #
266
+ def move_cursor_to(new_y)
267
+ self.y = new_y + bounds.absolute_bottom
268
+ end
269
+
270
+ # Renders the PDF document to string, useful for example in a Rails
271
+ # application where you want to stream out the PDF to a web browser:
272
+ #
273
+ # def show
274
+ # pdf = Prawn::Document.new do
275
+ # text "Putting PDF generation code in a controller is _BAD_"
276
+ # end
277
+ # send(pdf.render, :filename => 'silly.pdf', :type => 'application/pdf', :disposition => 'inline)
278
+ # end
279
+ #
280
+ def render
281
+ output = StringIO.new
282
+ finish_page_content
283
+
284
+ render_header(output)
285
+ render_body(output)
286
+ render_xref(output)
287
+ render_trailer(output)
288
+ str = output.string
289
+ str.force_encoding("ASCII-8BIT") if str.respond_to?(:force_encoding)
290
+ str
291
+ end
292
+
293
+ # Renders the PDF document to file.
294
+ #
295
+ # pdf.render_file "foo.pdf"
296
+ #
297
+ def render_file(filename)
298
+ Kernel.const_defined?("Encoding") ? mode = "wb:ASCII-8BIT" : mode = "wb"
299
+ File.open(filename,mode) { |f| f << render }
300
+ end
301
+
302
+ # The bounds method returns the current bounding box you are currently in,
303
+ # which is by default the box represented by the margin box on the
304
+ # document itself. When called from within a created <tt>bounding_box</tt>
305
+ # block, the box defined by that call will be returned instead of the
306
+ # document margin box.
307
+ #
308
+ # Another important point about bounding boxes is that all x and y measurements
309
+ # within a bounding box code block are relative to the bottom left corner of the
310
+ # bounding box.
311
+ #
312
+ # For example:
313
+ #
314
+ # Prawn::Document.new do
315
+ # # In the default "margin box" of a Prawn document of 0.5in along each edge
316
+ #
317
+ # # Draw a border around the page (the manual way)
318
+ # stroke do
319
+ # line(bounds.bottom_left, bounds.bottom_right)
320
+ # line(bounds.bottom_right, bounds.top_right)
321
+ # line(bounds.top_right, bounds.top_left)
322
+ # line(bounds.top_left, bounds.bottom_left)
323
+ # end
324
+ #
325
+ # # Draw a border around the page (the easy way)
326
+ # stroke_bounds
327
+ # end
328
+ #
329
+ def bounds
330
+ @bounding_box
331
+ end
332
+
333
+ # Sets Document#bounds to the BoundingBox provided. See above for a brief
334
+ # description of what a bounding box is. This function is useful if you
335
+ # really need to change the bounding box manually, but usually, just entering
336
+ # and existing bounding box code blocks is good enough.
337
+ #
338
+ def bounds=(bounding_box)
339
+ @bounding_box = bounding_box
340
+ end
341
+
342
+ # Moves up the document by n points relative to the current position inside
343
+ # the current bounding box.
344
+ #
345
+ def move_up(n)
346
+ self.y += n
347
+ end
348
+
349
+ # Moves down the document by n points relative to the current position inside
350
+ # the current bounding box.
351
+ #
352
+ def move_down(n)
353
+ self.y -= n
354
+ end
355
+
356
+ # Moves down the document and then executes a block.
357
+ #
358
+ # pdf.text "some text"
359
+ # pdf.pad_top(100) do
360
+ # pdf.text "This is 100 points below the previous line of text"
361
+ # end
362
+ # pdf.text "This text appears right below the previous line of text"
363
+ #
364
+ def pad_top(y)
365
+ move_down(y)
366
+ yield
367
+ end
368
+
369
+ # Executes a block then moves down the document
370
+ #
371
+ # pdf.text "some text"
372
+ # pdf.pad_bottom(100) do
373
+ # pdf.text "This text appears right below the previous line of text"
374
+ # end
375
+ # pdf.text "This is 100 points below the previous line of text"
376
+ #
377
+ def pad_bottom(y)
378
+ yield
379
+ move_down(y)
380
+ end
381
+
382
+ # Moves down the document by y, executes a block, then moves down the
383
+ # document by y again.
384
+ #
385
+ # pdf.text "some text"
386
+ # pdf.pad(100) do
387
+ # pdf.text "This is 100 points below the previous line of text"
388
+ # end
389
+ # pdf.text "This is 100 points below the previous line of text"
390
+ #
391
+ def pad(y)
392
+ move_down(y)
393
+ yield
394
+ move_down(y)
395
+ end
396
+
397
+
398
+ # Indents the specified number of PDF points for the duration of the block
399
+ #
400
+ # pdf.text "some text"
401
+ # pdf.indent(20) do
402
+ # pdf.text "This is indented 20 points"
403
+ # end
404
+ # pdf.text "This starts 20 points left of the above line " +
405
+ # "and is flush with the first line"
406
+ #
407
+ def indent(x, &block)
408
+ bounds.indent(x, &block)
409
+ end
410
+
411
+
412
+ def mask(*fields) # :nodoc:
413
+ # Stores the current state of the named attributes, executes the block, and
414
+ # then restores the original values after the block has executed.
415
+ # -- I will remove the nodoc if/when this feature is a little less hacky
416
+ stored = {}
417
+ fields.each { |f| stored[f] = send(f) }
418
+ yield
419
+ fields.each { |f| send("#{f}=", stored[f]) }
420
+ end
421
+
422
+ # Raised if group() is called with a block that is too big to be
423
+ # rendered in the current context.
424
+ #
425
+ CannotGroup = Class.new(StandardError)
426
+
427
+ # Attempts to group the given block vertically within the current context.
428
+ # First attempts to render it in the current position on the current page.
429
+ # If that attempt overflows, it is tried anew after starting a new context
430
+ # (page or column).
431
+ #
432
+ # Raises CannotGroup if the provided content is too large to fit alone in
433
+ # the current page or column.
434
+ #
435
+ def group(second_attempt=false)
436
+ old_bounding_box = @bounding_box
437
+ @bounding_box = SimpleDelegator.new(@bounding_box)
438
+
439
+ def @bounding_box.move_past_bottom
440
+ raise RollbackTransaction
441
+ end
442
+
443
+ success = transaction { yield }
444
+
445
+ unless success
446
+ raise CannotGroup if second_attempt
447
+ old_bounding_box.move_past_bottom
448
+ group(second_attempt=true) { yield }
449
+ end
450
+
451
+ @bounding_box = old_bounding_box
452
+ end
453
+
454
+ # Specify a template for page numbering. This should be called
455
+ # towards the end of document creation, after all your content is already in
456
+ # place. In your template string, <page> refers to the current page, and
457
+ # <total> refers to the total amount of pages in the doucment.
458
+ #
459
+ # Example:
460
+ #
461
+ # Prawn::Document.generate("page_with_numbering.pdf") do
462
+ # text "Hai"
463
+ # start_new_page
464
+ # text "bai"
465
+ # start_new_page
466
+ # text "-- Hai again"
467
+ # number_pages "<page> in a total of <total>", [bounds.right - 50, 0]
468
+ # end
469
+ def number_pages(string, position)
470
+ page_count.times do |i|
471
+ go_to_page(i)
472
+ str = string.gsub("<page>","#{i+1}").gsub("<total>","#{page_count}")
473
+ text str, :at => position
474
+ end
475
+ end
476
+
477
+ def go_to_page(k) # :nodoc:
478
+ jump_to = @store.pages.data[:Kids][k]
479
+ @current_page = jump_to.identifier
480
+ @page_content = jump_to.data[:Contents].identifier
481
+ end
482
+
483
+ # Returns true if content streams will be compressed before rendering,
484
+ # false otherwise
485
+ #
486
+ def compression_enabled?
487
+ !!@compress
488
+ end
489
+
490
+ private
491
+
492
+ # See Prawn::Document::Internals for low-level PDF functions
493
+
494
+ def build_new_page_content
495
+ generate_margin_box
496
+ @page_content = ref(:Length => 0)
497
+
498
+ @current_page = ref(:Type => :Page,
499
+ :Parent => @store.pages,
500
+ :MediaBox => page_dimensions,
501
+ :Contents => page_content)
502
+ update_colors
503
+ undash if dashed?
504
+ end
505
+
506
+ def generate_margin_box
507
+ old_margin_box = @margin_box
508
+ @margin_box = BoundingBox.new(
509
+ self,
510
+ [ @margins[:left], page_dimensions[-1] - @margins[:top] ] ,
511
+ :width => page_dimensions[-2] - (@margins[:left] + @margins[:right]),
512
+ :height => page_dimensions[-1] - (@margins[:top] + @margins[:bottom])
513
+ )
514
+
515
+ # we must update bounding box if not flowing from the previous page
516
+ #
517
+ # FIXME: This may have a bug where the old margin is restored
518
+ # when the bounding box exits.
519
+ @bounding_box = @margin_box if old_margin_box == @bounding_box
520
+ end
521
+
522
+ def apply_margin_option(options)
523
+ # Treat :margin as CSS shorthand with 1-4 values.
524
+ margin = Array(options[:margin])
525
+ positions = { 4 => [0,1,2,3], 3 => [0,1,2,1],
526
+ 2 => [0,1,0,1], 1 => [0,0,0,0] }[margin.length]
527
+
528
+ [:top, :right, :bottom, :left].zip(positions).each do |p,i|
529
+ options[:"#{p}_margin"] ||= margin[i]
530
+ end
531
+ end
532
+
533
+ end
534
+ end