Как Open Office сжимает свои файлы?
Я пытаюсь создать электронную таблицу Open Office программно, но по какой-то причине просто сжимая папку со всеми необходимыми файлами, делает Open Office флагом файла как поврежденного.
Как я дошел до этого? Я начал с создания обычной электронной таблицы в Open Office с некоторыми значениями в ней. После сохранения я меняю расширение на .ZIP и сделать копию папки. Затем я сжимаю вторую папку с помощью командной строки zip и изменяю расширение файла.ОРВ. Когда пытаясь открыть полученный файл, я получаю сообщение об ошибке из Open Office, говорящее, что файл поврежден.
использует ли Open Office специальный алгоритм сжатия? Выполнение " теста файла.ods " показывает его как сжатый zip, так что же Open Office добавляет во время процедуры сжатия, чтобы заставить его работать?
4 ответов
это сработало для меня:
-
распаковать исходный файл документа (это обычный zip-файл) в директорию:
$ mkdir document $ cd document $ unzip ../document.odt
измените несжатые данные.
-
создайте новый 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 требует определенного порядка (только для первых?):
-
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 ""`; 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"