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