write_xlsx 1.02.0 → 1.04.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Changes +22 -0
  3. data/README.md +1 -1
  4. data/examples/chart_line.rb +85 -10
  5. data/examples/tables.rb +77 -42
  6. data/lib/write_xlsx/chart/line.rb +15 -1
  7. data/lib/write_xlsx/format.rb +5 -5
  8. data/lib/write_xlsx/package/comments.rb +4 -4
  9. data/lib/write_xlsx/package/relationships.rb +2 -2
  10. data/lib/write_xlsx/package/styles.rb +26 -8
  11. data/lib/write_xlsx/package/table.rb +8 -7
  12. data/lib/write_xlsx/package/vml.rb +20 -19
  13. data/lib/write_xlsx/sheets.rb +12 -20
  14. data/lib/write_xlsx/version.rb +1 -1
  15. data/lib/write_xlsx/workbook.rb +53 -35
  16. data/lib/write_xlsx/worksheet.rb +37 -20
  17. data/test/perl_output/chart_line.xlsx +0 -0
  18. data/test/perl_output/comments2.xlsx +0 -0
  19. data/test/perl_output/tables.xlsx +0 -0
  20. data/test/regression/images/red2.png +0 -0
  21. data/test/regression/test_chart_line05.rb +43 -0
  22. data/test/regression/test_chart_line06.rb +43 -0
  23. data/test/regression/test_comment15.rb +28 -0
  24. data/test/regression/test_comment16.rb +34 -0
  25. data/test/regression/test_header_image15.rb +36 -0
  26. data/test/regression/test_header_image16.rb +42 -0
  27. data/test/regression/test_header_image17.rb +46 -0
  28. data/test/regression/test_header_image18.rb +48 -0
  29. data/test/regression/test_header_image19.rb +36 -0
  30. data/test/regression/test_hyperlink48.rb +31 -0
  31. data/test/regression/test_hyperlink49.rb +29 -0
  32. data/test/regression/test_image45.rb +2 -1
  33. data/test/regression/test_image46.rb +1 -1
  34. data/test/regression/test_image48.rb +32 -0
  35. data/test/regression/test_image49.rb +38 -0
  36. data/test/regression/test_image50.rb +24 -0
  37. data/test/regression/test_image51.rb +30 -0
  38. data/test/regression/test_object_position12.rb +25 -0
  39. data/test/regression/test_object_position13.rb +25 -0
  40. data/test/regression/test_object_position14.rb +25 -0
  41. data/test/regression/test_object_position15.rb +29 -0
  42. data/test/regression/test_object_position16.rb +29 -0
  43. data/test/regression/test_object_position17.rb +29 -0
  44. data/test/regression/test_object_position18.rb +29 -0
  45. data/test/regression/test_object_position19.rb +29 -0
  46. data/test/regression/test_object_position20.rb +29 -0
  47. data/test/regression/test_table24.rb +27 -0
  48. data/test/regression/test_table25.rb +27 -0
  49. data/test/regression/xlsx_files/chart_line05.xlsx +0 -0
  50. data/test/regression/xlsx_files/chart_line06.xlsx +0 -0
  51. data/test/regression/xlsx_files/comment15.xlsx +0 -0
  52. data/test/regression/xlsx_files/comment16.xlsx +0 -0
  53. data/test/regression/xlsx_files/header_image15.xlsx +0 -0
  54. data/test/regression/xlsx_files/header_image16.xlsx +0 -0
  55. data/test/regression/xlsx_files/header_image17.xlsx +0 -0
  56. data/test/regression/xlsx_files/header_image18.xlsx +0 -0
  57. data/test/regression/xlsx_files/header_image19.xlsx +0 -0
  58. data/test/regression/xlsx_files/hyperlink46.xlsx +0 -0
  59. data/test/regression/xlsx_files/image45.xlsx +0 -0
  60. data/test/regression/xlsx_files/image46.xlsx +0 -0
  61. data/test/regression/xlsx_files/image48.xlsx +0 -0
  62. data/test/regression/xlsx_files/image49.xlsx +0 -0
  63. data/test/regression/xlsx_files/image50.xlsx +0 -0
  64. data/test/regression/xlsx_files/image51.xlsx +0 -0
  65. data/test/regression/xlsx_files/object_position12.xlsx +0 -0
  66. data/test/regression/xlsx_files/object_position13.xlsx +0 -0
  67. data/test/regression/xlsx_files/object_position14.xlsx +0 -0
  68. data/test/regression/xlsx_files/object_position15.xlsx +0 -0
  69. data/test/regression/xlsx_files/object_position16.xlsx +0 -0
  70. data/test/regression/xlsx_files/object_position17.xlsx +0 -0
  71. data/test/regression/xlsx_files/object_position18.xlsx +0 -0
  72. data/test/regression/xlsx_files/object_position19.xlsx +0 -0
  73. data/test/regression/xlsx_files/object_position20.xlsx +0 -0
  74. data/test/regression/xlsx_files/table24.xlsx +0 -0
  75. data/test/regression/xlsx_files/table25.xlsx +0 -0
  76. data/test/test_example_match.rb +119 -9
  77. data/test/workbook/test_check_sheetname.rb +0 -10
  78. data/write_xlsx.gemspec +1 -0
  79. metadata +120 -2
