openxml-docx 0.9.0 → 0.10.0

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +4 -4
  3. data/examples/drawing-ml +134 -0
  4. data/examples/table +28 -0
  5. data/lib/openxml/docx.rb +9 -0
  6. data/lib/openxml/docx/attribute_builder.rb +17 -4
  7. data/lib/openxml/docx/elements/absolute_position_tab.rb +4 -19
  8. data/lib/openxml/docx/elements/bidi_embed.rb +1 -10
  9. data/lib/openxml/docx/elements/bidi_override.rb +1 -9
  10. data/lib/openxml/docx/elements/break.rb +3 -14
  11. data/lib/openxml/docx/elements/control.rb +5 -2
  12. data/lib/openxml/docx/elements/deleted_text.rb +1 -1
  13. data/lib/openxml/docx/elements/drawing.rb +9 -0
  14. data/lib/openxml/docx/elements/element.rb +2 -1
  15. data/lib/openxml/docx/elements/embed_bold.rb +25 -0
  16. data/lib/openxml/docx/elements/embed_bold_italic.rb +25 -0
  17. data/lib/openxml/docx/elements/embed_italic.rb +25 -0
  18. data/lib/openxml/docx/elements/embed_regular.rb +25 -0
  19. data/lib/openxml/docx/elements/family.rb +22 -0
  20. data/lib/openxml/docx/elements/font.rb +14 -0
  21. data/lib/openxml/docx/elements/grid_column.rb +2 -2
  22. data/lib/openxml/docx/elements/group_shape.rb +10 -0
  23. data/lib/openxml/docx/elements/markup_compatibility_alternate_content.rb +10 -0
  24. data/lib/openxml/docx/elements/markup_compatibility_choice.rb +13 -0
  25. data/lib/openxml/docx/elements/markup_compatibility_fallback.rb +10 -0
  26. data/lib/openxml/docx/elements/paper_source.rb +4 -2
  27. data/lib/openxml/docx/elements/section_properties.rb +9 -0
  28. data/lib/openxml/docx/elements/symbol.rb +4 -2
  29. data/lib/openxml/docx/elements/table.rb +1 -1
  30. data/lib/openxml/docx/elements/table_cell.rb +2 -1
  31. data/lib/openxml/docx/elements/table_row.rb +7 -5
  32. data/lib/openxml/docx/elements/text.rb +1 -10
  33. data/lib/openxml/docx/elements/vml_container.rb +10 -0
  34. data/lib/openxml/docx/elements/word_processing_drawing_anchor.rb +23 -0
  35. data/lib/openxml/docx/elements/word_processing_drawing_effect_extent.rb +16 -0
  36. data/lib/openxml/docx/elements/word_processing_drawing_extent.rb +14 -0
  37. data/lib/openxml/docx/elements/word_processing_drawing_nv_graphic_frame_properties.rb +11 -0
  38. data/lib/openxml/docx/elements/word_processing_drawing_object_nv_properties.rb +17 -0
  39. data/lib/openxml/docx/elements/word_processing_drawing_position_h.rb +23 -0
  40. data/lib/openxml/docx/elements/word_processing_drawing_position_offset.rb +10 -0
  41. data/lib/openxml/docx/elements/word_processing_drawing_position_v.rb +23 -0
  42. data/lib/openxml/docx/elements/word_processing_drawing_simple_position.rb +13 -0
  43. data/lib/openxml/docx/elements/word_processing_drawing_wrap_none.rb +10 -0
  44. data/lib/openxml/docx/elements/word_processing_shapes_body_properties.rb +58 -0
  45. data/lib/openxml/docx/elements/word_processing_shapes_shape.rb +12 -0
  46. data/lib/openxml/docx/elements/word_processing_shapes_shape_properties.rb +23 -0
  47. data/lib/openxml/docx/package.rb +73 -1
  48. data/lib/openxml/docx/parts/document.rb +6 -24
  49. data/lib/openxml/docx/parts/fonts.rb +35 -0
  50. data/lib/openxml/docx/parts/footer.rb +32 -0
  51. data/lib/openxml/docx/parts/header.rb +32 -0
  52. data/lib/openxml/docx/parts/settings.rb +6 -2
  53. data/lib/openxml/docx/parts/styles.rb +5 -6
  54. data/lib/openxml/docx/properties.rb +0 -1
  55. data/lib/openxml/docx/properties/alignment.rb +1 -1
  56. data/lib/openxml/docx/properties/base_property.rb +13 -0
  57. data/lib/openxml/docx/properties/border.rb +11 -9
  58. data/lib/openxml/docx/properties/color.rb +6 -4
  59. data/lib/openxml/docx/properties/column.rb +4 -2
  60. data/lib/openxml/docx/properties/columns.rb +6 -4
  61. data/lib/openxml/docx/properties/complex_property.rb +1 -1
  62. data/lib/openxml/docx/properties/conditional_formatting.rb +14 -12
  63. data/lib/openxml/docx/properties/document_grid.rb +4 -10
  64. data/lib/openxml/docx/properties/east_asian_layout.rb +6 -11
  65. data/lib/openxml/docx/properties/font.rb +18 -22
  66. data/lib/openxml/docx/properties/footer_reference.rb +21 -0
  67. data/lib/openxml/docx/properties/frame.rb +16 -47
  68. data/lib/openxml/docx/properties/header_reference.rb +21 -0
  69. data/lib/openxml/docx/properties/indentation.rb +11 -8
  70. data/lib/openxml/docx/properties/language.rb +5 -3
  71. data/lib/openxml/docx/properties/latent_styles.rb +9 -6
  72. data/lib/openxml/docx/properties/latent_styles_exception.rb +9 -6
  73. data/lib/openxml/docx/properties/line_numbering.rb +5 -11
  74. data/lib/openxml/docx/properties/manual_width.rb +4 -2
  75. data/lib/openxml/docx/properties/numbering.rb +4 -2
  76. data/lib/openxml/docx/properties/page_borders.rb +6 -19
  77. data/lib/openxml/docx/properties/page_margins.rb +10 -7
  78. data/lib/openxml/docx/properties/page_numbering.rb +66 -74
  79. data/lib/openxml/docx/properties/page_size.rb +5 -12
  80. data/lib/openxml/docx/properties/shading.rb +46 -52
  81. data/lib/openxml/docx/properties/spacing.rb +9 -14
  82. data/lib/openxml/docx/properties/table_border.rb +12 -10
  83. data/lib/openxml/docx/properties/table_cell_border.rb +12 -10
  84. data/lib/openxml/docx/properties/table_cell_margin.rb +6 -4
  85. data/lib/openxml/docx/properties/table_cell_spacing.rb +5 -3
  86. data/lib/openxml/docx/properties/table_cell_width.rb +5 -3
  87. data/lib/openxml/docx/properties/table_indent.rb +5 -3
  88. data/lib/openxml/docx/properties/table_layout.rb +2 -4
  89. data/lib/openxml/docx/properties/table_look.rb +8 -6
  90. data/lib/openxml/docx/properties/table_p_pr.rb +11 -30
  91. data/lib/openxml/docx/properties/table_row_height.rb +13 -0
  92. data/lib/openxml/docx/properties/table_width.rb +5 -3
  93. data/lib/openxml/docx/properties/underline.rb +13 -12
  94. data/lib/openxml/docx/properties/wafter.rb +5 -3
  95. data/lib/openxml/docx/properties/wbefore.rb +5 -3
  96. data/lib/openxml/docx/root_namespaces.rb +74 -0
  97. data/lib/openxml/docx/section.rb +2 -0
  98. data/lib/openxml/docx/style.rb +4 -4
  99. data/lib/openxml/docx/version.rb +1 -1
  100. data/lib/openxml/drawingml.rb +17 -0
  101. data/lib/openxml/drawingml/elements.rb +13 -0
  102. data/lib/openxml/drawingml/elements/adjust_values_list.rb +11 -0
  103. data/lib/openxml/drawingml/elements/blip_fill.rb +14 -0
  104. data/lib/openxml/drawingml/elements/extension.rb +13 -0
  105. data/lib/openxml/drawingml/elements/extension_list.rb +11 -0
  106. data/lib/openxml/drawingml/elements/extents.rb +14 -0
  107. data/lib/openxml/drawingml/elements/graphic.rb +10 -0
  108. data/lib/openxml/drawingml/elements/graphic_data.rb +12 -0
  109. data/lib/openxml/drawingml/elements/graphic_frame_locks.rb +17 -0
  110. data/lib/openxml/drawingml/elements/head_end.rb +28 -0
  111. data/lib/openxml/drawingml/elements/no_fill.rb +10 -0
  112. data/lib/openxml/drawingml/elements/non_visual_drawing_properties.rb +17 -0
  113. data/lib/openxml/drawingml/elements/non_visual_picture_drawing_properties.rb +12 -0
  114. data/lib/openxml/drawingml/elements/non_visual_picture_properties.rb +10 -0
  115. data/lib/openxml/drawingml/elements/offset.rb +14 -0
  116. data/lib/openxml/drawingml/elements/outline.rb +36 -0
  117. data/lib/openxml/drawingml/elements/picture.rb +10 -0
  118. data/lib/openxml/drawingml/elements/preset_geometry.rb +210 -0
  119. data/lib/openxml/drawingml/elements/round.rb +10 -0
  120. data/lib/openxml/drawingml/elements/shape_guide.rb +40 -0
  121. data/lib/openxml/drawingml/elements/solid_fill.rb +10 -0
  122. data/lib/openxml/drawingml/elements/srgb_color.rb +14 -0
  123. data/lib/openxml/drawingml/elements/tail_end.rb +28 -0
  124. data/lib/openxml/drawingml/elements/transform_effect.rb +18 -0
  125. data/lib/openxml/drawingml/elements/wordprocessing_shape_group.rb +11 -0
  126. data/lib/openxml/vml.rb +17 -0
  127. data/lib/openxml/vml/elements.rb +13 -0
  128. data/lib/openxml/vml/elements/group.rb +88 -0
  129. data/lib/openxml/vml/elements/rectangle.rb +115 -0
  130. data/lib/openxml/vml/elements/rounded_rectangle.rb +121 -0
  131. data/openxml-docx.gemspec +1 -1
  132. data/spec/elements/absolute_position_tab_spec.rb +15 -47
  133. data/spec/elements/bidi_embed_spec.rb +4 -8
  134. data/spec/elements/bidi_override_spec.rb +4 -8
  135. data/spec/elements/break_spec.rb +8 -31
  136. data/spec/elements/content_part_spec.rb +2 -2
  137. data/spec/elements/control_spec.rb +6 -6
  138. data/spec/elements/deleted_text_spec.rb +2 -2
  139. data/spec/elements/drawing_spec.rb +11 -0
  140. data/spec/elements/drawingml/adjust_values_list_spec.rb +8 -0
  141. data/spec/elements/drawingml/blip_fill_spec.rb +34 -0
  142. data/spec/elements/drawingml/extension_list_spec.rb +8 -0
  143. data/spec/elements/drawingml/extension_spec.rb +19 -0
  144. data/spec/elements/drawingml/extents_spec.rb +33 -0
  145. data/spec/elements/drawingml/graphic_data_spec.rb +19 -0
  146. data/spec/elements/drawingml/graphic_frame_locks_spec.rb +78 -0
  147. data/spec/elements/drawingml/graphic_spec.rb +8 -0
  148. data/spec/elements/drawingml/head_end_spec.rb +45 -0
  149. data/spec/elements/drawingml/no_fill_spec.rb +8 -0
  150. data/spec/elements/drawingml/non_visual_drawing_properties_spec.rb +63 -0
  151. data/spec/elements/drawingml/non_visual_picture_drawing_properties_spec.rb +18 -0
  152. data/spec/elements/drawingml/non_visual_picture_properties_spec.rb +8 -0
  153. data/spec/elements/drawingml/offset_spec.rb +32 -0
  154. data/spec/elements/drawingml/outline_spec.rb +58 -0
  155. data/spec/elements/drawingml/picture_spec.rb +8 -0
  156. data/spec/elements/drawingml/preset_geometry_spec.rb +19 -0
  157. data/spec/elements/drawingml/round_spec.rb +8 -0
  158. data/spec/elements/drawingml/shape_guide_spec.rb +49 -0
  159. data/spec/elements/drawingml/solid_fill_spec.rb +8 -0
  160. data/spec/elements/drawingml/srgb_color_spec.rb +20 -0
  161. data/spec/elements/drawingml/tail_end_spec.rb +44 -0
  162. data/spec/elements/drawingml/transform_effect_spec.rb +80 -0
  163. data/spec/elements/drawingml/wordprocessing_shape_group_spec.rb +12 -0
  164. data/spec/elements/group_shape_spec.rb +11 -0
  165. data/spec/elements/markup_compatibility_alternate_content_spec.rb +11 -0
  166. data/spec/elements/markup_compatibility_choice_spec.rb +22 -0
  167. data/spec/elements/markup_compatibility_fallback_spec.rb +11 -0
  168. data/spec/elements/section_properties_spec.rb +12 -0
  169. data/spec/elements/symbol_spec.rb +4 -7
  170. data/spec/elements/text_spec.rb +2 -2
  171. data/spec/elements/vml/group_spec.rb +542 -0
  172. data/spec/elements/vml/rectangle_spec.rb +739 -0
  173. data/spec/elements/vml/rounded_rectangle_spec.rb +656 -0
  174. data/spec/elements/vml_container_spec.rb +11 -0
  175. data/spec/elements/word_processing_drawing_anchor_spec.rb +40 -0
  176. data/spec/elements/word_processing_drawing_effect_extent_spec.rb +57 -0
  177. data/spec/elements/word_processing_drawing_extent_spec.rb +34 -0
  178. data/spec/elements/word_processing_drawing_nv_graphic_frame_properties_spec.rb +11 -0
  179. data/spec/elements/word_processing_drawing_object_nv_properties_spec.rb +67 -0
  180. data/spec/elements/word_processing_drawing_position_h_spec.rb +21 -0
  181. data/spec/elements/word_processing_drawing_position_v_spec.rb +21 -0
  182. data/spec/elements/word_processing_drawing_simple_position_spec.rb +34 -0
  183. data/spec/elements/word_processing_drawing_wrap_none_spec.rb +12 -0
  184. data/spec/elements/word_processing_shapes_body_properties_spec.rb +223 -0
  185. data/spec/elements/word_processing_shapes_shape_properties_spec.rb +21 -0
  186. data/spec/elements/word_processing_shapes_shape_spec.rb +23 -0
  187. data/spec/parts/footer_spec.rb +33 -0
  188. data/spec/parts/header_spec.rb +33 -0
  189. data/spec/properties/footer_reference_spec.rb +32 -0
  190. data/spec/properties/header_reference_spec.rb +32 -0
  191. data/spec/properties/page_numbering_spec.rb +1 -1
  192. data/spec/properties/{table_cell_fit_text.rb → table_cell_fit_text_spec.rb} +0 -0
  193. data/spec/properties/{table_cell_width.rb → table_cell_width_spec.rb} +0 -0
  194. data/spec/properties/table_layout_spec.rb +14 -12
  195. data/spec/properties/{table_row_height.rb → table_row_height_spec.rb} +0 -0
  196. data/spec/section_spec.rb +2 -0
  197. data/spec/spec_helper.rb +2 -0
  198. data/spec/support/data/elements/grid_column_element.xml +1 -1
  199. data/spec/support/data/elements/table_grid_element.xml +1 -1
  200. data/spec/support/data/parts/document_with_children_part.xml +2 -1
  201. data/spec/support/data/parts/document_with_multiple_sections_part.xml +1 -1
  202. data/spec/support/data/parts/document_with_one_section_part.xml +1 -1
  203. data/spec/support/data/parts/empty_document_part.xml +1 -1
  204. data/spec/support/data/parts/empty_footer_part.xml +1 -0
  205. data/spec/support/data/parts/empty_header_part.xml +1 -0
  206. data/spec/support/data/parts/footer_with_children_part.xml +1 -0
  207. data/spec/support/data/parts/header_with_children_part.xml +1 -0
  208. data/spec/support/element_test_macros.rb +58 -9
  209. metadata +126 -9
  210. data/lib/openxml/docx/properties/tr_height.rb +0 -19
  211. data/lib/openxml/docx/properties/width_property.rb +0 -17
