rst2odt_prepstyles.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/Users/sasha/Desktop/sharix-open-webapp-base/venv/bin/python3
  2. # $Id: rst2odt_prepstyles.py 8932 2022-01-05 14:59:31Z milde $
  3. # Author: Dave Kuhlman <dkuhlman@rexx.com>
  4. # Copyright: This module has been placed in the public domain.
  5. """
  6. Fix a word-processor-generated styles.odt for odtwriter use: Drop page size
  7. specifications from styles.xml in STYLE_FILE.odt.
  8. """
  9. # Author: Michael Schutte <michi@uiae.at>
  10. from lxml import etree
  11. import sys
  12. import zipfile
  13. from tempfile import mkstemp
  14. import shutil
  15. import os
  16. NAMESPACES = {
  17. "style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
  18. "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
  19. }
  20. def prepstyle(filename):
  21. zin = zipfile.ZipFile(filename)
  22. styles = zin.read("styles.xml")
  23. root = etree.fromstring(styles)
  24. for el in root.xpath("//style:page-layout-properties",
  25. namespaces=NAMESPACES):
  26. for attr in el.attrib:
  27. if attr.startswith("{%s}" % NAMESPACES["fo"]):
  28. del el.attrib[attr]
  29. tempname = mkstemp()
  30. zout = zipfile.ZipFile(os.fdopen(tempname[0], "w"), "w",
  31. zipfile.ZIP_DEFLATED)
  32. for item in zin.infolist():
  33. if item.filename == "styles.xml":
  34. zout.writestr(item, etree.tostring(root))
  35. else:
  36. zout.writestr(item, zin.read(item.filename))
  37. zout.close()
  38. zin.close()
  39. shutil.move(tempname[1], filename)
  40. def main():
  41. args = sys.argv[1:]
  42. if len(args) != 1 or args[0] in ('-h', '--help'):
  43. print(__doc__, file=sys.stderr)
  44. print("Usage: %s STYLE_FILE.odt\n" % sys.argv[0], file=sys.stderr)
  45. sys.exit(1)
  46. filename = args[0]
  47. prepstyle(filename)
  48. if __name__ == '__main__':
  49. main()