LXF121 OpenOffice
Матеріал із Linuxformat.
|
ЗмістOOo: Працюємо автоматомМи часто застосовуємо комп'ютер для створення декількох різних версій одного і того ж документа, але ручні оновлення ваших файлів мають сенс тільки якщо вони рідкісні. Адже є безліч способів заощадити дорогоцінні секунди – як ми показали у LXF119 під час розгляду автоматичного оновлення електронних таблиць. А на даному уроці ми займемося більш об'ємним завданням: перенесемо набір «сирих» даних до будь-якого корисного документа з мінімумом зусиль. До того ж ми уникнемо відкриттяOpenOffice.org(ну, майже), завдяки властивостям його стандартного формату файлів: OpenDocument, або ODF. Документ ODF - просто zip-архів, з картинками і макросами у власних каталогах, а сам текст - записаний у форматі XML - знаходиться у файлі з ім'ямcontent.xml. Для створення нової версії документа слід відкрити архів, змінити текст уcontent.xml, помістити кілька нових картинок у їхній каталог і запакувати знову. Тут ми покажемо, як це зробити за допомогою текстових документів ODF і дійсно простих сценаріїв оболонки. Тести з вибором відповіді у ODF![]() Давайте почнемо з практичного завдання: створення форматованого тесту з вибором з кількох варіантів відповіді та випадково генерованими питаннями. Заради простоти припустимо, що тест містить лише одне питання і єдокумент, що містить назву тесту, його опис, питання та три варіанти відповіді, кожен зі своєю картинкою та підписом. Його файл (дамо йому ім'яsample_multiple_choice.odt) буде нашим вихідним шаблоном. Щоб використовувати файл для генерації нашого тесту у форматі OpenDocument, спочатку треба записати всі рядки, які увійдуть до тесту, у файлі формату ASCII (назвемо йогоmy_test_data_1) таким чином: Формат цього файлу досить простий, але є кілька моментів, які слід зазначити: по-перше, це цілком коректний синтаксис команд оболонки. Кожен рядок цього файлу надає значення деякого змінного середовища, яке використовуватиметься в основному скрипті. По-друге, хоча загальних правил немає, будьте обережні у використанні лапок. Наприклад, в останньому рядку потрібно використовувати подвійні лапки, оскільки в тексті питання вже зустрічається одинарна [або її необхідно екранувати, замінивши на \', - прим. ред.]. Підготовка картинок![]() Крім рядків, необхідно також припасти три картинки - у тому порядку, в якому вони з'являться в документі. У нашому прикладі вони знаходяться в каталозіLinux_Test_Pictures, і ми назвали їх01_ubuntu_logo.png, 02_mandriva_logo.pngта03_fedora_logo.pngвідповідно. Нумерація потрібна для гарантії їх використання у правильному порядку. Прилаштувавши все на місця, виконайте таку команду: для завершення першого тесту. Вживемо скрипт інакшеНайкраще у цьому те, що метод застосовний всім випадків, поки структура документа незмінна. Як доказ, розмістимо три відповідні картинки (перша– гори, друга – пляж, третя – історичні місця) у каталозіHoliday_Picturesі додамо наступний ASCII-текст у файл з ім'ямmy_holiday_data_1: Закінчіть процес запуском: Хіба не круто? Тепер, щоб згенерувати 1000 подібних файлів, залишилося лише запустити наведений нижче скрипт у циклі. ![]() Скриптtest_generator.shприймає як аргумент шаблон в ODF, ASCII-файл, що містить текстові рядки, і всі зображення, які слід помістити в новий документ. Перші 10 рядків визначають тимчасовий каталог та копіюють у нього всі необхідні файли. Командиshiftу рядках9та10видаляють шаблон ODF і файл з даними зі змінної, що зберігає список аргументів,$@. Це необхідно для створення циклу в рядках з14по19, що обробляють лише графічні файли. Тут створюється локальна копія кожної картинки, але більш важлива частина знаходиться в рядку18: вона генерує файлnew_pictures_list, що має вигляд на зразок Незабаром ви дізнаєтеся, навіщо потрібно створювати такий файл, а поки що повернемося до коду. Рядки з22по28переміщують нас у каталогwork, завантажують набір змінних із файлу даних (рядок26), розпаковують шаблон, а потім, нарешті, ми можемо розпочати генерацію нового ODF-файлу. Зверніть увагу на розділ заміни текстових рядків (рядки з30по38), що складається з кількох командsed, з'єднаних конвеєром. Кожен викликsedзамінює один рядок тексту-місцезаповнювача у файліcontent.xmlвмістом однієї зі змінних, що входять у набір, визначений у файліmy_test_data_1. Якщо ви пізніше захочете пристосувати цей скрипт для створення інших документів, це саме той розділ коду і файл з даними, які слід змінювати. Після створення нового файлуcontent.xmlвихідні зображення замінюються на ті, які ми хочемо помістити в шаблон. Це робиться за два кроки. Рядок41використовує командиtrіgrepдля вилучення та запису імен всіх картинок у файлpictures_list. Імена містяться в XML-атрибутіxlinkвсерединіcontent.xml, і в результаті має вийти щось на зразок Після цього залишається лише склеїтиnew_pictures_listіpicture_listразом, рядок за рядком (рядки з42по43), щоб отримати командний файл, формується у рядку43: Тепер усі частини готові. У залишку скрипта все просто запаковується, а розширення результуючого файлу змінюється наODT. У другому прикладі давайте розглянемо, як створювати рахунки у форматі ODF. Про те, як це зробити, статей вже повно, але у всіх вимагають запускуOOoі ручної редагування. А ми хочемо, щоб комп'ютер виконував усю роботу за нас. Процедура схожа на вже обговорену, лише простіше, бо нема картинок. Для початку налаштуйте шаблон, а потім створіть такий файл із даними: ![]() для перетворення шаблону на рахунок. Тепер запустіть скрипт, наведений нижче – він отриманий зі сценарію оболонкиtest_generator.sh, розглянутого в першому прикладі: ![]() Багато чого з цього має бути вам знайоме за описомЛістінга 1, але придивимося до рядків з19по25. Як вже згадувалося, при зміні шаблону треба додати командуsedдля кожного рядка, що замінюється. Якщо один і той же рядок зустрічається кілька разів, як це має місце для нашої підсумкової суми, не забудьте додати доsedопціюg(глобальний), інакше буде замінено лише перше входження цього рядка (див. рядок23). А що із версіями MS Office?В ідеальному світі всі перейдуть на OpenDocument та безпаперові офіси, і в цьому раю не треба буде вникати у формати файлів, які використовуються іншими людьми, або ліцензії, що дозволяють відкриття таких документів. Але поки ці дні не настали (ех ...), не обійтися без роздруківки файлів або їх конвертування для бідолах, прикутих до додатків, які розуміють тільки формати Microsoft Office 16. На щастя і конвертувати, і друкувати можна автоматично. Однак, на відміну від генерації файлів ODF, на цьому кроці необхіднийOpenOffice.org. Потрібно додати до вашого скрипта рядок, який запускатимеOpenOffice.orgбез графічного інтерфейсу, а потім виконувати макросOOoдля конвертування ODF-файлу у формати PDF (для друку) або DOC. Для досягнення цієї мети є кілька макросів; два найкращі –SaveAsPDFтаSaveAsDoc, з сайту http://www.xml.com/pub/a/2006/01/11/from-microsoftto-openoffice.html. Альтернативний макрос генерації PDF є на сайті http://linux.derkeiler.com/Mailing-Lists/Fedora/2008‑06/msg00561.html. Щоб роздрукувати PDF-файл зі скрипту, його можна просто «годувати» командіlPr. ВикористанняOpenOffice.orgвкомандний рядок описано в http://tinyurl.com/rybr9d, але я, так і бути, покажу вам коректний синтаксис: Опція-invisibleзмушуєOpenOffice.orgзапускатися без графічного інтерфейсу. Файл, що обробляється, повинен передаватися як аргумент ($FILE) макросу. Що ми дізналися?На цьому уроці ми вивчили метод автоматизації завдань з документами, що має кілька важливих переваг. Перш за все він працює без запускуOpenOffice.org(за винятком друку), тобто його можна виконувати на сервері. Метод також не спирається на жодні реляційні бази даних; а крім цього, дуже простий! У багатьох випадках, коли XML-інструменти (на кшталт описаних у врізці Ресурси внизу) занадто складні для вивчення та встановлення, використання наведених тут хитрощів допоможе хоча б уникнути втрати часу на редагування, що повторюється. По суті, будь-хто, маючи початковий рівень знань про сценарії оболонки, може генерувати, змінювати та аналізувати сотні текстових ODF-документів, покодувавши пару хвилин. Але наведений процес привабливий не лише завдяки легкості використання. По-перше, основи даного процесу, за ідеєю, досить добре вам знайомі. Ми вважаємо, що більшість користувачів Linux комфортніше почуваються зі скриптамиBash, ніж уStarBasic- мовою написання макросівOOo. Що призводить нас до основної причини, через яку ми уникаємо макросівOOo: реалізація логіки рішення позаOpenOffice.orgнадає набагато більшої сили, гнучкості та потенціалу інтеграції з іншими інструментами, від завданьCronдо масових розсилок та обробки графіки. Наприклад, можна запросто додати в перший скрипт інструментиImageMagick(LXF116–LXF117) тамасштабувати та кадрувати зображення, перш ніж поміщати їх у ODF-документ! Зрозуміло, два представлені скрипти не ідеальні. Вони не гнучкі або розширювані, і в даному виді не зовсім надійні. Перш за все, тут немає обробки помилок: якщо один із файлів відсутній, або генератору тестів видано більше картинок, ніж є у вихідному шаблоні, то все піде наперекосяк, без жодного повідомлення про те, що сталося. |




