[Libreoffice-commits] mso-dumper.git: emf-dump.py Makefile msodumper/emfrecord.py msodumper/wmfrecord.py

Miklos Vajna vmiklos at collabora.co.uk
Thu Apr 10 09:22:39 PDT 2014


 Makefile               |    1 
 emf-dump.py            |   35 +++++++++++++++
 msodumper/emfrecord.py |  108 +++++++++++++++++++++++++++++++++++++++++++++++++
 msodumper/wmfrecord.py |   53 ++++++++++++++++++++++++
 4 files changed, 197 insertions(+)

New commits:
commit 60006fe4c41c866dbaeeb43c4b3c0d23c9149707
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Apr 10 18:19:59 2014 +0200

    Initial EMF dumper
    
    It dumps the header record, but really nothing more yet.

diff --git a/Makefile b/Makefile
index a87ad52..1aa9120 100644
--- a/Makefile
+++ b/Makefile
@@ -1,3 +1,4 @@
 check:
 	cd test/doc && ./test.py
 	pep8 --ignore=E501 doc-dump.py msodumper/doc{dirstream,record,sprm,stream}.py test/doc/test.py
+	pep8 --ignore=E501 emf-dump.py msodumper/{emf,wmf}record.py
diff --git a/emf-dump.py b/emf-dump.py
new file mode 100755
index 0000000..1023a9f
--- /dev/null
+++ b/emf-dump.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python2
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+import sys
+sys = reload(sys)
+sys.setdefaultencoding("utf-8")
+
+from msodumper import emfrecord
+
+
+class EMFDumper:
+    def __init__(self, filepath):
+        self.filepath = filepath
+
+    def dump(self):
+        file = open(self.filepath, 'rb')
+        strm = emfrecord.EMFStream(file.read())
+        file.close()
+        print '<?xml version="1.0"?>'
+        strm.dump()
+
+
+def main(args):
+    exname, args = args[0], args[1:]
+    dumper = EMFDumper(args[0])
+    dumper.dump()
+
+if __name__ == '__main__':
+    main(sys.argv)
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/msodumper/emfrecord.py b/msodumper/emfrecord.py
new file mode 100644
index 0000000..df5d9cc
--- /dev/null
+++ b/msodumper/emfrecord.py
@@ -0,0 +1,108 @@
+#!/usr/bin/env python2
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from docdirstream import DOCDirStream
+import wmfrecord
+
+# The FormatSignature enumeration defines valuesembedded data in EMF records.
+FormatSignature = {
+    0x464D4520: "ENHMETA_SIGNATURE",
+    0x46535045: "EPS_SIGNATURE"
+}
+
+
+class EMFStream(DOCDirStream):
+    def __init__(self, bytes):
+        DOCDirStream.__init__(self, bytes)
+
+    def dump(self):
+        print '<stream type="EMF" size="%d">' % self.size
+        EmrHeader(self).dump()
+        print '</stream>'
+
+
+class EMFRecord(DOCDirStream):
+    def __init__(self, parent):
+        DOCDirStream.__init__(self, parent.bytes)
+        self.parent = parent
+        self.pos = parent.pos
+
+
+class EmrHeader(EMFRecord):
+    """The EMR_HEADER record types define the starting points of EMF metafiles."""
+    def __init__(self, parent):
+        EMFRecord.__init__(self, parent)
+
+    def dump(self):
+        print '<emrHeader>'
+        self.printAndSet("Type", self.readuInt32())
+        self.printAndSet("Size", self.readuInt32(), hexdump=False)
+        Header(self).dump()
+        if self.Size >= 100:
+            HeaderExtension1(self).dump()
+        if self.Size >= 108:
+            HeaderExtension2(self).dump()
+        print '</emrHeader>'
+
+
+class Header(EMFRecord):
+    """The Header object defines the EMF metafile header."""
+    def __init__(self, parent):
+        EMFRecord.__init__(self, parent)
+
+    def dump(self):
+        posOrig = self.pos
+        print("<header>")
+        wmfrecord.RectL(self, "Bounds").dump()
+        wmfrecord.RectL(self, "Frame").dump()
+        self.printAndSet("RecordSignature", self.readuInt32(), dict=FormatSignature)
+        self.printAndSet("Version", self.readuInt32())
+        self.printAndSet("Bytes", self.readuInt32(), hexdump=False)
+        self.printAndSet("Records", self.readuInt32(), hexdump=False)
+        self.printAndSet("Handles", self.readuInt16(), hexdump=False)
+        self.printAndSet("Reserved", self.readuInt16(), hexdump=False)
+        self.printAndSet("nDescription", self.readuInt32(), hexdump=False)
+        self.printAndSet("offDescription", self.readuInt32(), hexdump=False)
+        self.printAndSet("nPalEntries", self.readuInt32(), hexdump=False)
+        wmfrecord.SizeL(self, "Device").dump()
+        wmfrecord.SizeL(self, "Millimeters").dump()
+        print("</header>")
+        assert posOrig == self.pos - 80
+        self.parent.pos = self.pos
+
+
+class HeaderExtension1(EMFRecord):
+    """The HeaderExtension1 object defines the first extension to the EMF metafile header."""
+    def __init__(self, parent):
+        EMFRecord.__init__(self, parent)
+
+    def dump(self):
+        posOrig = self.pos
+        print("<headerExtension1>")
+        self.printAndSet("cbPixelFormat", self.readuInt32(), hexdump=False)
+        self.printAndSet("offPixelFormat", self.readuInt32(), hexdump=False)
+        self.printAndSet("bOpenGL", self.readuInt32())
+        print("</headerExtension1>")
+        assert posOrig == self.pos - 12
+        self.parent.pos = self.pos
+
+
+class HeaderExtension2(EMFRecord):
+    """The HeaderExtension1 object defines the first extension to the EMF metafile header."""
+    def __init__(self, parent):
+        EMFRecord.__init__(self, parent)
+
+    def dump(self):
+        posOrig = self.pos
+        print("<headerExtension2>")
+        self.printAndSet("MicrometersX", self.readuInt32(), hexdump=False)
+        self.printAndSet("MicrometersY", self.readuInt32(), hexdump=False)
+        print("</headerExtension2>")
+        assert posOrig == self.pos - 8
+        self.parent.pos = self.pos
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:
diff --git a/msodumper/wmfrecord.py b/msodumper/wmfrecord.py
new file mode 100644
index 0000000..cd64e7f
--- /dev/null
+++ b/msodumper/wmfrecord.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python2
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from docdirstream import DOCDirStream
+
+
+class WMFRecord(DOCDirStream):
+    def __init__(self, parent):
+        DOCDirStream.__init__(self, parent.bytes)
+        self.parent = parent
+        self.pos = parent.pos
+
+
+class RectL(WMFRecord):
+    """The RectL Object defines a rectangle."""
+    def __init__(self, parent, name=None):
+        WMFRecord.__init__(self, parent)
+        if name:
+            self.name = name
+        else:
+            self.name = "rectL"
+
+    def dump(self):
+        print '<%s type="RectL">' % self.name
+        self.printAndSet("Left", self.readInt32(), hexdump=False)
+        self.printAndSet("Top", self.readInt32(), hexdump=False)
+        self.printAndSet("Right", self.readInt32(), hexdump=False)
+        self.printAndSet("Bottom", self.readInt32(), hexdump=False)
+        print '</%s>' % self.name
+        self.parent.pos = self.pos
+
+
+class SizeL(WMFRecord):
+    """The SizeL Object defines a rectangle."""
+    def __init__(self, parent, name=None):
+        WMFRecord.__init__(self, parent)
+        if name:
+            self.name = name
+        else:
+            self.name = "sizeL"
+
+    def dump(self):
+        print '<%s type="SizeL">' % self.name
+        self.printAndSet("cx", self.readuInt32(), hexdump=False)
+        self.printAndSet("cy", self.readuInt32(), hexdump=False)
+        print '</%s>' % self.name
+        self.parent.pos = self.pos
+
+# vim:set filetype=python shiftwidth=4 softtabstop=4 expandtab:


More information about the Libreoffice-commits mailing list