@@ -0,0 +1,23 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingPositionV < Container
5
+ tag :positionV
6
+ namespace :wp
7
+
8
+ attribute :relativeFrom, expects: :valid_relative_from
9
+
10
+ private
11
+
12
+ def valid_relative_from(value)
13
+ raise ArgumentError unless ok_values.include? value
14
+ end
15
+
16
+ def ok_values
17
+ %i(bottomMargin insideMargin line margin outsideMargin page
18
+ paragraph topMargin)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingSimplePosition < Element
5
+ tag :simplePos
6
+ namespace :wp
7
+
8
+ attribute :x, expects: :integer
9
+ attribute :y, expects: :integer
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingDrawingWrapNone < Element
5
+ tag :wrapNone
6
+ namespace :wp
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,58 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesBodyProperties < Container
5
+ tag :bodyPr
6
+ namespace :wps
7
+
8
+ attribute :anchor, expects: :anchor_value
9
+ attribute :anchorCtr, expects: :true_or_false
10
+ attribute :bottom_inset, expects: :positive_integer, displays_as: :bIns
11
+ attribute :compatible_line_spacing, expects: :true_or_false, displays_as: :compatLnSpc
12
+ attribute :force_anti_alias, expects: :true_or_false, displays_as: :forceAA
13
+ attribute :fromWordArt, expects: :true_or_false
14
+ attribute :horzOverflow, expects: :horizontal_overflow_value
15
+ attribute :left_inset, expects: :positive_integer, displays_as: :lIns
16
+ attribute :numCol, expects: :number_of_columns
17
+ attribute :right_inset, expects: :positive_integer, displays_as: :rIns
18
+ attribute :rotation, expects: :integer, displays_as: :rot
19
+ attribute :right_to_left_columns, expects: :true_or_false, displays_as: :rtlCol
20
+ attribute :space_between_columns, expects: :positive_integer, displays_as: :spcCol
21
+ attribute :paragraph_spacing, expects: :true_or_false, displays_as: :spcFirstLastPara
22
+ attribute :top_inset, expects: :positive_integer, displays_as: :tIns
23
+ attribute :upright, expects: :true_or_false
24
+ attribute :vert, expects: :vertical_value
25
+ attribute :vertOverflow, expects: :vertical_overflow_value
26
+ attribute :wrap, expects: :wrap_value
27
+
28
+ private
29
+
30
+ def anchor_value(value)
31
+ raise ArgumentError unless %i(b ctr dist just t).include? value
32
+ end
33
+
34
+ def horizontal_overflow_value(value)
35
+ raise ArgumentError unless %i(clip overflow).include? value
36
+ end
37
+
38
+ def number_of_columns(value)
39
+ raise ArgumentError unless (1..16).to_a.include? value
40
+ end
41
+
42
+ def vertical_value(value)
43
+ ok_values = %i(eaVert horz mongolianVert vert vert270 wordArt Vert wordArtVertRtl)
44
+ raise ArgumentError unless ok_values.include? value
45
+ end
46
+
47
+ def vertical_overflow_value(value)
48
+ raise ArgumentError unless %i(clip ellipsis overflow).include? value
49
+ end
50
+
51
+ def wrap_value(value)
52
+ raise ArgumentError unless %i(none square).include? value
53
+ end
54
+
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,12 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesShape < Container
5
+ tag :wsp
6
+ namespace :wps
7
+
8
+ attribute :normalEastAsianFlow, expects: :true_or_false
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Elements
4
+ class WordProcessingShapesShapeProperties < Container
5
+ tag :spPr
6
+ namespace :wps
7
+
8
+ attribute :bwMode, expects: :valid_colors
9
+
10
+ private
11
+
12
+ def valid_colors(value)
13
+ raise ArgumentError unless ok_values.include? value
14
+ end
15
+
16
+ def ok_values
17
+ %i(auto black blackGray blackWhite clr gray grayWhite hidden invGray ltGray white)
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -5,13 +5,19 @@ module OpenXml
5
5
  class Package < OpenXml::Package
