Open Office如何压缩其文件?

rui*_*eco 12 zip openoffice.org opendocument

我正在尝试以编程方式创建一个Open Office电子表格,但出于某种原因,仅使用所有必需文件压缩文件夹会使Open Office将该文件标记为已损坏.

我是怎么做到这一点的?我开始在Open Office中创建一个普通的电子表格,其中包含一些值.保存后,我将扩展名更改为.zip并制作该文件夹的副本.然后我使用命令行zip压缩第二个文件夹,并将文件扩展名更改为.ods.尝试打开生成的文件时,我从Open Office收到一条错误,指出该文件已损坏.

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

tok*_*and 17

这对我有用:

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

    $ mkdir document
    $ cd document
    $ unzip ../document.odt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 修改未压缩的数据.

  3. 创建一个新的odt:

    $ zip -0 -X ../document2.odt mimetype
    $ zip -r ../document2.odt * -x mimetype
    
    Run Code Online (Sandbox Code Playgroud)


Joa*_*uer 8

OASIS OpenOffice规范的第17节定义了如何打包OpenDocument包.

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

如果存在使用包的文档的MIME类型,则包 应该包含名为"mimetype"的流.该流应该是包的压缩文件的第一数据流,它必须不被压缩,并且它必须不在其首部用一个"额外字段"(见[ZIP])..

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

  • 所有zip文件位置0的字符串'PK'
  • 所有此类包文件的位置30处的字符串'mimetype'
  • mimetype本身在这样一个包的第38位.

  • 实际上,对于规范来说,这是一些令人惊讶的明文;-) zip中的第一个"文件"应该被称为"mimetype",并且应该包含存档的mimetype.它不能被压缩,也不能使用任何额外的字段(即不加密,......). (2认同)

mem*_*ems 6

我曾尝试过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"
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一些有趣的信息:http://www.jejik.com/articles/2010/03/how_to_correctly_create_odf_documents_using_zip/