@@ -398,13 +398,14 @@ def write_table_column(col_data)
398
398
  # Write the <tableStyleInfo> element.
399
399
  #
400
400
  def write_table_style_info
401
- attributes = [
402
- ['name', @style],
403
- ['showFirstColumn', @show_first_col],
404
- ['showLastColumn', @show_last_col],
405
- ['showRowStripes', @show_row_stripes],
406
- ['showColumnStripes', @show_col_stripes]
407
- ]
401
+ attributes = []
402
+ if @style && @style != '' && @style != 'None'
403
+ attributes << ['name', @style]
404
+ end
405
+ attributes << ['showFirstColumn', @show_first_col]
406
+ attributes << ['showLastColumn', @show_last_col]
407
+ attributes << ['showRowStripes', @show_row_stripes]
408
+ attributes << ['showColumnStripes', @show_col_stripes]
408
409
 
409
410
  @writer.empty_tag('tableStyleInfo', attributes)
410
411
  end
@@ -17,9 +17,9 @@ def set_xml_writer(filename)
17
17
  end
18
18
 
19
19
  def assemble_xml_file(
20
- data_id, vml_shape_id, comments_data,
21
- buttons_data, header_images_data = []
22
- )
20
+ data_id, vml_shape_id, comments_data,
21
+ buttons_data, header_images_data = []
22
+ )
23
23
  return unless @writer
24
24
 
25
25
  write_xml_namespace do
@@ -29,9 +29,9 @@ def assemble_xml_file(
29
29
  z_index = 1
30
30
  unless buttons_data.empty?
31
31
  vml_shape_id, z_index =
32
- write_shape_type_and_shape(
33
- buttons_data,
34
- vml_shape_id, z_index) do
32
+ write_shape_type_and_shape(
33
+ buttons_data,
34
+ vml_shape_id, z_index) do
35
35
  write_button_shapetype
36
36
  end
37
37
  end
@@ -277,6 +277,7 @@ def write_image_shape(id, index, image_data)
277
277
  position = image_data[3]
278
278
  x_dpi = image_data[4]
279
279
  y_dpi = image_data[5]
280
+ ref_id = image_data[6]
280
281
 
281
282
  # Scale the height/width by the resolution, relative to 72dpi.
282
283
  width = width * 72.0 / x_dpi
@@ -294,20 +295,20 @@ def write_image_shape(id, index, image_data)
294
295
  end
295
296
 
296
297
  style = [
297
- "position:absolute", "margin-left:0", "margin-top:0",
298
- "width:#{width}pt", "height:#{height}pt",
299
- "z-index:#{index}"
300
- ].join(';')
298
+ "position:absolute", "margin-left:0", "margin-top:0",
299
+ "width:#{width}pt", "height:#{height}pt",
300
+ "z-index:#{index}"
301
+ ].join(';')
301
302
  attributes = [
302
- ['id', position],
303
- ['o:spid', "_x0000_s#{id}"],
304
- ['type', type],
305
- ['style', style]
306
- ]
303
+ ['id', position],
304
+ ['o:spid', "_x0000_s#{id}"],
305
+ ['type', type],
306
+ ['style', style]
307
+ ]
307
308
 
308
309
  @writer.tag_elements('v:shape', attributes) do
309
310
  # Write the v:imagedata element.
