【问题标题】:How does Open Office compress its files?Open Office 如何压缩其文件?
【发布时间】:2011-06-24 20:09:49
【问题描述】:

我正在尝试以编程方式创建 Open Office 电子表格,但由于某种原因,仅压缩包含所有必要文件的文件夹会使 Open Office 将文件标记为已损坏。

我是怎么做到的?我首先在 Open Office 中创建了一个包含一些值的普通电子表格。保存后,我将扩展名更改为 .zip 并复制该文件夹。然后我使用命令行 zip 压缩第二个文件夹并将文件扩展名更改为 .ods。尝试打开生成的文件时,我从 Open Office 收到错误消息,提示文件已损坏。

Open Office 是否使用特殊的压缩算法?执行“文件 test.ods”会将其显示为压缩的 zip,那么 Open Office 在压缩例程中添加了什么以使其正常工作?

【问题讨论】:

  • 我知道至少有一些文件未压缩地存储在档案开头附近,以便更容易找出档案中内容的具体类型。
  • 这是什么意思? ODS 文件实际上没有被压缩?
  • 不,不能压缩 zip 中的“mimetype”文件。其余的可能会被压缩。
  • 如何将未压缩的文件添加到压缩文件中?不知道我明白这里发生了什么。
  • 在 ZIP 文件格式中,压缩是单个文件的属性。这意味着可以压缩单个文件(通常使用 DEFLATE)或未压缩存储(STORED)。大多数命令行应用程序只允许通用存档范围的切换,因为很少使用更详细的控制。

标签: zip openoffice.org opendocument


【解决方案1】:

OASISOpenOffice Specification 的第 17 节定义了如何打包 OpenDocument 包。

第 17.4 节 MIME 类型流如下所示:

如果文档的 MIME 类型 使用现有的包, 然后是包 应该包含一个名为“mimetype”的流。此流应该是 包的 zip 的第一个流 文件,不得被压缩, 并且它不得使用“额外 标题中的字段'(参见 [ZIP])..

目的是允许打包文件 通过“魔法”识别 number' 机制,例如 Unix 的 文件/魔术实用程序。如果一个 ZIP 文件 在开头包含一个流 未压缩的文件,并且具有 标头中没有额外的数据,则 流名称和流内容可以 可以在固定位置找到。更多的 具体来说,您会发现:

  • 所有 zip 文件位置 0 处的字符串 'PK'
  • 所有此类包文件第 30 位的字符串“mimetype”
  • mimetype 本身位于此类包的第 38 位。

【讨论】:

  • 实际上,对于规范,这是一些令人惊讶的清晰文本;-) zip 中的第一个“文件”应该称为“mimetype”,并且应该包含存档的 mimetype。它不能被压缩并且不能使用任何额外的字段(即不能被加密,...)。
  • 就文件格式规范而言,我必须同意,这实际上非常清晰且没有模糊!
  • 对于任何在 2018 年通过 Google 使用 Libreoffice 5.4 找到此内容的人,此方法有效:zip -r ../test5.ods mimetype * 即 mimetype 必须是第一个,以默认 zip 顺序休息
【解决方案2】:

文档here。这些步骤对我有用:

  1. 将原始文档文件(这是一个普通的zip文件)解压缩到某个目录:

    $ mkdir document
    $ cd document
    $ unzip ../document.odt
    
  2. 修改未压缩的数据。

  3. 创建一个新的 odt:

    $ zip -0 -X ../document2.odt mimetype
    $ zip -r ../document2.odt * -x mimetype
    

【讨论】:

  • 为了 cmets,zip -r 矢量对我有用,但 LibreOffice 仍想修复文件。
  • 我无法重现某些用户遇到的问题。我想解决所有问题的答案。如果您有问题,请在评论中添加生成文件的链接。
  • 我正在尝试在 windows 下使用 7zip 执行此操作,这是否可以在 windows 下为 ods 制作正确的 zip?
  • 也许你可以在 java.io.* 和 java.util.zip.* 中做这个?
【解决方案3】:

我尝试过 tokland 的建议,但我发现 LibreOffice 4 需要特定的顺序(仅适用于第一个?):

  1. mimetype(未压缩)
  2. meta.xml
  3. settings.xml
  4. content.xml
  5. Thumbnails/thumbnail.png
  6. Configurations2/images/Bitmaps/
  7. Configurations2/popupmenu/
  8. Configurations2/toolpanel/
  9. Configurations2/statusbar/
  10. Configurations2/progressbar/
  11. Configurations2/toolbar/
  12. Configurations2/menubar/
  13. Configurations2/accelerator/current.xml
  14. Configurations2/floater/
  15. styles.xml
  16. 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/

【讨论】:

  • 我不明白,这个链接说唯一的限制是mimetype 必须是第一个文件并且未压缩,不能引用其他元文件。有什么想法吗?
  • @joachim-sauer 提示在规范中指定 mimetype 应该是第一个 zip 条目。我认为它不适合其他人。我给出的列表并不详尽,仅包含在我的 LO4 版本生成的 odt 中找到的条目
  • 有效,但必须在“END_HEREDOC”和“)”之间添加新行
【解决方案4】:

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"

【讨论】:

  • 当您对其他答案有细微的修改建议时,最好对这个问题发表评论。
【解决方案5】:

即使这是旧的,也是在 2021 年,如果使用 microsoft office、office 365、google docs、libreoffice 或 openoffice 生成,操作打开的文档也像以前一样容易:

  1. 制作一份你的文件的副本

  2. 将复制文档的扩展名重命名为 .zip(因为每个打开的文档都是一个 zip 文件!)

  3. 使用文档名称创建一个文件夹,不带扩展名

  4. 将步骤 2) 中重命名的文档(zip 文件)复制到此文件夹中

  5. 提取此文件夹中的(文档)zip 文件

  6. 删除压缩文件!

  7. ...随意更改xml数据和二进制对象

  8. 将所有文件标记为该文件夹中的文件夹并将它们添加到新的 zip 文件中(仅使用标准 zip 压缩!)

  9. 现在您应该在之前在 setp 3) 中创建的文件夹中有一个新的 zip 文件

  10. 将此新 zip 文件的扩展名重命名为 o.odt 或 .odp 或任何原始打开文档类型,您在第 2 步中重命名)

  11. 尝试在任何能够处理打开文档文件的办公软件中打开这个新的、重命名的打开文档

请记住:

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

【讨论】:

  • 太好了,谢谢。目前(2021 年)OpenOffice 只需要一个简单的 ZIP 即可(如果使用 7z 应用程序,请使用 ZIP 压缩格式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
相关资源
最近更新 更多