Как Open Office сжимает свои файлы?
Я пытаюсь создать электронную таблицу Open Office программно, но по какой-то причине простое сжатие папки со всеми необходимыми файлами заставляет Open Office помечать файл как поврежденный.
Как я дошел до этого? Я начал с создания обычной таблицы в Open Office с некоторыми значениями. После сохранения я изменяю расширение на.zip и делаю копию папки. Затем я сжимаю вторую папку с помощью zip из командной строки и изменяю расширение файла на.ods. При попытке открыть полученный файл я получаю сообщение об ошибке из Open Office, в котором говорится, что файл поврежден.
Использует ли Open Office специальный алгоритм сжатия? Выполнение "файла test.ods" показывает его в виде сжатого zip-файла, так что же Open Office добавляет во время процедуры сжатия, чтобы он работал?
5 ответов
Это сработало для меня:
Распакуйте исходный файл документа (это обычный zip-файл) в какой-то каталог:
$ mkdir document $ cd document $ unzip ../document.odt
Изменить несжатые данные.
Создайте новый odt:
$ zip -0 -X ../document2.odt mimetype $ zip -r ../document2.odt * -x mimetype
Раздел 17 Спецификации OASIS OpenOffice определяет, как пакеты OpenDocument должны быть упакованы.
Раздел 17.4 MIME Type Stream выглядит так:
Если тип MIME для документа, использующего пакеты, существует, то пакет ДОЛЖЕН содержать поток, называемый "mimetype". Этот поток ДОЛЖЕН быть первым потоком 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 "$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/
Даже если это устарело, также в 2021 году, манипулировать открытыми документами будет так же просто, как и раньше, если они были созданы с помощью Microsoft Office, Office 365, google docs, libreoffice или openoffice:
сделать копию вашего документа
переименуйте расширение скопированного документа в .zip (потому что каждый открытый документ представляет собой zip-файл!)
создать папку с названием документа без расширения
скопируйте переименованный документ (zip-файл) из шага 2) в эту папку
извлеките zip-файл (документа) в эту папку
удалите zip-файл!
... изменить данные xml и двоичные объекты по своему усмотрению
отметьте все файлы и папки в этой папке и добавьте их в новый zip-файл (используйте только стандартное сжатие zip!)
теперь у вас должен быть новый zip-файл в папке, которую вы создали ранее в setp 3)
переименуйте расширение этого нового zip-файла обратно в o.odt или .odp или в любой другой исходный тип открытого документа, который вы переименовали на шаге 2)
попробуйте открыть этот новый, переименованный открытый документ в любом офисном программном обеспечении, способном обрабатывать файлы открытых документов
Пожалуйста, помните:
а) каждый открытый документ представляет собой (сжатый) zip-файл
б) zip-файл содержит файлы xml, которые представляют структуру и текстовое содержимое этого документа, а также содержит подпапки с двоичными данными (объектами), такими как мультимедийные данные (изображения, аудио- или видеоданные и старые объекты), некоторые из них может отображаться как кодировка base64 в файле xml.
в) вы можете извлечь содержимое каждого открытого документа в новую папку
г) никогда не сжимайте папку, в которую вы помещаете все свои данные, чтобы создать новый zip-файл / файл открытого документа. Сжимайте ТОЛЬКО содержимое этой папки , чтобы создать действительный открытый документ, и переименуйте созданный таким образом zip-файл в расширение открытого документа, которое использовалось в исходном исходном файле!
Источники: https://en.wikipedia.org/wiki/OpenDocument_technical_specification
Инструменты, которые можно использовать для управления файлами открытых документов:
а) https://7-zip.de/download.html (для извлечения и сжатия)
б) 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)
У меня тоже работал скрипт оболочки:) У меня возникли проблемы с архивированием после разархивирования файла 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 "$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"