From 00b52c28ef0e761ce139b2ba27d572ba24f5e4c0 Mon Sep 17 00:00:00 2001 From: Emanuele Ruffaldi Date: Sat, 8 Aug 2015 02:07:58 +0200 Subject: [PATCH 1/3] added emf support --- docx/image/__init__.py | 2 ++ docx/image/constants.py | 1 + docx/image/image.py | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docx/image/__init__.py b/docx/image/__init__.py index 8ab3ada68..c241024fa 100644 --- a/docx/image/__init__.py +++ b/docx/image/__init__.py @@ -14,6 +14,7 @@ from docx.image.jpeg import Exif, Jfif from docx.image.png import Png from docx.image.tiff import Tiff +from docx.image.emf import Emf SIGNATURES = ( @@ -26,4 +27,5 @@ (Tiff, 0, b'MM\x00*'), # big-endian (Motorola) TIFF (Tiff, 0, b'II*\x00'), # little-endian (Intel) TIFF (Bmp, 0, b'BM'), + (Emf, 40, b' EMF') ) diff --git a/docx/image/constants.py b/docx/image/constants.py index 90b469705..93fbc0f19 100644 --- a/docx/image/constants.py +++ b/docx/image/constants.py @@ -102,6 +102,7 @@ class MIME_TYPE(object): JPEG = 'image/jpeg' PNG = 'image/png' TIFF = 'image/tiff' + EMF = 'image/emf' class PNG_CHUNK_TYPE(object): diff --git a/docx/image/image.py b/docx/image/image.py index ba2158e72..3df31672f 100644 --- a/docx/image/image.py +++ b/docx/image/image.py @@ -188,7 +188,7 @@ def _ImageHeaderFactory(stream): def read_32(stream): stream.seek(0) - return stream.read(32) + return stream.read(64) header = read_32(stream) for cls, offset, signature_bytes in SIGNATURES: From 62026a11ce7d43e49650a767826032cd5bd5ccbc Mon Sep 17 00:00:00 2001 From: Emanuele Ruffaldi Date: Sat, 8 Aug 2015 02:11:09 +0200 Subject: [PATCH 2/3] added sample script --- samples/testaddemf.emf | Bin 0 -> 42404 bytes samples/testaddemf.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100755 samples/testaddemf.emf create mode 100644 samples/testaddemf.py diff --git a/samples/testaddemf.emf b/samples/testaddemf.emf new file mode 100755 index 0000000000000000000000000000000000000000..2d0958cc91c0ef8e82e780d6ab1c1b7294e63e35 GIT binary patch literal 42404 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' % + nsdecls('w')) + fldSimple = parse_xml(fld_xml) # this goes AFTER the field (!) + #p.addnext(fldSimple) + paragraph.add_run(" " + caption) + + +document = Document() + +docx_addpicture(document,"testaddemf.emf", width_mm=100,caption="Groups Implementation") + +document.save("testaddemf.docx") \ No newline at end of file From 482b791b429221f295aea34235cdc09d89cbacd6 Mon Sep 17 00:00:00 2001 From: Emanuele Ruffaldi Date: Sat, 8 Aug 2015 02:12:30 +0200 Subject: [PATCH 3/3] added missing emf.py file --- docx/image/emf.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docx/image/emf.py diff --git a/docx/image/emf.py b/docx/image/emf.py new file mode 100644 index 000000000..f0a4fe705 --- /dev/null +++ b/docx/image/emf.py @@ -0,0 +1,70 @@ +# encoding: utf-8 + +from __future__ import absolute_import, division, print_function + +from .constants import MIME_TYPE +from .exceptions import InvalidImageStreamError +from .helpers import BIG_ENDIAN, StreamReader +from .image import BaseImageHeader +import struct + +class Emf(BaseImageHeader): + """ + Image header parser for PNG images + """ + @property + def content_type(self): + """ + MIME content type for this image, unconditionally `image/png` for + PNG images. + """ + return MIME_TYPE.EMF + + @property + def default_ext(self): + """ + Default filename extension, always 'png' for PNG images. + """ + return 'emf' + + @classmethod + def from_stream(cls, stream,filename=None): + """ + Return a |Emf| instance having header properties parsed from image in + *stream*. + """ + + """ + @0 DWORD iType; // fixed + @4 DWORD nSize; // var + @8 RECTL rclBounds; + @24 RECTL rclFrame; // .01 millimeter units L T R B + @40 DWORD dSignature; // ENHMETA_SIGNATURE = 0x464D4520 + DWORD nVersion; + DWORD nBytes; + DWORD nRecords; + WORD nHandles; + WORD sReserved; + DWORD nDescription; + DWORD offDescription; + DWORD nPalEntries; + SIZEL szlDevice; + SIZEL szlMillimeters; + """ + stream.seek(0) + x = stream.read(40) + stream.seek(0) + iType,nSize = struct.unpack("ii",x[0:8]) + rclBounds = struct.unpack("iiii",x[8:24]) + rclFrame = struct.unpack("iiii",x[24:40]) + + dpi = 300 + horz_dpi = dpi + vert_dpi = dpi + mmwidth = (rclFrame[2]-rclFrame[0])/100.0 + mmheight = (rclFrame[3]-rclFrame[1])/100.0 + px_width = int(mmwidth*dpi*0.03937008) + px_height = int(mmheight*dpi*0.03937008) + + #1 dot/inch = 0.03937008 pixel/millimeter + return cls(px_width,px_height,horz_dpi,vert_dpi)