On Sun, Jun 29, 2008 at 02:26:52PM +1000, Trent W. Buck wrote:
> > According to the OpenDocument spec, fo:page-height and fo:page-width are
> > indeed optional [15.2.1].  When a document without a paper size is
> > opened in OpenOffice.org, it seems to infer it from the locale settings
> > (de_AT generates A4-sized documents while C gives Letter).
> 
> Can this be overridden with PAPERSIZE (i.e. oo.org honours PAPERSIZE)
> when the template doesn't specify fo:paper- values?
> e.g. env PAPERSIZE=A4 LC_ALL=C oowriter foo.odt

No, neither does it honor /etc/papersize.

Dave, could you have a look at the attached patch?  It changes
odtwriter/__init__.py to use the output of “paperconf -s” and adds
tools/prepstyles.py which removes fo:* attributes (including page-width
and page-height) from OOo files.  So, tools/prepstyles.py can be used to
obtain a page-size-free styles.odt after changing it with
OpenOffice.org, for example.  The patch works fine here.

Cheers,
-- 
Michael Schutte <[EMAIL PROTECTED]>
diff --git a/odtwriter/__init__.py b/odtwriter/__init__.py
index a031c58..d2c24ab 100644
--- a/odtwriter/__init__.py
+++ b/odtwriter/__init__.py
@@ -737,7 +737,7 @@ class Writer(writers.Writer):
             zfile.close()
         else:
             raise RuntimeError, 'stylesheet path must be ' + self.EXTENSION + ' or .xml file.'
-        s1 = self.visitor.add_header_footer(s1)
+        s1 = self.visitor.setup_page(s1)
         return s1
 
     def assemble_parts(self):
@@ -994,18 +994,45 @@ class ODFTranslator(nodes.GenericNodeVisitor):
     def generate_content_element(self, root):
         return SubElement(root, 'office:text')
 
-    def add_header_footer(self, content):
-        if len(self.header_content) <= 0 and len(self.footer_content) <= 0:
-            return content
+    def setup_page(self, content):
         root_el = etree.fromstring(content)
+        self.setup_paper(root_el)
+        if len(self.header_content) > 0 or len(self.footer_content) > 0:
+            self.add_header_footer(root_el)
+        new_content = etree.tostring(root_el)
+        return new_content
+
+    def setup_paper(self, root_el):
+        try:
+            fin = os.popen("paperconf -s")
+            w, h = map(float, fin.read().split())
+            fin.close()
+        except:
+            w, h = 612, 792     # default to Letter
+        def walk(el):
+            if el.tag == "{%s}page-layout-properties" % SNSD["style"] and \
+		    not el.attrib.has_key("{%s}page-width" % SNSD["fo"]):
+                el.attrib["{%s}page-width" % SNSD["fo"]] = "%.3fpt" % w
+                el.attrib["{%s}page-height" % SNSD["fo"]] = "%.3fpt" % h
+                el.attrib["{%s}margin-left" % SNSD["fo"]] = \
+                        el.attrib["{%s}margin-right" % SNSD["fo"]] = \
+                        "%.3fpt" % (.1 * w)
+                el.attrib["{%s}margin-top" % SNSD["fo"]] = \
+                        el.attrib["{%s}margin-bottom" % SNSD["fo"]] = \
+                        "%.3fpt" % (.1 * h)
+            else:
+                for subel in el.getchildren(): walk(subel)
+        walk(root_el)
+
+    def add_header_footer(self, root_el):
         path = '{%s}master-styles' % (NAME_SPACE_1, )
         master_el = root_el.find(path)
         if master_el is None:
-            return content
+            return
         path = '{%s}master-page' % (SNSD['style'], )
         master_el = master_el.find(path)
         if master_el is None:
-            return content
+            return
         el1 = master_el
         if len(self.header_content) > 0:
             if WhichElementTree == 'lxml':
@@ -1033,8 +1060,6 @@ class ODFTranslator(nodes.GenericNodeVisitor):
                 el2.append(el)
         #new_tree = etree.ElementTree(root_el)
         #new_content = ToString(new_tree)
-        new_content = etree.tostring(root_el)
-        return new_content
 
     def astext(self):
         root = self.content_tree.getroot()
diff --git a/tools/prepstyles.py b/tools/prepstyles.py
new file mode 100755
index 0000000..4a10bf9
--- /dev/null
+++ b/tools/prepstyles.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python
+#
+# Fix a word-processor-generated styles.odt for odtwriter use: Drop page size
+# specifications from styles.xml.
+#
+# Author: Michael Schutte <[EMAIL PROTECTED]>
+
+from lxml import etree
+import sys
+import zipfile
+from tempfile import mkstemp
+import shutil
+import os
+
+NAMESPACES = {
+    "style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
+    "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
+}
+
+if len(sys.argv) != 2:
+    print >> sys.stderr, "Usage: %s FILE" % sys.argv[0]
+    sys.exit(1)
+
+zin = zipfile.ZipFile(sys.argv[1])
+styles = zin.read("styles.xml")
+
+root = etree.fromstring(styles)
+for el in root.xpath("//style:page-layout-properties", namespaces = NAMESPACES):
+    for attr in el.attrib:
+        if attr.startswith("{%s}" % NAMESPACES["fo"]):
+            del el.attrib[attr]
+
+tempname = mkstemp()
+zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w", zipfile.ZIP_DEFLATED)
+
+for item in zin.infolist():
+    if item.filename == "styles.xml":
+        zout.writestr(item, etree.tostring(root))
+    else:
+        zout.writestr(item, zin.read(item.filename))
+
+zout.close()
+zin.close()
+shutil.move(tempname[1], sys.argv[1])
+
+# vim:tw=78:sw=4:sts=4:et:

Attachment: signature.asc
Description: Digital signature

Reply via email to