LXF122:OOo

Материал из Linuxformat.

Перейти к: навигация, поиск
OpenDocument Раскрываем потенциал OpenOffice.org

Содержание

ODF: Вытянем данные из OOo

Марко Фиоретти запросто обработает информацию в формате OpenDocument: электронные таблицы, текстовые документы и прочее, а кода – всего ничего...

На предыдущих уроках этой серии мы показали, как автоматически генерировать различные файлы OpenDocument при помощи нескольких очень простых скриптов. Эти файлы, которые могут быть текстом, электронными таблицами или презентациями, сразу же можно редактировать в OpenOffice.org или другом ODF-совместимом офисном пакете. Среди прочего в данную категорию попадает и последняя версия Microsoft Office, с установленным соответствующим расширением (даже при том, что имеются некоторые проколы, особенно при работе с электронными таблицами).

Мы уже знаем, как генерировать электронные таблицы, текст и презентации ODF, и в этом месяце рассмотрим другую проблему: как работать с уже существующими ODF-файлами? А именно, как извлечь и использовать содержащуюся в них информацию? Ну, и зачем вам может понадобиться делать нечто подобное? Чтобы найти ответы, продолжайте читать.

Не удивляйтесь, это предназначено не для системных администраторов или супер-хакеров. Вы узнаете, как играть в такие игры, даже если вы всего лишь обычный пользователь, считающий, что компьютеры должны облегчать жизнь людям, а не наоборот. Имеется множество ситуаций, когда полезнее и проще открыть ODF-файл и поработать с его содержимым. Три самых типичных из них – обработка изображений, поиск или анализ текста и извлечение метаданных. До конца этого урока мы рассмотрим их все.

ODF: что внутри?

Если вы пропустили предыдущие выпуски этой серии, то вот краткое содержание. Формат файлов OpenDocument (ODF) – это стандарт ISO для документов с форматированным текстом, электронных таблиц и презентаций, представляющий единственную реальную альтернативу форматам, разработанным для MS Office.

Прелесть ODF в том, что это просто сжатый Zip-архив, где каждую часть содержимого легко извлечь и обработать, потому что они аккуратно хранятся в отдельных местах. Текстовое содержимое, форматирование, метаданные и другая информация – все это хранится в различных текстовых XML-файлах, а изображения и другие двоичные объекты имеют собственные каталоги. При этом очень просто найти или изменить только те части содержимого, которые действительно нас интересуют.

Уплотняем ODF

Первый практический пример обработки данного типа – это снижение общего размера ODF-файла благодаря сжатию каждого содержащегося в нем изображения в отдельности. Это не то же, что сжатие самого ODF-файла, и потенциально более эффективно: ведь полный ODF-файл уже сжат, и применение к нему zip, bzip2 или любого другого алгоритма компрессии мало что даст.

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

На http://www.OOOforum.org уже есть скрипт, уменьшающий размер ODF-файлов данным способом. Его автор сообщает, что версия 1.23 сокращает размер руководства по установке OOo 2.0 на 22 %, но выигрыш для слайд-шоу со множеством больших фотографий будет явно больше.

Основная идея объясняется на http://www.oooforum.org/forum/viewtopic.phtml?t=27339, а сам скрипт опубликован и прокомментирован на http://www.oooforum.org/forum/viewtopic.phtml?t=27452. Поскольку эти две ветки содержат множество деталей, а базовая реализация скрипта та же, что описана ниже, мы просто приглашаем вас попробовать его и перейти к главной части урока.

Обработка изображений

Структура ODF-файла такова (см. ODF: что внутри? выше), что манипулировать изображениями, содержащимися в нем, очень легко. Прежде чем перейти к реальным примерам, обсудим базовую структуру, которую может иметь сценарий данного типа. Его код показан на Листинге 1:

Как извлечь и обработать изображения из ODF-файлов.

Листинг 1: odf_image_processing.sh
 1 #! /bin/bash
 2 START_DIR=`pwd`
 3 FILENAME=`basename $1`
 4
 5 #Создайте временный рабочий каталог
 6 mkdir tmp_odf_work_dir
 7 cp $1 tmp_odf_work_dir/odf_file.zip
 8 cd tmp_odf_work_dir 
 9
 10 unzip odf_file.zip > /dev/null
 11 if [ -d Pictures ]
 12 then
 13 cd Pictures
 14 for ODF_PIC in `ls`
 15 do
 16 echo “Обрабатываем $ODF_PIC17 #### Выполните то, что желаете, с текущим изображением
 18 done
 19 cd ..
 20 rm odf_file.zip
 21 find . -type f -print0 | xargs -0 zip ../new_$FILENAME > /dev/null
 22
 23 else
 24 echo “В $1 нет изображений”
 25 fi
 26
 27 cd $START_DIR
 28 rm -rf tmp_odf_work_dir
 29
 30 ### Здесь начинается пост-обработка