310
- write_imagedata(index, name)
311
+ write_imagedata(ref_id, name)
311
312
 
312
313
  # Write the o:lock element.
313
314
  write_rotation_lock
@@ -319,9 +320,9 @@ def write_image_shape(id, index, image_data)
319
320
  #
320
321
  def write_imagedata(index, o_title)
321
322
  attributes = [
322
- ['o:relid', "rId#{index}"],
323
- ['o:title', o_title]
324
- ]
323
+ ['o:relid', "rId#{index}"],
324
+ ['o:title', o_title]
325
+ ]
325
326
 
326
327
  @writer.empty_tag('v:imagedata', attributes)
327
328
  end
@@ -67,18 +67,18 @@ def write_vml_files(package_dir)
67
67
  vml = Package::Vml.new
68
68
  vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
69
69
  vml.assemble_xml_file(
70
- sheet.vml_data_id, sheet.vml_shape_id,
71
- sheet.sorted_comments, sheet.buttons_data
72
- )
70
+ sheet.vml_data_id, sheet.vml_shape_id,
71
+ sheet.sorted_comments, sheet.buttons_data
72
+ )
73
73
  index += 1
74
74
  end
75
75
  if sheet.has_header_vml?
76
76
  vml = Package::Vml.new
77
77
  vml.set_xml_writer("#{dir}/vmlDrawing#{index}.vml")
78
78
  vml.assemble_xml_file(
79
- sheet.vml_header_id, sheet.vml_header_id * 1024,
80
- [], [], sheet.header_images_data
81
- )
79
+ sheet.vml_header_id, sheet.vml_header_id * 1024,
80
+ [], [], sheet.header_images_data
81
+ )
82
82
  write_vml_drawing_rels_files(package_dir, sheet, index)
83
83
  index += 1
84
84
  end
@@ -106,16 +106,12 @@ def write_table_files(package_dir)
106
106
  end
107
107
 
108
108
  def write_chartsheet_rels_files(package_dir)
109
- write_sheet_rels_files_base(chartsheets, "#{package_dir}/xl/chartsheets/_rels",
110
- 'sheet')
109
+ write_sheet_rels_files_base(
110
+ chartsheets, "#{package_dir}/xl/chartsheets/_rels", 'sheet'
111
+ )
111
112
  end
112
113
 
113
114
  def write_drawing_rels_files(package_dir)
114
- # write_rels_files_base(
115
- # self.reject { |sheet| sheet.drawing_links[0].empty? },
116
- # "#{package_dir}/xl/drawings/_rels",
117
-
118
- # )
119
115
  dir = "#{package_dir}/xl/drawings/_rels"
120
116
 
121
117
  index = 0
@@ -159,8 +155,9 @@ def write_vml_drawing_rels_files(package_dir, worksheet, index)
159
155
  end
160
156
 
161
157
  def write_worksheet_rels_files(package_dir)
162
- write_sheet_rels_files_base(worksheets, "#{package_dir}/xl/worksheets/_rels",
163
- 'sheet')
158
+ write_sheet_rels_files_base(
159
+ worksheets, "#{package_dir}/xl/worksheets/_rels", 'sheet'
160
+ )
164
161
  end
165
162
 
166
163
  def write_sheet_rels_files_base(sheets, dir, body)
@@ -235,11 +232,6 @@ def check_valid_sheetname(name)
235
232
  raise "Worksheet name #{name} cannot start or end with an "
236
233
  end
237
234
 
238
- # Check that sheetname isn't a reserved word.
239
- if name =~ /history/i
240
- raise "Worksheet name cannot be Excel reserved word 'History'"
241
- end
242
-
243
235
  # Check that the worksheet name doesn't already exist since this is a fatal
244
236
  # error in Excel 97. The check must also exclude case insensitive matches.
245
237
  unless is_sheetname_uniq?(name)
@@ -1 +1 @@
1
- WriteXLSX_VERSION = "1.02.0"
1
+ WriteXLSX_VERSION = "1.04.0"
@@ -132,6 +132,7 @@ def initialize(file, *option_params)
132
132
  @strings_to_urls = (options[:strings_to_urls].nil? || options[:strings_to_urls]) ? true : false
133
133
 
134
134
  @max_url_length = 2079
135
+ @has_comments = false
135
136
  if options[:max_url_length]
