3 декабря 2014 г.

LibreOffice: уменьшение размера документа с помощью пакетной обработки изображений

Недавно мне в руки попал .odt документ весом 120 мб. Я быстро догадался в чем причина такого ожирения, документ содержал большое количество фотографий в высоком разрешении (больше 80 штук), каждая весом около 2 мб. С размером надо было что-то делать, но не вариант по отдельности выуживать все изображения, менять их разрешение и снова вставлять в документ. На ум сразу пришло словосочетание «пакетная обработка».

Пакетная обработка изображений — одновременное автоматическое выполнение операций над множеством графических файлов.*

У меня уже был опыт пакетной обработки изображений программой ImageMagick. Но сейчас передо мной стояло две проблемы:

  • отсутствие исходных изображений
  • все изображения в документе были разной ориентации

Первая проблема решалась очень просто, .odf документы это xml файлы запакованные в zip архив. И все изображения, вставленные в документ, хранятся в нем. Поэтому я распаковал документ и обнаружил там папку Pictures. В ней и лежали все изображения, оставалось их только обработать. Для решения второй проблемы я написал небольшой скрипт под названием magick.py (скачать). На основе данных о размере ширины и высоты изображения он определяет его ориентацию (портретная или ландшафтная), а затем уменьшает либо высоту, либо ширину. Теперь подробнее о деталях.

Распаковка odt файла

Не все архиваторы понимают расширение .odt, поэтому для распаковки текстового документа нужно переименовать его и вместо .odt написать .zip. LibreOffice перестанет открывать такой документ, но это временно. Далее просто распаковываем этот zip архив штатным архиватором.

В качестве примера я использовал документ меньшего размера не 120 мб, а всего каких-то 75. На всякий случай сделал копию документа example.odt, и сменил ему расширение на .zip. Получился архив copy_example.zip, который я и распаковал.

Вот внутренности документа и заветная папка Pictures. В ней лежат все изображения, вставленные в файл. Ничего лишнего в ней больше нет — идеальный вариант для пакетной обработки.

Несколько слов о вставке изображений в LibreOffice

После вставки изображения в LibreOffice исходное изображение копируется в папку Pictures. В самом документе можно уменьшить изображение, обрезать или выполнить другие действия. Но при этом исходное изображение в папке Pictures не изменяется. В качестве примера я обрежу в руководстве скриншот терминала:

Исходное изображение в папке Pictures осталось прежним:

Можно смело изменять разрешение изображений, не опасаясь фатальных изменений в структуре самого документа. Конкретно в моем случае после преобразования изображений вообще ничего не поехало.

Пакетная обработка изображений в папке Pictures

Теперь для обработки изображений скопируем скрипт в папку Pictures. Я не буду останавливаться на настройках скрипта и его использовании (все описано в его руководстве). Просто покажу конечный результат. Напоминаю, что скрипт создает в папке с изображениями папку magick_out, в которой сохраняет обработанные изображения. Не забудьте скопировать с заменой обработанные изображения в папку Pictures и удалить папку magick_out. Офисные пакеты: изображения из документа .odt.

Теперь все изображения имеют приемлемый размер и вес. Можно приступать к запаковке архива.

Запаковка архива

Перед тем, как запаковать архив убедитесь, что вы заменили старые изображения на обработанные и удалили папку magick_out из Pictures. Далее нужно выделить все файлы документа и запаковать их в zip архив.

После запаковки меняем обратно расширение .zip на .odt.

Все, LibreOffice снова сможет открыть файл, который теперь стал гораздо легче. Конечно при желании можно ужать документ и до меньших размеров. Я уменьшал фотографии до 1000 пикселей и с максимальным качеством. Тут пусть каждый сам ищет для себя баланс.