Первая часть скрипта (строки 1–8) должна быть знакома любому, кто читал предыдущие уроки этой серии про ODF, поскольку там использовался тот же базовый подход. Все начинается с копирования ODF-файла, переданного в качестве первого аргумента, с расширением .zip, во временный каталог (tmp_odf_work_dir), созданный лишь для работы в чистом окружении. Затем мы распаковываем архив и проверяем, есть ли в нем директория с именем Pictures (строки 10–11). Если ее нет, то скрипт выдает предупреждение и, после удаления временных файлов (строки 27–28), завершается. Если каталог Pictures существует, то переходим туда для обработки всех графических файлов в нем. Это единственная часть скрипта, которую вам следует переписать в соответствии с вашими нуждами, вставив вместо строки-комментария 17 соответствующие команды (см. примеры ниже). Следующие шаги удаляют локальную копию ODF-файла и опять упаковывают все в новый ODF-файл с префиксом new_ (строки 19–21).

Последняя строка-комментарий 30 намекает на другой вариант использования скрипта – то есть применение изображений, найденных в ODF-файле, где-то еще. Другими словами, в строке 17 вы можете написать:

cp $ODF_PIC $SOME_OTHER_DIRECTORY/$ODF_PIC

а затем добавить в конец скрипта другие команды, для обработки картинок, которые изначально были запрятаны в презентации или текстовом документе. В качестве практически полезного примера ниже будет рассмотрено создание web-галереи.

Другие способы обработки

Помимо изменения размера, над ODF-файлами можно выполнять еще множество других операций. Лучший инструмент для этих целей – пакет программ для обработки изображений в командной строке ImageMagick (LXF116117). На сайте http://www.imagemagick.org/Usage приведены тонны примеров того, что может сделать ImageMagick. Наиболее частая операция с ODF-файлами, скорее всего, добавление рамки или уведомление о правах на копирование к каждой картинке, но единственное ограничение здесь – лишь ваши запросы. Просто посетите эту страницу и посмотрите, что может ImageMagick: если вы вдруг подумаете: «Эй, я хочу сделать это со всеми картинками в моем слайд-шоу или докладе, не тратя времени», то способ очевиден и прост. Полностью скопируйте с web-страницы команду ImageMagick, выполняющую то, что вы хотите, в строку 17 приведенного выше скрипта, затем изучите ее man-страницу (документация ImageMagick ясна и исчерпывающа), чтобы изменить или добавить ключи командной строки, удовлетворяющие вашим потребностям.

Независимо от программы, которую вы примените в показанном скрипте для работы с картинками ODF, не забывайте очевидную, но легко опускаемую деталь: при данном подходе изменяется исходное изображение. Любой добавляемый текст (как водяной знак) будет нанесен прямо на исходный PNG-файл, присутствующий в презентации. Вы можете достичь того же эффекта путем добавления текстовой вставки поверх изображения, но цели тут абсолютно разные.

Данное отличие становится еще более важным в электронных таблицах. Как показано на уроке работы с таблицами ODF в LXF119, диаграммы на рабочих листах ODF – это диаграммы, а не изображения: они представляют собой куски XML-кода, который программы, совместимые с ODF, используют для отрисовки графики на рабочем листе в реальном времени при каждом изменении данных. Из этого следует, что наш скрипт никак не влияет на диаграммы, потому что он просматривает только каталог Pictures.