136
137
  @max_url_length = options[:max_url_length]
137
138
 
@@ -1115,7 +1116,8 @@ def style_properties
1115
1116
  @border_count,
1116
1117
  @fill_count,
1117
1118
  @custom_colors,
1118
- @dxf_formats
1119
+ @dxf_formats,
1120
+ @has_comments
1119
1121
  ]
1120
1122
  end
1121
1123
 
@@ -1711,11 +1713,14 @@ def prepare_vml_objects #:nodoc:
1711
1713
  if sheet.has_comments?
1712
1714
  comment_files += 1
1713
1715
  comment_id += 1
1716
+ @has_comments = true
1714
1717
  end
1715
1718
  vml_drawing_id += 1
1716
1719
 
1717
- sheet.prepare_vml_objects(vml_data_id, vml_shape_id,
1718
- vml_drawing_id, comment_id)
1720
+ sheet.prepare_vml_objects(
1721
+ vml_data_id, vml_shape_id,
1722
+ vml_drawing_id, comment_id
1723
+ )
1719
1724
 
1720
1725
  # Each VML file should start with a shape id incremented by 1024.
1721
1726
  vml_data_id += 1 * ( 1 + sheet.num_comments_block )
@@ -1738,8 +1743,6 @@ def prepare_vml_objects #:nodoc:
1738
1743
  end
1739
1744
  end
1740
1745
 
1741
- add_font_format_for_cell_comments if num_comment_files > 0
1742
-
1743
1746
  # Set the workbook vba_codename if one of the sheets has a button and
1744
1747
  # the workbook has a vbaProject binary.
1745
1748
  if has_button && @vba_project && !@vba_codename
@@ -1759,19 +1762,6 @@ def prepare_tables
1759
1762
  end
1760
1763
  end
1761
1764
 
1762
- def add_font_format_for_cell_comments
1763
- format = Format.new(
1764
- @formats,
1765
- :font => 'Tahoma',
1766
- :size => 8,
1767
- :color_indexed => 81,
1768
- :font_only => 1
1769
- )
1770
-
1771
- format.get_xf_index
1772
- @formats.formats << format
1773
- end
1774
-
1775
1765
  #
1776
1766
  # Add "cached" data to charts to provide the numCache and strCache data for
1777
1767
  # series and title/axis ranges.
@@ -1922,9 +1912,12 @@ def extract_named_ranges(defined_names) #:nodoc:
1922
1912
  # Iterate through the worksheets and set up any chart or image drawings.
1923
1913
  #
1924
1914
  def prepare_drawings #:nodoc:
1925
- chart_ref_id = 0
1926
- image_ref_id = 0
1927
- drawing_id = 0
1915
+ chart_ref_id = 0
1916
+ image_ref_id = 0
1917
+ drawing_id = 0
1918
+ ref_id = 0
1919
+ image_ids = {}
1920
+ header_image_ids = {}
1928
1921
  @worksheets.each do |sheet|
1929
1922
  chart_count = sheet.charts.size
1930
1923
  image_count = sheet.images.size
@@ -1944,9 +1937,19 @@ def prepare_drawings #:nodoc:
1944
1937
 
1945
1938
  # Prepare the worksheet images.
1946
1939
  sheet.images.each_with_index do |image, index|
1947
- type, width, height, name, x_dpi, y_dpi = get_image_properties(image[2])
1948
- image_ref_id += 1
1949
- sheet.prepare_image(index, image_ref_id, drawing_id, width, height, name, type, x_dpi, y_dpi)
1940
+ filename = image[2]
1941
+ type, width, height, name, x_dpi, y_dpi, md5 = get_image_properties(image[2])
1942
+ if image_ids[md5]
1943
+ ref_id = image_ids[md5]
1944
+ else
1945
+ image_ref_id += 1
1946
+ image_ids[md5] = ref_id = image_ref_id
1947
+ @images << [filename, type]
1948
+ end
1949
+ sheet.prepare_image(
1950
+ index, ref_id, drawing_id, width, height,
1951
+ name, type, x_dpi, y_dpi, md5
1952
+ )
1950
1953
  end
1951
1954
 
1952
1955
  # Prepare the worksheet charts.
@@ -1965,13 +1968,21 @@ def prepare_drawings #:nodoc:
1965
1968
  filename = sheet.header_images[index][0]
