我正在尝试以编程方式创建一个Open Office电子表格,但出于某种原因,仅使用所有必需文件压缩文件夹会使Open Office将文件标记为已损坏。
我是怎么做到这一点的?我开始在Open Office中创建一个普通的电子表格,其中包含一些值。保存后,我将扩展名更改为.zip并制作该文件夹的副本。然后我使用命令行zip压缩第二个文件夹,并将文件扩展名更改为.ods。尝试打开生成的文件时,我从Open Office收到一条错误消息,说文件已损坏。
Open Office是否使用特殊的压缩算法?执行“file test.ods”会将其显示为压缩zip,那么Open Office在压缩例程中添加了什么才能使其正常工作?
答案 0 :(得分:16)
这对我有用:
将原始文档文件(这是一个普通的zip文件)解压缩到某个目录:
$ mkdir document
$ cd document
$ unzip ../document.odt
修改未压缩的数据。
创建新的odt:
$ zip -0 -X ../document2.odt mimetype
$ zip -r ../document2.odt * -x mimetype
答案 1 :(得分:8)
OASIS OpenOffice Specification的第17节定义了如何打包OpenDocument包。
第17.4节MIME类型流如下所示:
如果是文档的MIME类型 使用包是现有的, 包裹 应该包含一个名为“mimetype”的流。这个流应该 包裹的第一流拉链 文件,绝不能压缩, 并且绝不能使用'额外的' 标题中的字段'(参见[ZIP])..
目的是允许打包文件 通过'魔术'来识别 数字'机制,如Unix的 文件/魔术工具。如果是ZIP文件 包含一个开头的流 未压缩的文件,并且具有 标题中没有额外的数据,那么 流名称和流内容可以 在固定的位置找到。更多 具体来说,人们会发现:
- 所有zip文件位置0的字符串'PK'
- 所有此类包文件的第30位的字符串'mimetype'
- 这种包装的第38位的mimetype本身。
答案 2 :(得分:6)
我尝试过tokland建议,但我已经证明LibreOffice 4需要特定的订单(仅适用于第一批订单?):
mimetype
(未压缩)meta.xml
settings.xml
content.xml
Thumbnails/thumbnail.png
Configurations2/images/Bitmaps/
Configurations2/popupmenu/
Configurations2/toolpanel/
Configurations2/statusbar/
Configurations2/progressbar/
Configurations2/toolbar/
Configurations2/menubar/
Configurations2/accelerator/current.xml
Configurations2/floater/
styles.xml
META-INF/manifest.xml
我创建了一个脚本来执行 folder2od.sh :
#!/bin/sh
# Convert folder (unzipped OpenDocument file) to OpenDocument file (odt, ods, etc.)
# Usage: ./folder2od.sh "path/to/folder" "file.odt"
cmdfolder=$(cd `dirname "$0"`; pwd -P)
folder=$(cd `dirname "$2"`; pwd -P)
file=$(basename "$2")
absfile="$folder/$file"
cd "$1"
zip -0 -X "$file" "mimetype"
list=$(cat <<'END_HEREDOC'
meta.xml
settings.xml
content.xml
Thumbnails/thumbnail.png
Configurations2/images/Bitmaps/
Configurations2/popupmenu/
Configurations2/toolpanel/
Configurations2/statusbar/
Configurations2/progressbar/
Configurations2/toolbar/
Configurations2/menubar/
Configurations2/accelerator/current.xml
Configurations2/floater/
styles.xml
META-INF/manifest.xml
END_HEREDOC
)
for f in $list
do
zip "$absfile" "$f"
done
cd "$cmdfolder"
我在这里找到了一些有趣的信息:http://www.jejik.com/articles/2010/03/how_to_correctly_create_odf_documents_using_zip/
答案 3 :(得分:0)
shell脚本也适用于我:)在解压缩odt文件后,我遇到了拉回来的问题。猜猜清单部分是什么缺失的。
上面的shell脚本没有处理内嵌图片/图形,但是,我做了一些小调整对我有用(同样,脚本有一个错误,因为END_HEREDOC不在专用线上):
#!/bin/sh
# Convert folder (unzipped OpenDocument file) to OpenDocument file (odt, ods, etc.)
# Usage: ./folder2od.sh "path/to/folder" "file.odt"
cmdfolder=$(cd `dirname "$0"`; pwd -P)
folder=$(cd `dirname "$2"`; pwd -P)
file=$(basename "$2")
absfile="$folder/$file"
cd "$1"
zip -0 -X "$file" "mimetype"
list=$(cat <<'END_HEREDOC'
meta.xml
settings.xml
content.xml
Pictures/
Thumbnails/
Configurations2/
styles.xml
manifest.rdf
META-INF/manifest.xml
END_HEREDOC
)
for f in $list
do
zip -r "$absfile" "$f"
done
cd "$cmdfolder"
答案 4 :(得分:0)
即使这是旧的,也是在 2021 年,如果它是使用 microsoft office、office 365、google docs、libreoffice 或 openoffice 生成的,那么操作打开的文档也像以前一样简单:
复印一份文件
将复制文档的扩展名重命名为 .zip(因为每个打开的文档都是一个 zip 文件!)
用文件名创建一个文件夹,不带扩展名
将步骤 2) 中重命名的文档(zip 文件)复制到此文件夹中
解压此文件夹中的(文档)zip 文件
删除压缩文件!
... 根据需要更改 xml 数据和二进制对象
将所有文件标记为该文件夹内的文件夹并将它们添加到新的 zip 文件中(仅使用标准 zip 压缩!)
现在您应该在之前在 setp 3 中创建的文件夹中有一个新的 zip 文件)
将这个新 zip 文件的扩展名重命名回 o.odt 或 .odp 或任何原始打开的文档类型,您在步骤 2) 中重命名
尝试在任何能够处理打开文档文件的办公软件中打开这个新的、重命名的打开文档
请记住:
a) 每个打开的文档都是一个(压缩的)zip 文件
b) zip 文件包含代表本文档结构和文本内容的 xml 文件,还包含带有二进制数据(对象)的子文件夹,如媒体数据(图像、音频或视频数据以及 ole 对象),其中一些可能在 xml 文件中显示为 base64 编码。
c) 您可以将每个打开的文档的内容提取到一个新文件夹中
d) 永远不要压缩放置所有数据的文件夹,以创建新的 zip 文件/打开文档文件。 仅压缩此文件夹的内容,以创建有效的打开文档并将如此创建的 zip 文件重命名为其原始源文件使用的打开文档扩展名!
来源:https://en.wikipedia.org/wiki/OpenDocument_technical_specification
可用于操作打开的文档文件的工具:
a) https://7-zip.de/download.html(提取和压缩)
b) https://notepad-plus-plus.org/downloads/(编辑 XML 内容)
c) https://www.bulkrenameutility.co.uk/(如果你不知道windows、linux下的命令,可以批量重命名文件和文件夹...参见:https://unix.stackexchange.com/questions/181141/rename-multiple-files-with-mv-to-change-the-extension)