6
6
  attr_reader :document,
7
7
  :doc_rels,
8
+ :font_rels,
8
9
  :settings,
9
- :styles
10
+ :headers,
11
+ :footers,
12
+ :styles,
13
+ :fonts
10
14
 
11
15
  content_types do
12
16
  default "xml", TYPE_XML
17
+ default "odttf", TYPE_OBSCURED_FONT
13
18
  override "/word/styles.xml", TYPE_STYLES
14
19
  override "/word/settings.xml", TYPE_SETTINGS
20
+ override "/word/fontTable.xml", TYPE_FONT_TABLE
15
21
  end
16
22
 
17
23
  def initialize
@@ -19,17 +25,83 @@ module OpenXml
19
25
 
20
26
  rels.add_relationship REL_DOCUMENT, "/word/document.xml"
21
27
  @doc_rels = OpenXml::Parts::Rels.new
28
+ @font_rels = OpenXml::Parts::Rels.new
22
29
  @settings = OpenXml::Docx::Parts::Settings.new
23
30
  @styles = OpenXml::Docx::Parts::Styles.new
31
+ @fonts = OpenXml::Docx::Parts::Fonts.new
24
32
  @document = OpenXml::Docx::Parts::Document.new
33
+ @headers = []
34
+ @footers = []
25
35
 