1966
1969
  position = sheet.header_images[index][1]
1967
1970
 
1968
- type, width, height, name, x_dpi, y_dpi =
1971
+ type, width, height, name, x_dpi, y_dpi, md5 =
1969
1972
  get_image_properties(filename)
1970
1973
 
1971
- image_ref_id += 1
1974
+ if header_image_ids[md5]
1975
+ ref_id = header_image_ids[md5]
1976
+ else
1977
+ image_ref_id += 1
1978
+ header_image_ids[md5] = ref_id = image_ref_id
1979
+ @images << [filename, type]
1980
+ end
1972
1981
 
1973
- sheet.prepare_header_image(image_ref_id, width, height,
1974
- name, type, position, x_dpi, y_dpi)
1982
+ sheet.prepare_header_image(
1983
+ ref_id, width, height, name, type,
1984
+ position, x_dpi, y_dpi, md5
1985
+ )
1975
1986
  end
1976
1987
 
1977
1988
  # Prepare the footer images.
@@ -1979,13 +1990,21 @@ def prepare_drawings #:nodoc:
1979
1990
  filename = sheet.footer_images[index][0]
1980
1991
  position = sheet.footer_images[index][1]
1981
1992
 
1982
- type, width, height, name, x_dpi, y_dpi =
1993
+ type, width, height, name, x_dpi, y_dpi, md5 =
1983
1994
  get_image_properties(filename)
1984
1995
 
1985
- image_ref_id += 1
1996
+ if header_image_ids[md5]
1997
+ ref_id = header_image_ids[md5]
1998
+ else
1999
+ image_ref_id += 1
2000
+ header_image_ids[md5] = ref_id = image_ref_id
2001
+ @images << [filename, type]
2002
+ end
1986
2003
 
1987
- sheet.prepare_header_image(image_ref_id, width, height,
1988
- name, type, position, x_dpi, y_dpi)
2004
+ sheet.prepare_header_image(
2005
+ ref_id, width, height, name, type,
2006
+ position, x_dpi, y_dpi, md5
2007
+ )
1989
2008
  end
1990
2009
 
1991
2010
  if has_drawings
@@ -2014,6 +2033,7 @@ def get_image_properties(filename)
2014
2033
 
2015
2034
  # Open the image file and import the data.
2016
2035
  data = File.binread(filename)
2036
+ md5 = Digest::MD5.hexdigest(data)
2017
2037
  if data.unpack('x A3')[0] == 'PNG'
2018
2038
  # Test for PNGs.
2019
2039
  type, width, height, x_dpi, y_dpi = process_png(data)
@@ -2031,13 +2051,11 @@ def get_image_properties(filename)
2031
2051
  raise "Unsupported image format for file: #{filename}\n"
2032
2052
  end
2033
2053
 
2034
- @images << [filename, type]
2035
-
2036
2054
  # Set a default dpi for images with 0 dpi.
2037
2055
  x_dpi = 96 if x_dpi == 0
2038
2056
  y_dpi = 96 if y_dpi == 0
2039
2057
 
2040
- [type, width, height, File.basename(filename), x_dpi, y_dpi]
2058
+ [type, width, height, File.basename(filename), x_dpi, y_dpi, md5]
2041
2059
  end
2042
2060
 
2043
2061
  #
@@ -359,6 +359,8 @@ def initialize(workbook, index, name) #:nodoc:
359
359
  @shape_hash = {}
360
360
  @drawing_rels = {}
361
361
  @drawing_rels_id = 0
362
+ @vml_drawing_rels = {}
363
+ @vml_drawing_rels_id = 0
362
364
  @header_images = []
363
365
  @footer_images = []
364
366
 
