OOoPy:使用Python修改OpenOffice.org文档
项目描述
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 支持。
修复了优化原始文档以进行连接时的错误。