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

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

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

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

5 ответов

Решение

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

  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 Спецификации OASIS OpenOffice определяет, как пакеты OpenDocument должны быть упакованы.

Раздел 17.4 MIME Type Stream выглядит так:

Если тип MIME для документа, использующего пакеты, существует, то пакет ДОЛЖЕН содержать поток, называемый "mimetype". Этот поток ДОЛЖЕН быть первым потоком 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 "$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:

  1. сделать копию вашего документа

  2. переименуйте расширение скопированного документа в .zip (потому что каждый открытый документ представляет собой zip-файл!)

  3. создать папку с названием документа без расширения

  4. скопируйте переименованный документ (zip-файл) из шага 2) в эту папку

  5. извлеките zip-файл (документа) в эту папку

  6. удалите zip-файл!

  7. ... изменить данные xml и двоичные объекты по своему усмотрению

  8. отметьте все файлы и папки в этой папке и добавьте их в новый zip-файл (используйте только стандартное сжатие zip!)

  9. теперь у вас должен быть новый zip-файл в папке, которую вы создали ранее в setp 3)

  10. переименуйте расширение этого нового zip-файла обратно в o.odt или .odp или в любой другой исходный тип открытого документа, который вы переименовали на шаге 2)

  11. попробуйте открыть этот новый, переименованный открытый документ в любом офисном программном обеспечении, способном обрабатывать файлы открытых документов

Пожалуйста, помните:

а) каждый открытый документ представляет собой (сжатый) 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"
Другие вопросы по тегам