跳转到主要内容

OOoPy:使用Python修改OpenOffice.org文档

项目描述

作者:

Ralf Schlatterbeck <rsc@runtux.com>

OpenOffice.org (OOo) 文档是包含多个XML文件的ZIP存档。因此,可以轻松检查、创建或修改OOo文档。OOoPy是一个用于这些任务的Python库。为了不重复造轮子,OOoPy使用现有的XML库,即Fredrik Lundh的ElementTree(这个库已经在Python标准库中存在一段时间了)。OOoPy是ElementTree的一个薄包装器,使用Python的ZipFile来读取和写入OOo文档。

除了是ElementTree的包装器之外,OOoPy还包含一个用于将XML转换应用于OOo文档的框架。存在一些用于OOo文档的转换,例如,用于更改OOo字段(OOo插入字段菜单)或使用OOo字段进行邮件合并应用程序。还有一些用于修改OOo设置和元信息的其他转换示例。

这种应用程序在无法调用本地OOo的情况下很有用,例如,在服务器端Web应用程序中。

如果邮件合并转换对您的文档不起作用:OOo 格式有良好的文档记录,但 OOo 文档的主体中存在顺序约束。我还没有弄清楚 OOo 主体中所有标签及其顺序。OOo 文档中的各个元素(例如框架、部分、表格)需要有自己的唯一名称。邮件合并后,某些项目的名称会重复。到目前为止,我只为框架、部分和表格重新编号。请参阅 ooopy/Transforms.py 末尾的重新编号对象。所以如果您遇到邮件合并文档缺失的部分,请检查是否有缺失的重新编号,或者发送给我一个 错误报告

目前除了 OOoPy.py 和 Transformer.py 中的 Python doctest 以及命令行 工具 之外,没有多少文档。在安装 ooopy(假设您使用 python 安装到 /usr/local)后运行这些测试。

cd /usr/local/share/ooopy
python run_doctest.py /usr/local/lib/python2.X/site-packages/ooopy/Transformer.py
python run_doctest.py /usr/local/lib/python2.X/site-packages/ooopy/OOoPy.py

两者都应报告没有失败的测试。

使用方法

在支持 OOo 2.0 中引入的开放文档格式时,API 有一点点变化。如果您从旧版本升级时得到堆栈跟踪,请参阅下面的内容。

请参阅在线文档,例如

% python
>>> from ooopy.OOoPy import OOoPy
>>> help (OOoPy)
>>> from ooopy.Transformer import Transformer
>>> help (Transformer)

帮助,我在 Transformer 中得到了 AssertionError 堆栈跟踪,例如

Traceback (most recent call last):
  File "./replace.py", line 17, in ?
    t = Transformer(Field_Replace(replace = replace_dictionary))
  File "/usr/local/lib/python2.4/site-packages/ooopy/Transformer.py", line 1226, in __init__
    assert (mimetype in mimetypes)
AssertionError

在实现处理不同版本的 OOo 文件时,API 有所改变。现在您传递给 Transformer 构造函数的第一个参数是要转换的 OpenOffice.org 文档的 mimetype。mimetype 可以从另一个打开的 OOo 文档中获取,例如

