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:
signature.asc
Description: Digital signature