@@ -5868,27 +5870,24 @@ def position_object_pixels(col_start, row_start, x1, y1, width, height, anchor =
5868
5870
  y_abs += y1
5869
5871
 
5870
5872
  # Adjust start column for offsets that are greater than the col width.
5871
- if size_col(col_start) > 0
5872
- while x1 >= size_col(col_start)
5873
- x1 -= size_col(col_start)
5874
- col_start += 1
5875
- end
5873
+ while x1 >= size_col(col_start, anchor)
5874
+ x1 -= size_col(col_start)
5875
+ col_start += 1
5876
5876
  end
5877
5877
 
5878
5878
  # Adjust start row for offsets that are greater than the row height.
5879
- if size_row(row_start) > 0
5880
- while y1 >= size_row(row_start)
5881
- y1 -= size_row(row_start)
5882
- row_start += 1
5883
- end
5879
+ while y1 >= size_row(row_start, anchor)
5880
+ y1 -= size_row(row_start)
5881
+ row_start += 1
5884
5882
  end
5885
5883
 
5886
5884
  # Initialise end cell to the same as the start cell.
5887
5885
  col_end = col_start
5888
5886
  row_end = row_start
5889
5887
 
5890
- width += x1 if size_col(col_start) > 0
5891
- height += y1 if size_row(row_start) > 0
5888
+ # Only offset the image in the cell if the row/col isn't hidden.
5889
+ width += x1 if size_col(col_start, anchor) > 0
5890
+ height += y1 if size_row(row_start, anchor) > 0
5892
5891
 
5893
5892
  # Subtract the underlying cell widths to find the end cell of the object.
5894
5893
  while width >= size_col(col_end, anchor)
@@ -6100,6 +6099,18 @@ def drawing_rel_index(target = nil)
6100
6099
  end
6101
6100
  end
6102
6101
 
6102
+ #
6103
+ # Get the index used to address a vml_drawing rel link.
6104
+ #
6105
+ def get_vml_drawing_rel_index(target)
6106
+ if @vml_drawing_rels[target]
6107
+ @vml_drawing_rels[target]
6108
+ else
6109
+ @vml_drawing_rels_id += 1
6110
+ @vml_drawing_rels[target] = @vml_drawing_rels_id
6111
+ end
6112
+ end
6113
+
6103
6114
  def hyperlinks_count
6104
6115
  @hyperlinks.keys.inject(0) { |s, n| s += @hyperlinks[n].keys.size }
6105
6116
  end
@@ -6447,7 +6458,7 @@ def size_row(row, anchor = 0) #:nodoc:
6447
6458
  #
6448
6459
  # Set up image/drawings.
6449
6460
  #
6450
- def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96) #:nodoc:
6461
+ def prepare_image(index, image_id, drawing_id, width, height, name, image_type, x_dpi = 96, y_dpi = 96, md5 = nil) #:nodoc:
6451
6462
  x_dpi ||= 96
6452
6463
  y_dpi ||= 96
6453
6464
  drawing_type = 2
@@ -6503,24 +6514,30 @@ def prepare_image(index, image_id, drawing_id, width, height, name, image_type,
6503
6514
  EOS
6504
6515
  end
6505
6516
 
6506
- if target
6517
+ if target && !@drawing_rels[url]
6507
6518
  @drawing_links << [rel_type, target, target_mode]
6508
6519
  end
6509
- drawing.url_rel_index = drawing_rel_index
6520
+ drawing.url_rel_index = drawing_rel_index(url)
6510
6521
  end
6511
6522
 
6512
- drawing.rel_index = drawing_rel_index
6513
- @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
6523
+ if !@drawing_rels[md5]
6524
+ @drawing_links << ['/image', "../media/image#{image_id}.#{image_type}"]
6525
+ end
6526
+ drawing.rel_index = drawing_rel_index(md5)
6514
6527
  end
6515
6528
  public :prepare_image
6516
6529
 
6517
- def prepare_header_image(image_id, width, height, name, image_type, position, x_dpi, y_dpi)
6530
+ def prepare_header_image(image_id, width, height, name, image_type, position, x_dpi, y_dpi, md5)
6518
6531
  # Strip the extension from the filename.
6519
6532
  body = name.dup
6520
6533
  body[/\.[^\.]+$/, 0] = ''
6521
6534
 
6522
- @header_images_array << [width, height, body, position, x_dpi, y_dpi]
6523
- @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}" ]
6535
+ if !@vml_drawing_rels[md5]
6536
+ @vml_drawing_links << ['/image', "../media/image#{image_id}.#{image_type}" ]
6537
+ end
6538
+
6539
+ ref_id = get_vml_drawing_rel_index(md5)
6540
+ @header_images_array << [width, height, body, position, x_dpi, y_dpi, ref_id]
6524
6541
  end
6525
6542
  public :prepare_header_image
6526
6543