Работа с файлами формата OpenDocument

Начнем с хорошего - контейнером является все-таки стандартный zip-архив, а не что-то доморощенное. Теперь о плохом - это zip-архив и имеет все его недостатки. Поговорим о том, как же нам сделать редактирование контента для целей, например, автоматизированного вывода на печать документов - распаковываем файл content.xml, выполняем в нем нужные замены с помощью sed или другой утилиты, записываем измененный файл обратно в архив.

Две основные проблемы при работе с zip-архивами: утилита zip написана страшными голово...ногими существами с неизвестной планеты и сообщения об ошибках в архиве пишет в stdout (при запуске zip -T ...). Повбивав бы... Кроме того, не умеет заменять файл в архиве, принимая сам файл в stdin, а его имя - аргументом командной строки.

Решение первой проблемы - утилита unzip:

$ time unzip -qqt 100.odt

real 0m0.006s
user 0m0.004s
sys 0m0.000s

$ time unzip -qqt 100 >/dev/null
warning [100]: 3 extra bytes at beginning or within zipfile
(attempting to process anyway)
file #1: bad zipfile offset (local header sig): 3
(attempting to re-compensate)
Pictures/10000000000000AA000000528155B835.png: mismatching "local" filename (),
continuing with "central" filename version
Pictures/10000000000000AA000000528155B835.png: ucsize 174417162 <> csize 5130 for STORED entry
continuing with "compressed" size value
Pictures/10000000000000AA000000528155B835.png bad CRC d80cc663 (should be c116ead1)
file #11: bad zipfile offset (local header sig): 5746
(attempting to re-compensate)

real 0m0.006s
user 0m0.000s
sys 0m0.004s

Ошибки отправляются в stderr, что и требовалось.

Решение второй проблемы - утилита zipput:

echo "hello" | zipput test.odt content.xml

Эта замечательная утилита была придумана вчера, в процессе обсуждения subj с Anton Kovalenko, который тут же написал реализацию, а я ее сразу опакетил, так что уже можно брать в моем репозитории. Подробности см. на страничке автора zipput. Отмечу лишь, что libzip и zip в debian lenny некорректно работают с OpenDocument файлами, так что я сразу сделал и бэкпорт соответствующих пакетов из testing, с которыми все работает как полагается (в changelog новой версии указано "Add patch to support archives with 64k entries").

Comments

Popular posts from this blog

Открытый софт для научных расчетов

Кольцевые структуры в геофизике

Модем Huawei E1550 в debian