Изменения изображений не обязательно касаются их внешнего вида. Все цифровые камеры используют формат Exif (Exchangeable Image File Format), для записи метаданных в свои JPEG-изображения. Простой способ читать и записывать эти данные в Linux – через exiftool, консольный интерфейс для модулей Perl Image-ExifTool (http://cpan. uwInnipeg.ca/dist/Image-ExifTool).

Включение в наш скрипт exiftool означает возможность извлекать временные метки, комментарии, тэги, географические координаты или любые другие данные из всех JPEG-фотографий любого ODF-файла. Столь же просто будет добавить комментарии или другую информацию в Exif-формат внутри самих JPEG-файлов.

И последнее замечание к этому методу обработки изображе-ний OpenDocument: изображениями он не ограничивается. В Linux имеется масса консольных утилит, способных выполнять все что угодно с мультимедиа-файлами или двоичными объектами. Автоматическое сканирование макросов, для проверки на вирусы или другой вредоносный код, может работать таким же образом. Обработка возможна, даже если ваше аудио- и видеосодержимое размещено в слайд-шоу или текстовом файле. Например, можно заменить все звуковые композиции презентации другими, с более низкой частотой дискретизации (что снизит размер файла), или преобразовать внедренное видео в открытые форматы, или уменьшить разрешение.

Создаем галерею изображений

Давайте рассмотрим пример внешнего использования изображений из ODF-файла. Помните, мы отмечали ранее, что строка 30 листинга 1 – то место, где можно работать с изображениями вне исходного ODF-файла? Наиболее частый случай – перенос их в web-галерею. Полезным инструментом для этого является shalbum (http://sourceforge.net/projects/shalbum) – сценарий оболочки, использующий ImageMagick для создания набора HTML страниц с миниатюрами и навигационными ссылками.

Откуда взялась эта галерея изображений в сети? Естественно, из документа ODF!

Рисунок показывает web-альбом, реагирующий на щелчки мыши, полученный заменой строки 30 листинга 1 на команду cd $SOME_OTHER_DIRECTORY/; shalbum и последующей обработкой слайд-шоу ODF, показанного в правом верхнем углу следующей страницы. Поскольку shalbum поддерживает также и подписи к рисункам, то будет относительно просто также извлечь их из ODF-файла и опубликовать эту информацию в сети. Ввиду ограниченности объема статьи оставляю это действие в качестве упражнения для читателя.

Поиск текста

Теперь перейдем к совершенно другой области: будем искать, какой файл содержит некую строку. Для простых текстовых файлов это очень просто. Linux, благодаря своей Unix-природе, всегда имел множество утилит для фильтрации, поиска и обработки текстовых файлов. Было бы очень удобно делать то же самое для ODF-файлов, не так ли? Как выясняется, это не очень-то и сложно. Во-первых, нам необходим инструмент для извлечения текста из zip-архива. Листинг 2 содержит ODF-эквивалент традиционной команды cat:

Листинг 2: odf_cat.sh, команда cat для ODF файлов:
 1 #! /bin/bash
 2
 3 mkdir tmp_odt_cat
 4 cp $1 tmp_odt_cat/odf_file.zip
 5
 6 cd tmp_odt_cat
 7 unzip odf_file.zip > /dev/null
 8
 9 tr “<” “\012” < content.xml | \
 10 grep -i ^text | \
 11 cut ‘-d>’ -f2- | \
 12 perl -e “while (<>) {s/&apos;/’/g; print }13 cd ..
 14 \rm -rf tmp_odt_cat
 15 exit

Общая структура Листинга 2 та же, что мы видели в предыдущих примерах, поэтому сосредоточимся на строках 9–12; сперва, заменяя символы > на конец строки, мы размещаем каждый XML-элемент на отдельной строке, упростив себе фильтрацию чисто текстовых элементов. А в строке 11 удаляется все, кроме реального содержимого. Вызов Perl в строке 12 преобразует HTML-запись, соответствующую одиночной кавычке, в обычный вид.

Вот и все! Да-да, эти несколько строк кода – все, что нужно для полного переноса содержимого текстового ODF файла в терминал или в любую другую программу, которой оно может понадобиться. В качестве доказательства, посмотрите на другой фрагмент bash-скрипта:

Листинг 3: find_in_odf.sh
 1 for FILE in `find $1 -type f -name “*odt”`
 2 do
 3 /home/marco/PROJECTS/_Archive/LXF/ODF_Scripting/Part_3_processing/scripts/odf_cat.sh $FILE > tmp_odf_find
 4 grep -q -i “$2” tmp_odf_find && echo $FILE
 5 rm tmp_odf_find
 6 done

Он находит все текстовые файлы ODF в каталоге, передаваемом как первый аргумент, и сохраняет содержимое каждого из них во временном файле. Если файл содержит второй аргумент ($2), то имя соответствующего ODF-документа выводится в стандартный поток вывода. Вот как ваш автор нашел, в какой из его статей LXF упоминается браузер Konqueror:

[marco@polaris LXF]$ ODF_Scripting/Part_3_processing/scripts/find_in_odf.sh . konqueror
./KONQUEROR_TIPS/konqi.odt
./LIVE_CD_ROUNDUP_2008/live_cd_roundup_2008.odt

Конечно же, приведены только простейшие примеры; смысл в том, чтобы показать вам, как легко это делается. Более сложным инструментом командной строки для извлечения и сохранения более-менее форматированного текста из ODF-файла является odt2txt. На web-странице http://www.verimag.imag.fr/~moy/opendocument описано, как он работает и как его можно использовать в других программах для поиска отличий между ODF-файлами или интегрировать его в систему управления версиями.

Метаданные

Закончим данную серию по обработке ODF описанием некоторых вспомогательных компонентов. Кроме файла, зарезервированного для реального содержимого, внутри документа ODF имеется еще по крайней мере два XML-файла, с которыми также стоит поработать. Первый – это styles.xml. Используя описанные здесь приемы, можно автоматически модифицировать стили всех ваших ODF-файлов или заменить их новыми.

Второй интересный файл называется meta.xml, он содержит – угадали! – метаданные. Они делятся на фиксированные и определяемые пользователем: первая категория включает параметры типа даты последней распечатки или числа циклов редактирования, слов и символов для каждого документа. Извлечение этих чисел пригодится для сбора статистики о работе, построения полного каталога или просто индексирования. Онлайн-книга OpenDocument Essentials (http://books.evc-cit.info/odbook/ch02.html#meta-casestudy-section) Дэвида Дж. Айзенберга [J David Eisenberg] содержит отлаженный Perl-скрипт для выполнения извлечения именно такого типа. Как всегда, существует более простое, хотя и менее гибкое, решение, представляющее собой скрипт оболочки в несколько строк.

Листинг 4: cat_odf_metadata.sh
 1 #! /bin/bash
 2
 3 mkdir tmp_odt_cat
 4 cp $1 tmp_odt_cat/odf_file.zip
 5
 6 cd tmp_odt_cat
 7 unzip odf_file.zip > /dev/null
 8
 9 tr “<” “\012” < meta.xml | \
 10 grep ^meta
 11 exit

Вот результат запуска cat_odf_metadata.sh для обычного текстового ODF-файла:

meta:generator>OpenOffice.org/2.4$Unix OpenOffice.org_project/680m18$Build-9364
meta:print-date>2008-12-04T03:39:41
meta:editing-cycles>1053
meta:editing-duration>P1DT20H34M6S
meta:user-defined meta:name=”Info 1”/>
meta:user-defined meta:name=”Info 2”/>
meta:user-defined meta:name=”Info 3”/>
meta:user-defined meta:name=”Info 4”/>
meta:document-statistic
meta:tablecount=”0” meta:image-count=”0”
meta:object-count=”0” meta:pagecount=”7” meta:paragraph-count=”208”
meta:word-count=”4565” meta:charactercount=”27064”/>

В результате получился упорядоченный список метаданных, которые можно отфильтровать, как и любой системный журнал или обычный текстовый файл. Метаданные, определяемые пользователем, интересны по двум причинам. Во-первых, они сами, как и их названия, могут быть чем угодно: тэгами, комментариями, именами заказчиков – что только можно выразить текстом. Далее, поскольку метаданные расположены в обычном XML-файле, вы можете изменять их при помощи тех же скриптов и советов, что описаны в этой серии для автоматической генерации ODF-текста! Вот синтаксис для полей данного типа:

<meta:user-defined meta:name=”имя”>значение</meta:user-defined>

Итак, для изменения скриптов, представленных в этой серии, для пометок и классификации всех ваших ODF документов требуется действительно мало усилий – разве нет?

А зачем все это нужно?

Формат OpenDocument – это международный стандарт, свободный от правовых ограничений; он позволяет конечному пользователю без опыта программирования создавать форматированные текстовые документы, слайд-шоу и презентации в полностью графическом интерфейсе. В то же время, если только у вас не слишком специфичные требования, это формат, весьма простой для автоматической обработки при помощи несложных программ, написание которых не занимает много времени. Все это делает OpenDocument прекрасным, если не единственным на сегодняшний день, выбором для создания, обработки и обмена различными офисными документами, при минимально возможных усилиях и без страха быть прикованным к единственному приложению. Мы надеемся, что все описанные в данной серии приемы помогут вам выполнять именно это. Наслаждайтесь ODF!

Взаимодействие с ODF

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

Вы можете убедиться на http://www.opendocumentfellowship.org, что многие правительства уже изменили свои предпочтения в пользу этого формата; вплоть до того, что в 2008 Microsoft заявила: «Очевидно, ODF победил». Поэтому смело советуйте друзьям, все еще предпочитающим MS Office, установить модуль расширения ODF для этого пакета. К сожалению, ODF все-таки не дает 100% гарантии в том, что вы не будете прикованы к какому-либо конкретному приложению, если будете продолжать использовать свои документы. В настоящий момент ситуация выглядит благоприятной для текста и презентаций до тех пор, пока вы не внедрите изображения или другие двоичные объекты в проприетарных форматах. Для электронных таблиц содержимое может отличаться значительно: имеется прекрасное описание этой темы на http://www.robweir.com/blog/2009/05/update-on-odf-spreadsheet.html. Однако все выглядит много лучше, чем год-два назад. Сегодня ODF – это единственная спецификация формата файлов, о которой говорит вся промышленность; и она превосходна и открыта.

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию