Как Open Office сжимает свои файлы?

Я пытаюсь создать электронную таблицу Open Office программно, но по какой-то причине просто сжимая папку со всеми необходимыми файлами, делает Open Office флагом файла как поврежденного.

Как я дошел до этого? Я начал с создания обычной электронной таблицы в Open Office с некоторыми значениями в ней. После сохранения я меняю расширение на .ZIP и сделать копию папки. Затем я сжимаю вторую папку с помощью командной строки zip и изменяю расширение файла.ОРВ. Когда пытаясь открыть полученный файл, я получаю сообщение об ошибке из Open Office, говорящее, что файл поврежден.

использует ли Open Office специальный алгоритм сжатия? Выполнение " теста файла.ods " показывает его как сжатый zip, так что же Open Office добавляет во время процедуры сжатия, чтобы заставить его работать?

4 ответов


это сработало для меня:

  1. распаковать исходный файл документа (это обычный zip-файл) в директорию:

    $ mkdir document
    $ cd document
    $ unzip ../document.odt
    
  2. измените несжатые данные.

  3. создайте новый odt:

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

раздел 17 оазис Спецификация OpenOffice определяет, как пакеты OpenDocument должны быть упакованы.

раздел 17.4 поток типа MIME читается следующим образом:

Если тип MIME для документа использование пакетов существует, затем пакет должны содержит поток под названием "mimetype". Этот ручей!--10-->должны будет первый поток zip пакета файл, это должны Не быть сжаты, и это НЕ ДОЛЖЕН использовать дополнительные поле ' в его заголовке (см. [ZIP])..

цель, чтобы упакованных файлов быть идентифицированным с помощью магии механизмы числа, такие как Unix файл / волшебная утилита. Если ZIP-файл содержит поток в начале файл, который распаковывается и никаких дополнительных данных в заголовке, затем имя потока и содержимое потока могут найти в фиксированных положениях. Больше конкретно, один найдет:

  • строка "PK" в позиции 0 всех zip-файлов
  • строка "mimetype" в позиции 30 всех таких файлов пакетов
  • сам mimetype в позиции 38 такого пакета.

я пробовал предложение 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 ""`; pwd -P)
folder=$(cd `dirname ""`; pwd -P)
file=$(basename "")
absfile="$folder/$file"

cd ""
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/


сценарий оболочки работал и для меня:) у меня были проблемы с архивацией после распаковки файла odt. Думаю, в манифесте чего-то не хватает.

сценарий оболочки выше не обрабатывал встроенные изображения / графику, однако, поэтому я сделал некоторые небольшие корректировки, которые работали для меня (кроме того, у скрипта была ошибка в том, что 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 ""`; pwd -P)
folder=$(cd `dirname ""`; pwd -P)
file=$(basename "")
absfile="$folder/$file"

cd ""
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"