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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/examples/drawing-ml +134 -0
- data/examples/table +28 -0
- data/lib/openxml/docx.rb +9 -0
- data/lib/openxml/docx/attribute_builder.rb +17 -4
- data/lib/openxml/docx/elements/absolute_position_tab.rb +4 -19
- data/lib/openxml/docx/elements/bidi_embed.rb +1 -10
- data/lib/openxml/docx/elements/bidi_override.rb +1 -9
- data/lib/openxml/docx/elements/break.rb +3 -14
- data/lib/openxml/docx/elements/control.rb +5 -2
- data/lib/openxml/docx/elements/deleted_text.rb +1 -1
- data/lib/openxml/docx/elements/drawing.rb +9 -0
- data/lib/openxml/docx/elements/element.rb +2 -1
- data/lib/openxml/docx/elements/embed_bold.rb +25 -0
- data/lib/openxml/docx/elements/embed_bold_italic.rb +25 -0
- data/lib/openxml/docx/elements/embed_italic.rb +25 -0
- data/lib/openxml/docx/elements/embed_regular.rb +25 -0
- data/lib/openxml/docx/elements/family.rb +22 -0
- data/lib/openxml/docx/elements/font.rb +14 -0
- data/lib/openxml/docx/elements/grid_column.rb +2 -2
- data/lib/openxml/docx/elements/group_shape.rb +10 -0
- data/lib/openxml/docx/elements/markup_compatibility_alternate_content.rb +10 -0
- data/lib/openxml/docx/elements/markup_compatibility_choice.rb +13 -0
- data/lib/openxml/docx/elements/markup_compatibility_fallback.rb +10 -0
- data/lib/openxml/docx/elements/paper_source.rb +4 -2
- data/lib/openxml/docx/elements/section_properties.rb +9 -0
- data/lib/openxml/docx/elements/symbol.rb +4 -2
- data/lib/openxml/docx/elements/table.rb +1 -1
- data/lib/openxml/docx/elements/table_cell.rb +2 -1
- data/lib/openxml/docx/elements/table_row.rb +7 -5
- data/lib/openxml/docx/elements/text.rb +1 -10
- data/lib/openxml/docx/elements/vml_container.rb +10 -0
- data/lib/openxml/docx/elements/word_processing_drawing_anchor.rb +23 -0
- data/lib/openxml/docx/elements/word_processing_drawing_effect_extent.rb +16 -0
- data/lib/openxml/docx/elements/word_processing_drawing_extent.rb +14 -0
- data/lib/openxml/docx/elements/word_processing_drawing_nv_graphic_frame_properties.rb +11 -0
- data/lib/openxml/docx/elements/word_processing_drawing_object_nv_properties.rb +17 -0
- data/lib/openxml/docx/elements/word_processing_drawing_position_h.rb +23 -0
- data/lib/openxml/docx/elements/word_processing_drawing_position_offset.rb +10 -0
- data/lib/openxml/docx/elements/word_processing_drawing_position_v.rb +23 -0
- data/lib/openxml/docx/elements/word_processing_drawing_simple_position.rb +13 -0
- data/lib/openxml/docx/elements/word_processing_drawing_wrap_none.rb +10 -0
- data/lib/openxml/docx/elements/word_processing_shapes_body_properties.rb +58 -0
- data/lib/openxml/docx/elements/word_processing_shapes_shape.rb +12 -0
- data/lib/openxml/docx/elements/word_processing_shapes_shape_properties.rb +23 -0
- data/lib/openxml/docx/package.rb +73 -1
- data/lib/openxml/docx/parts/document.rb +6 -24
- data/lib/openxml/docx/parts/fonts.rb +35 -0
- data/lib/openxml/docx/parts/footer.rb +32 -0
- data/lib/openxml/docx/parts/header.rb +32 -0
- data/lib/openxml/docx/parts/settings.rb +6 -2
- data/lib/openxml/docx/parts/styles.rb +5 -6
- data/lib/openxml/docx/properties.rb +0 -1
- data/lib/openxml/docx/properties/alignment.rb +1 -1
- data/lib/openxml/docx/properties/base_property.rb +13 -0
- data/lib/openxml/docx/properties/border.rb +11 -9
- data/lib/openxml/docx/properties/color.rb +6 -4
- data/lib/openxml/docx/properties/column.rb +4 -2
- data/lib/openxml/docx/properties/columns.rb +6 -4
- data/lib/openxml/docx/properties/complex_property.rb +1 -1
- data/lib/openxml/docx/properties/conditional_formatting.rb +14 -12
- data/lib/openxml/docx/properties/document_grid.rb +4 -10
- data/lib/openxml/docx/properties/east_asian_layout.rb +6 -11
- data/lib/openxml/docx/properties/font.rb +18 -22
- data/lib/openxml/docx/properties/footer_reference.rb +21 -0
- data/lib/openxml/docx/properties/frame.rb +16 -47
- data/lib/openxml/docx/properties/header_reference.rb +21 -0
- data/lib/openxml/docx/properties/indentation.rb +11 -8
- data/lib/openxml/docx/properties/language.rb +5 -3
- data/lib/openxml/docx/properties/latent_styles.rb +9 -6
- data/lib/openxml/docx/properties/latent_styles_exception.rb +9 -6
- data/lib/openxml/docx/properties/line_numbering.rb +5 -11
- data/lib/openxml/docx/properties/manual_width.rb +4 -2
- data/lib/openxml/docx/properties/numbering.rb +4 -2
- data/lib/openxml/docx/properties/page_borders.rb +6 -19
- data/lib/openxml/docx/properties/page_margins.rb +10 -7
- data/lib/openxml/docx/properties/page_numbering.rb +66 -74
- data/lib/openxml/docx/properties/page_size.rb +5 -12
- data/lib/openxml/docx/properties/shading.rb +46 -52
- data/lib/openxml/docx/properties/spacing.rb +9 -14
- data/lib/openxml/docx/properties/table_border.rb +12 -10
- data/lib/openxml/docx/properties/table_cell_border.rb +12 -10
- data/lib/openxml/docx/properties/table_cell_margin.rb +6 -4
- data/lib/openxml/docx/properties/table_cell_spacing.rb +5 -3
- data/lib/openxml/docx/properties/table_cell_width.rb +5 -3
- data/lib/openxml/docx/properties/table_indent.rb +5 -3
- data/lib/openxml/docx/properties/table_layout.rb +2 -4
- data/lib/openxml/docx/properties/table_look.rb +8 -6
- data/lib/openxml/docx/properties/table_p_pr.rb +11 -30
- data/lib/openxml/docx/properties/table_row_height.rb +13 -0
- data/lib/openxml/docx/properties/table_width.rb +5 -3
- data/lib/openxml/docx/properties/underline.rb +13 -12
- data/lib/openxml/docx/properties/wafter.rb +5 -3
- data/lib/openxml/docx/properties/wbefore.rb +5 -3
- data/lib/openxml/docx/root_namespaces.rb +74 -0
- data/lib/openxml/docx/section.rb +2 -0
- data/lib/openxml/docx/style.rb +4 -4
- data/lib/openxml/docx/version.rb +1 -1
- data/lib/openxml/drawingml.rb +17 -0
- data/lib/openxml/drawingml/elements.rb +13 -0
- data/lib/openxml/drawingml/elements/adjust_values_list.rb +11 -0
- data/lib/openxml/drawingml/elements/blip_fill.rb +14 -0
- data/lib/openxml/drawingml/elements/extension.rb +13 -0
- data/lib/openxml/drawingml/elements/extension_list.rb +11 -0
- data/lib/openxml/drawingml/elements/extents.rb +14 -0
- data/lib/openxml/drawingml/elements/graphic.rb +10 -0
- data/lib/openxml/drawingml/elements/graphic_data.rb +12 -0
- data/lib/openxml/drawingml/elements/graphic_frame_locks.rb +17 -0
- data/lib/openxml/drawingml/elements/head_end.rb +28 -0
- data/lib/openxml/drawingml/elements/no_fill.rb +10 -0
- data/lib/openxml/drawingml/elements/non_visual_drawing_properties.rb +17 -0
- data/lib/openxml/drawingml/elements/non_visual_picture_drawing_properties.rb +12 -0
- data/lib/openxml/drawingml/elements/non_visual_picture_properties.rb +10 -0
- data/lib/openxml/drawingml/elements/offset.rb +14 -0
- data/lib/openxml/drawingml/elements/outline.rb +36 -0
- data/lib/openxml/drawingml/elements/picture.rb +10 -0
- data/lib/openxml/drawingml/elements/preset_geometry.rb +210 -0
- data/lib/openxml/drawingml/elements/round.rb +10 -0
- data/lib/openxml/drawingml/elements/shape_guide.rb +40 -0
- data/lib/openxml/drawingml/elements/solid_fill.rb +10 -0
- data/lib/openxml/drawingml/elements/srgb_color.rb +14 -0
- data/lib/openxml/drawingml/elements/tail_end.rb +28 -0
- data/lib/openxml/drawingml/elements/transform_effect.rb +18 -0
- data/lib/openxml/drawingml/elements/wordprocessing_shape_group.rb +11 -0
- data/lib/openxml/vml.rb +17 -0
- data/lib/openxml/vml/elements.rb +13 -0
- data/lib/openxml/vml/elements/group.rb +88 -0
- data/lib/openxml/vml/elements/rectangle.rb +115 -0
- data/lib/openxml/vml/elements/rounded_rectangle.rb +121 -0
- data/openxml-docx.gemspec +1 -1
- data/spec/elements/absolute_position_tab_spec.rb +15 -47
- data/spec/elements/bidi_embed_spec.rb +4 -8
- data/spec/elements/bidi_override_spec.rb +4 -8
- data/spec/elements/break_spec.rb +8 -31
- data/spec/elements/content_part_spec.rb +2 -2
- data/spec/elements/control_spec.rb +6 -6
- data/spec/elements/deleted_text_spec.rb +2 -2
- data/spec/elements/drawing_spec.rb +11 -0
- data/spec/elements/drawingml/adjust_values_list_spec.rb +8 -0
- data/spec/elements/drawingml/blip_fill_spec.rb +34 -0
- data/spec/elements/drawingml/extension_list_spec.rb +8 -0
- data/spec/elements/drawingml/extension_spec.rb +19 -0
- data/spec/elements/drawingml/extents_spec.rb +33 -0
- data/spec/elements/drawingml/graphic_data_spec.rb +19 -0
- data/spec/elements/drawingml/graphic_frame_locks_spec.rb +78 -0
- data/spec/elements/drawingml/graphic_spec.rb +8 -0
- data/spec/elements/drawingml/head_end_spec.rb +45 -0
- data/spec/elements/drawingml/no_fill_spec.rb +8 -0
- data/spec/elements/drawingml/non_visual_drawing_properties_spec.rb +63 -0
- data/spec/elements/drawingml/non_visual_picture_drawing_properties_spec.rb +18 -0
- data/spec/elements/drawingml/non_visual_picture_properties_spec.rb +8 -0
- data/spec/elements/drawingml/offset_spec.rb +32 -0
- data/spec/elements/drawingml/outline_spec.rb +58 -0
- data/spec/elements/drawingml/picture_spec.rb +8 -0
- data/spec/elements/drawingml/preset_geometry_spec.rb +19 -0
- data/spec/elements/drawingml/round_spec.rb +8 -0
- data/spec/elements/drawingml/shape_guide_spec.rb +49 -0
- data/spec/elements/drawingml/solid_fill_spec.rb +8 -0
- data/spec/elements/drawingml/srgb_color_spec.rb +20 -0
- data/spec/elements/drawingml/tail_end_spec.rb +44 -0
- data/spec/elements/drawingml/transform_effect_spec.rb +80 -0
- data/spec/elements/drawingml/wordprocessing_shape_group_spec.rb +12 -0
- data/spec/elements/group_shape_spec.rb +11 -0
- data/spec/elements/markup_compatibility_alternate_content_spec.rb +11 -0
- data/spec/elements/markup_compatibility_choice_spec.rb +22 -0
- data/spec/elements/markup_compatibility_fallback_spec.rb +11 -0
- data/spec/elements/section_properties_spec.rb +12 -0
- data/spec/elements/symbol_spec.rb +4 -7
- data/spec/elements/text_spec.rb +2 -2
- data/spec/elements/vml/group_spec.rb +542 -0
- data/spec/elements/vml/rectangle_spec.rb +739 -0
- data/spec/elements/vml/rounded_rectangle_spec.rb +656 -0
- data/spec/elements/vml_container_spec.rb +11 -0
- data/spec/elements/word_processing_drawing_anchor_spec.rb +40 -0
- data/spec/elements/word_processing_drawing_effect_extent_spec.rb +57 -0
- data/spec/elements/word_processing_drawing_extent_spec.rb +34 -0
- data/spec/elements/word_processing_drawing_nv_graphic_frame_properties_spec.rb +11 -0
- data/spec/elements/word_processing_drawing_object_nv_properties_spec.rb +67 -0
- data/spec/elements/word_processing_drawing_position_h_spec.rb +21 -0
- data/spec/elements/word_processing_drawing_position_v_spec.rb +21 -0
- data/spec/elements/word_processing_drawing_simple_position_spec.rb +34 -0
- data/spec/elements/word_processing_drawing_wrap_none_spec.rb +12 -0
- data/spec/elements/word_processing_shapes_body_properties_spec.rb +223 -0
- data/spec/elements/word_processing_shapes_shape_properties_spec.rb +21 -0
- data/spec/elements/word_processing_shapes_shape_spec.rb +23 -0
- data/spec/parts/footer_spec.rb +33 -0
- data/spec/parts/header_spec.rb +33 -0
- data/spec/properties/footer_reference_spec.rb +32 -0
- data/spec/properties/header_reference_spec.rb +32 -0
- data/spec/properties/page_numbering_spec.rb +1 -1
- data/spec/properties/{table_cell_fit_text.rb → table_cell_fit_text_spec.rb} +0 -0
- data/spec/properties/{table_cell_width.rb → table_cell_width_spec.rb} +0 -0
- data/spec/properties/table_layout_spec.rb +14 -12
- data/spec/properties/{table_row_height.rb → table_row_height_spec.rb} +0 -0
- data/spec/section_spec.rb +2 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/support/data/elements/grid_column_element.xml +1 -1
- data/spec/support/data/elements/table_grid_element.xml +1 -1
- data/spec/support/data/parts/document_with_children_part.xml +2 -1
- data/spec/support/data/parts/document_with_multiple_sections_part.xml +1 -1
- data/spec/support/data/parts/document_with_one_section_part.xml +1 -1
- data/spec/support/data/parts/empty_document_part.xml +1 -1
- data/spec/support/data/parts/empty_footer_part.xml +1 -0
- data/spec/support/data/parts/empty_header_part.xml +1 -0
- data/spec/support/data/parts/footer_with_children_part.xml +1 -0
- data/spec/support/data/parts/header_with_children_part.xml +1 -0
- data/spec/support/element_test_macros.rb +58 -9
- metadata +126 -9
- data/lib/openxml/docx/properties/tr_height.rb +0 -19
- 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,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,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
|
data/lib/openxml/docx/package.rb
CHANGED
|
@@ -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
|
-
:
|
|
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 =
|
|
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(
|
|
14
|
-
xml.parent.namespace =
|
|
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 =
|
|
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
|