ooo = OOoPy (infile = 'test.odt', outfile = 'test_out.odt')
t = Transformer(ooo.mimetype, ...

命令行工具的使用

现在有一些命令行 工具

  • ooo_cat 用于将多个 OOo 文件合并为一个文件

  • ooo_grep 用于在 OOo 文件上执行类似 grep -l 的操作——仅在类 Unix 操作系统上运行,可能只与 GNU 版本的 grep 一起使用(它是一个使用 ooo_as_text 的 shell 脚本)。注意,grep 的 -l 选项仅打印匹配的文件名。

  • ooo_fieldreplace 用于替换 OOo 文档中的字段

  • ooo_mailmerge 用于从模板 OOo 文档和 CSV(逗号分隔值)输入中进行邮件合并

  • ooo_as_text 用于从 OOo 文件中获取文本(例如,用于对输出进行“grep”)。

  • ooo_prettyxml 用于美化打印 OOo 文档中某个 XML 文件中的 XML 节点。主要用于调试。

所有工具都接受 --help 选项。

资源

Sourceforge 主页 获取项目信息和下载

您需要至少 Python 2.7 版本。现在也测试了 3.5,也可能与后续版本兼容。

有关 OOo XML 文件格式的文档,请参阅 J. David Eisenberg 所著的书籍《OASIS OpenDocument Essentials》,该书籍位于 Gnu Free Documentation License 下,并且也可以 印刷。对于参考文档,您可能希望查看 OpenOffice.org 的《XML 文件格式规范》(PDF)。

runtux.com 上存在一个 OOoPy 的德语页面

报告错误

请使用 Sourceforge 错误跟踪器

  • 附加一个可以重现您问题的 OOo 文档

  • 简要描述您认为的正确行为

  • 描述观察到的行为

  • 告诉我您确切做了什么。

更改

版本 2.0:迁移到 Python3

仍在使用较低的Python版本进行工作,但我只能测试到2.7版本,没有更早的版本。修复了有时多个Set_Attribute转换(例如在连接OO文档时)会应用到相同的标签/属性组合的bug。还修复了在连接文档时计算默认制表符的bug。

版本1.11:小bug修复 ooo_mailmerge

现在 ooo_mailmerge 使用分隔符选项,之前被忽略了。感谢 Bob Danek 的报告和测试。

  • 修复 ooo_mailmerge 中设置 CSV 分隔符的bug

版本1.10:修复连接时的表格样式问题

现在 ooo_cat 在连接(重命名)时修复表格样式:我们通过重用现有样式来优化样式使用。但对于某些表格样式,原始名称没有重命名为重用的名称。修复了 SF Bug 10,感谢 Claudio Girlanda 的报告。

  • 修复连接文档时表格样式的重命名问题

  • 添加一些缺失的命名空间(ooo 2009)

版本1.9:添加连接的图片处理

现在 ooo_cat 支持图片,感谢 Antonio Sánchez 报告这个问题没有工作。

  • 将文件名和内容列表添加到 Transformer

  • 更新连接中的文件列表

  • 添加 Manifest_Append 转换以更新添加的文件名的 META-INF/manifest.xml

  • 在 OOoPy 中添加添加文件的钩子

  • 更新测试

  • 更新 ooo_cat 以使用新的转换

  • 这是从 Subversion 迁移到 GIT 后的第一个版本发布

版本1.8:小的bug修复

分发一个在 doctest 中使用的缺失文件。修复目录结构。感谢 Michael Nagel 提出更改并报告bug。

  • 文件 testenum.odt 缺失在 MANIFEST.in 中

  • 现在所有 OOo 文件和测试所需的其它文件都位于子目录 testfiles 中。

  • 现在所有命令行工具都在子目录 bin 中。

版本1.7:添加小功能

向 ooo_as_text 添加 –newlines 选项:使用此选项,办公文档中的段落在文本输出中保持不变。修复 python2.7 中的断言错误,感谢 Hans-Peter Jansen 的报告。为 python2.7 与 2.6 的几个其他小修复。

  • 向 ooo_as_text 添加 –newlines 选项

  • 修复 Hans-Peter Jansen 报告的 python2.7 断言错误

  • 修复 python2.7 中的几个弃用警告

  • 从回归测试中删除 zip 压缩大小:python2.7 中的压缩器比 python2.6 中的好

版本1.6:小的bug修复

修复压缩:在写入新 XML 文件时,这些文件会被存储而不是压缩在 OOo zip 文件中,从而导致文档很大。感谢 Hans-Peter Jansen 的补丁。在命令行工具中添加版权声明(SF Bug 2650042)。修复 OOo 3.X 列表的 mailmerge(SF Bug 2949643)。

  • 修复压缩标志,Hans-Peter Jansen 的补丁

  • 添加回归测试以检查压缩

  • 现在发布 ooo_prettyxml – 我已经用它来测试了一段时间,可能对其他人也有用

  • 在命令行工具中添加版权(LGPL)声明,修复 SF Bug 2650042

  • OOo 3.X 向列表添加 xml:id 标签,我们现在在 mailmerge 应用程序中重新编号这些标签,修复 SF Bug 2949643

版本1.5:小的功能增强

添加 ooo_grep 以在包含模式的 OOo 文件中搜索。感谢 Mathieu Chauvinc 报告修改 manifest.xml 的问题。支持 python2.6,感谢 Erik Myllymaki 的报告以及匿名贡献者确认的 bug。

  • 新的 shell 脚本 ooo_grep(与 grep -l 在 OOo 文件上的功能相同)

  • 在删除 OOoPy 对象时显式关闭它(使用 __del__)

  • 确保 mimetype 是结果存档中的第一个元素,OOo 对此似乎很挑剔。

  • 在修改清单时,生成的 .odt 文件无法用 OOo 打开。所以修改清单时,请确保清单命名空间名为“manifest”,而不是 ElementTree 自动生成的名称。我认为这是 OOo 中的一个缺陷,需要这个要求。现在使用 ElementTree 的 _namespace_map,并为所有命名空间使用与 OOo 相同的名称。现在 META-INF/manifest.xml 已列入可以应用转换的文件列表。

  • 在修改(或创建)存档成员时,我们将 OOo 存档创建为类似 DOS 系统(类型为 fat),并确保我们使用当前日期和时间(UTC)。这也解决了 Python ZipFile 更新版本中文件权限的问题。

  • 修复了 python2.6 的行为,即对象的 __init__ 可能不接受任何参数。修复了 SF Bug 2948617。

  • 最后——由于 OOoPy 在一些项目中已投入生产——将开发状态更改为“生产/稳定”。

版本 1.4:修复了少量错误。

修复 Doctest,希望能在 Windows 上运行。感谢 Dani Budinova 在 Windows 上彻底测试。

  • 在 doctest 中以“wb”模式打开输出文件,而不是“w”,以防止在 Windows 上创建损坏的 OOo 文档。

  • 在调用系统时使用双引号作为参数,单引号似乎在 Windows 上不起作用。

  • 在调用系统时不要使用重定向,使用 -i 选项代替输入文件。重定向在 Windows 上似乎是一个问题。

  • 显式调用 Python 解释器,直接运行脚本在 Windows 上不受支持。

版本 1.3:修复了少量错误。

回归测试失败,因为一些文件没有分发。修复了 SF Bugs 1970389 和 1972900。

  • 修复 MANIFEST.in,以包含回归测试(doctest)所需的所有文件。

版本 1.2:增强主要功能。

添加了 ooo_fieldreplace、ooo_cat、ooo_mailmerge 命令行工具。修复了 ooo_as_text,允许指定输出文件。注意,对于命令行工具,非可寻址输入/输出(管道)的处理(从 python2.5 开始)将仅工作。在合并文档时修复了少量错误。

  • 修复 _divide(用于将正文分成必须保持序列的部分)。如果一个部分为空,正文部分会改变序列。

  • 修复了没有段落(只有列表)元素的情况的处理。

  • 实现 ooo_cat。

  • 修复 ooo_as_text 以包括更多的命令行处理。

  • 修复了命令行工具的 stdin/stdout 的读取/写入,这将仅从 python2.5 开始可靠地工作(读取/写入非可寻址输入/输出,如管道)。

  • 实现了 ooo_fieldreplace 和 ooo_mailmerge。

版本 1.1:修复了少量错误。

小的文档更改。

  • 修复了 css 样式表。

  • 将首页链接到 SF 标志。

  • 更新了其他信息的链接。

  • 修复了文档中的版本号。

  • 添加了对新 API 的某些检查——现在检查 Transformer 的第一个参数。

  • 分发运行 doctest 所需的文件,并解释如何运行它。

  • 使用说明部分。

版本 1.0:增强主要功能。

现在与 OpenOffice.org 的 2.X 版本兼容。API 做了少量更改。

  • 已测试与 python 2.3、2.4、2.5 兼容。

  • OOoPy 现在适用于 OOo 的 1.X 和 2.X 版本。

  • 新属性 mimetype——在读取文档时自动设置,写入时也应设置。

  • renumber_all、get_meta、set_meta 现在是工厂函数,它们以 OpenOffice 文档的 mimetype 作为参数。

  • 由于 renumber_all 现在是函数,它将(正确地)为每个返回的 new Attribute_Access 实例重新启动编号。

  • 如果可用,将使用从 python2.5 开始的内置 elementtree 支持。

  • 修复了优化原始文档以进行连接时的错误。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码发行版

OOoPy-2.0.tar.gz (249.2 kB 查看哈希值)

上传时间 源代码

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面