# this file will be used later to enhance the msg conversion. # doesn't really work very well.... def wmf_getdimensions wmf_data # check if we have a placeable metafile if wmf_data.unpack('L')[0] == 0x9ac6cdd7 # do check sum test shorts = wmf_data.unpack 'S11' warn 'bad wmf header checksum' unless shorts.pop == shorts.inject(0) { |a, b| a ^ b } # determine dimensions left, top, right, bottom, twips_per_inch = wmf_data[6, 10].unpack 'S5' p [left, top, right, bottom, twips_per_inch] [right - left, bottom - top].map { |i| (i * 96.0 / twips_per_inch).round } else [nil, nil] end end =begin some attachment stuff rendering_position object_type attach_num attach_method rendering_position is around (1 << 32) - 1 if its inline attach_method 1 for plain data? attach_method 6 for embedded ole display_name instead of reading the embedded ole type. PR_RTF_IN_SYNC property is missing or set to FALSE. Before reading from the uncompressed RTF stream, sort the message's attachment table on the value of the PR_RENDERING_POSITION property. The attachments will now be in order by how they appear in the message. As your client scans through the RTF stream, check for the token "\objattph". The character following the token is the place to put the next attachment from the sorted table. Handle attachments that have set their PR_RENDERING_POSITION property to -1 separately. eg from rtf. \b\f2\fs20{\object\objemb{\*\objclass PBrush}\objw1320\objh1274{\*\objdata 01050000 <- looks like standard header 02000000 <- not sure 07000000 <- this means length of following is 7. 50427275736800 <- Pbrush\000 in hex 00000000 <- ? 00000000 <- ? e0570000 <- this is 22496. length of the following in hex this is the bitmap data, starting with BM.... 424dde57000000000000360000002800000058000000550000000100180000000000a857000000 000000000000000000000000000000c8d0d4c8d0d4c8d0d4c8d0d4c8d0d4c8d0d4c8d0d4c8d0d4 --------------- tested 3 different embedded files: 1. excel embedded - "\002OlePres000"[40..-1] can be saved to '.wmf' and opened. - "\002OlePres001" similarly. much better looking image. strange - For the rtf serialization, it has the file contents as an ole, "d0cf11e" serialization, which i can't do yet. this can be extracted as a working .xls followed by a METAFILEPICT chunk, correspoding to one of the ole pres chunks. then the very same metafile chunk in the result bit. 2. pbrush embedded image - "\002OlePres000" wmf as above. - "\001Ole10Native" is a long followed by a plain old .bmp - Serialization: Basic header as before, then bitmap data follows, then the metafile chunk follows, though labeled PBrush again this time. the result chunk was corrupted 3. metafile embedded image - no presentation section, just a - "CONTENTS" section, which can be saved directly as a wmf. different header to the other 2 metafiles. it starts with 9AC6CDD7, which is the Aldus placeable metafile header. (http://wvware.sourceforge.net/caolan/ora-wmf.html) you can decode the left, top, right, bottom, and then multiply by 96, and divide by the metafile unit converter thing to get pixel values. the above ones were always the plain metafiles word filetype (0 = memory, 1 = disk) word headersize (always 9) word version thus leading to the 0100 0900 0003 pattern i usually see. =end