26
36
  doc_rels.add_relationship REL_STYLES, "styles.xml"
27
37
  doc_rels.add_relationship REL_SETTINGS, "settings.xml"
38
+ doc_rels.add_relationship REL_FONT_TABLE, "fontTable.xml"
28
39
 
29
40
  add_part "word/_rels/document.xml.rels", doc_rels
41
+ add_part "word/_rels/fontTable.xml.rels", font_rels
30
42
  add_part "word/document.xml", document
31
43
  add_part "word/settings.xml", settings
32
44
  add_part "word/styles.xml", styles
45
+ add_part "word/fontTable.xml", fonts
46
+ end
47
+
48
+ def embed_truetype_font(path: nil, name: nil)
49
+ File.open(path, "rb") do |source_font|
50
+ obfuscation_data = obfuscate_font source_font
51
+ data = obfuscation_data[:bytes] << source_font.read
52
+ destination_font_name = "font#{fonts.fonts.count + 1}.odttf"
53
+ add_part "word/fonts/#{destination_font_name}", OpenXml::Parts::UnparsedPart.new(data)
54
+ font_relationship = font_rels.add_relationship REL_FONT, "fonts/#{destination_font_name}"
55
+
56
+ font_description = OpenXml::Docx::Elements::Font.new
57
+ font_description.font_name = name
58
+ embed_tag = OpenXml::Docx::Elements::EmbedRegular.new
59
+ embed_tag.font_key = "{#{obfuscation_data[:key]}}"
60
+ embed_tag.relationship_id = font_relationship.id
61
+ font_description << embed_tag
62
+ fonts << font_description
63
+ end
64
+ end
65
+
66
+ def add_header(header)
67
+ headers << header
68
+ header_name = "header#{headers.count}.xml"
69
+ Package.content_types { override "/word/#{header_name}", TYPE_HEADER }
70
+ add_part "word/#{header_name}", header
71
+ relationship = doc_rels.add_relationship REL_HEADER, header_name
72
+ relationship.id
73
+ end
74
+
75
+ def add_footer(footer)
76
+ footers << footer
77
+ footer_name = "footer#{footers.count}.xml"
78
+ Package.content_types { override "/word/#{footer_name}", TYPE_FOOTER }
79
+ add_part "word/#{footer_name}", footer
80
+ relationship = doc_rels.add_relationship REL_FOOTER, footer_name
81
+ relationship.id
82
+ end
83
+
84
+ private
85
+
86
+ def obfuscate_font(font)
87
+ # From the OpenXml spec, section 17.8.1, the algorithm for obfuscating a font:
88
+ # - Generate a GUID, which is used and stored as the obfuscation key
89
+ # - Reverse the order of the bytes in the GUID (i.e. Big Endian ordering)
90
+ # - XOR the value with the first 32 bytes of the binary: once against 0-15, once against 16-31
91
+ # - Store the resulting file in the document, and store the obfuscation key in the fontKey attribute
92
+
93
+ key = SecureRandom::uuid.upcase # Spec requires hex characters be uppercase
94
+ raw_key = key.gsub("-", "")
95
+ big_endian_key = [raw_key].pack("H*").bytes.reverse
96
+ obfuscated_bytes = []
97
+ 2.times do
98
+ bytes = font.read(16).bytes
99
+ (0...16).each do |index|
100
+ obfuscated_bytes << (bytes[index] ^ big_endian_key[index])
101
+ end
102
+ end
103
+
104
+ { key: key, bytes: obfuscated_bytes.pack("C*") }
33
105
  end
34
106
 
35
107
  end
@@ -2,8 +2,13 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Document < OpenXml::Part
5
+ include RootNamespaces
6
+
5
7
  attr_reader :children, :current_section
6
8
 
9
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :wpg, :wpi, :wne, :wps, :w, :mc, :a14, :pic
10
+ can_ignore :w14, :wp14, :a14
11
+
7
12
  def initialize
8
13
  @children = []
9
14
  end
@@ -28,7 +33,7 @@ module OpenXml
28
33
  def to_xml
29
34
  build_xml do |xml|
30
35
  xml.document(root_namespaces) {
31
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
36
+ xml.parent.namespace = :w
32
37
  xml["w"].body {
33
38
  children.each { |child| child.to_xml(xml) }
34
39
  current_section.to_xml(xml) unless current_section.nil?
@@ -37,29 +42,6 @@ module OpenXml
37
42
  end
38
43
  end
39
44
 
40
- private
41
-
42
- def root_namespaces
43
- { "xmlns:wpc" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas',
44
- "xmlns:mo" => 'http://schemas.microsoft.com/office/mac/office/2008/main',
45
- "xmlns:mv" => 'urn:schemas-microsoft-com:mac:vml',
46
- "xmlns:o" => 'urn:schemas-microsoft-com:office:office',
47
- "xmlns:r" => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
48
- "xmlns:m" => 'http://schemas.openxmlformats.org/officeDocument/2006/math',
49
- "xmlns:v" => 'urn:schemas-microsoft-com:vml',
50
- "xmlns:wp14" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing',
51
- "xmlns:wp" => 'http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing',
52
- "xmlns:w10" => 'urn:schemas-microsoft-com:office:word',
53
- "xmlns:w14" => 'http://schemas.microsoft.com/office/word/2010/wordml',
54
- "xmlns:wpg" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingGroup',
55
- "xmlns:wpi" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingInk',
56
- "xmlns:wne" => 'http://schemas.microsoft.com/office/word/2006/wordml',
57
- "xmlns:wps" => 'http://schemas.microsoft.com/office/word/2010/wordprocessingShape',
58
- "xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main",
59
- "xmlns:mc" => "http://schemas.openxmlformats.org/markup-compatibility/2006",
60
- "mc:Ignorable" => "w14 wp14" }
61
- end
62
-
63
45
  end
64
46
  end
65
47
  end
@@ -0,0 +1,35 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Fonts < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ attr_reader :fonts
8
+
9
+ use_namespaces :r, :w
10
+
11
+ def initialize
12
+ @fonts = []
13
+ end
14
+
15
+ def <<(font)
16
+ @fonts << font
17
+ end
18
+
19
+ def count
20
+ fonts.count
21
+ end
22
+
23
+ def to_xml
24
+ build_standalone_xml do |xml|
25
+ xml.fonts(root_namespaces) {
26
+ xml.parent.namespace = :w
27
+ fonts.each { |font| font.to_xml(xml) }
28
+ }
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Footer < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :w15, :wpg, :wpi, :wne, :wps, :w, :mc, :a, :a14
8
+ can_ignore :w14, :w15, :wp14, :a14
9
+
10
+ attr_reader :children
11
+
12
+ def initialize
13
+ @children = []
14
+ end
15
+
16
+ def <<(child)
17
+ children << child
18
+ end
19
+
20
+ def to_xml
21
+ build_xml do |xml|
22
+ xml.ftr(root_namespaces) {
23
+ xml.parent.namespace = :w
24
+ children.each { |child| child.to_xml(xml) }
25
+ }
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module OpenXml
2
+ module Docx
3
+ module Parts
4
+ class Header < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :wpc, :mo, :mv, :o, :r, :m, :v, :wp14, :wp, :w10, :w14, :w15, :wpg, :wpi, :wne, :wps, :w, :mc, :a, :a14
8
+ can_ignore :w14, :w15, :wp14, :a14
9
+
10
+ attr_reader :children
11
+
12
+ def initialize
13
+ @children = []
14
+ end
15
+
16
+ def <<(child)
17
+ children << child
18
+ end
19
+
20
+ def to_xml
21
+ build_xml do |xml|
22
+ xml.hdr(root_namespaces) {
23
+ xml.parent.namespace = :w
24
+ children.each { |child| child.to_xml(xml) }
25
+ }
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -2,6 +2,10 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Settings < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespace :w
8
+
5
9
  attr_reader :settings
6
10
 
7
11
  def initialize
@@ -10,8 +14,8 @@ module OpenXml
10
14
 
11
15
  def to_xml
12
16
  build_standalone_xml do |xml|
13
- xml.settings("xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main") {
14
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
17
+ xml.settings(root_namespaces) {
18
+ xml.parent.namespace = :w
15
19
  }
16
20
  end
17
21
  end
@@ -2,6 +2,10 @@ module OpenXml
2
2
  module Docx
3
3
  module Parts
4
4
  class Styles < OpenXml::Part
5
+ include RootNamespaces
6
+
7
+ use_namespaces :r, :w
8
+
5
9
  attr_reader :styles
6
10
 
7
11
  def initialize
@@ -15,7 +19,7 @@ module OpenXml
15
19
  def to_xml
16
20
  build_standalone_xml do |xml|
17
21
  xml.styles(root_namespaces) {
18
- xml.parent.namespace = xml.parent.namespace_definitions.find { |ns| ns.prefix == "w" }
22
+ xml.parent.namespace = :w
19
23
  add_default_styles(xml)
20
24
  styles.each { |style| style.to_xml(xml) }
21
25
  }
@@ -39,11 +43,6 @@ module OpenXml
39
43
  }
40
44
  end
41
45
 
42
- def root_namespaces
43
- { "xmlns:r" => "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
44
- "xmlns:w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }
45
- end
46
-
47
46
  end
48
47
  end
49
48
  end