Широко відомо, що за допомогою OpenOffice 2.0, відкритої альтернативи пакету Microsoft Office, можна відкривати файли, створені в Microsoft Office, і потім зберігати їх в рідному форматі OpenOffice - zip-архіві, що містить документ у вигляді XML-файла, що відповідає стандарту OpenDocument від OASIS . Таким чином можна перетворювати в новий формат існуючі документи Word, таблиці Excel і презентації PowerPoint. (У статті Opening Open Formats with XSLT на XML.com наводиться приклад простого додатка, що використовує ці можливості: XSL -шаблон, який витягує заголовки слайдів і замітки з файлу з презентацією і зберігає їх в окремий файл, який ви могли б використовувати як план свого виступу.) Більш того, OpenOffice дозволяє експортувати всі ці види файлів в формат PDF.
Якщо ви збираєтеся перетворювати ваші файли в новий формат по одному, то вам доведеться відкрити і заповнити кілька діалогових вікон для кожного файлу. Якщо вам потрібно перетворити кілька сотень файлів, то такий підхід виявиться скрутним. Що ж робити, якщо у вас є велика купа документів Word, таблиць Excel і презентацій PowerPoint, і вам потрібно завантажити XML-версії всіх файлів в одну базу даних, яка підтримувала б запити до вмісту цих XML-документів? Наприклад, якщо ви - це штат Массачусетс або фірма IBM?
Як і в продукті фірми Microsoft, в OpenOffice є макромова. При запуску OpenOffice з командного рядка Linux або Windows можна вказувати, щоб виконався певний макрос. Можна навіть передати цього макросу як параметр ім'я файлу. Далі, якщо використовувати ключ -invisible при запуску OpenOffice з командного рядка, то його графічний інтерфейс (GUI) не буде доступний широкому. А якщо задіяти обидві цих можливості разом, то вийде командний рядок, яка перетворює файл Microsoft Office в файл OpenOffice (або в файл Acrobat) без будь-якого GUI. Тепер, щоб перетворити сотню файлів, досить простого скрипта (наприклад, на мові Perl), щоб створити пакетний файл або шелл-скрипт з сотні команд, кожна з яких перетворює один файл.
(Зауваження: макроси, який надихнули мене на створення цієї статті, явно були написані для OpenOffice 1. x. - але той макрос, який я з них зібрав, був протестований мною в OpenOffice 2.0 в Windows і в Linux.)
Створення макросів для перетворення
Всі процедури, які знадобляться в ваших макросах, наведені нижче. Щоб створити в OpenOffice модуль макросів і зберегти в нього ці процедури, виберіть пункт меню Tools → Macros і потім Organize Macros, OpenOffice.org Basic, Organizer, New. Створиться новий модуль макросів. Назвіть його MyConversions і закрийте діалогове вікно.
Новий модуль буде відображатися в дереві макросів під ім'ям / My Macros / Standard / MyConversions. як показано нижче:
Виберіть модуль MyConversions і натисніть кнопку Edit. У який з'явився скрипті рядки Sub Main і End Main служать шаблоном для майбутнього макросу. Замініть їх наступним кодом, після чого збережіть модуль:
Мова OpenOffice Basic схожий на VBA - мова макросів в Microsoft Office; VBA схожий на Visual Basic, а він, у свою чергу, - на той самий BASIC, який для тих з нас, хто постарше, був першим вивченим мовою програмування. Я не заглиблювався ні в один з цих мов, але якщо вам щось буде неясно щодо їх синтаксису, то відповіді досить легко знаходяться декількома запитами до Google. Наприклад, я зовсім не уявляв собі, як записати оператор вибору в процедурі SaveAsOOO. але знайшов всю необхідну інформацію за допомогою Google і довідки OpenOffice.
Весь код складається з трьох процедур і однієї функції. Процедура SaveAsPDF і функція MakePropertyValue взяті з повідомлення на форумі OpenOffice. Процедура SaveAsDoc відрізняється від SaveAsPDF тільки параметром, переданим в MakePropertyValue. - назвою фільтра експорту. Якщо ви хочете додати процедури для збереження таблиць OpenOffice в файли Excel, або презентацій OpenOffice Impress в файли PowerPoint, то все що вам потрібно - взяти копію однієї з цих процедур і змінити в ній назву фільтра експорту і розширення нового файлу.
Що чудово в процедурі SaveAsOOO - це її універсальність. Вам не потрібно визначати, чим є вхідний файл - документом Word, таблицею Excel або презентацією PowerPoint, і не потрібно вказувати формат для нового файлу. OpenOffice визначить все це сам. І як ви бачите, єдина істотна відмінність цієї процедури від SaveAsPDF - то, що я додав код, що визначає для нового файлу правильне розширення.
запуск перетворення
Макроси можна запускати з командного рядка незалежно від того, чи відкритий у цей момент OpenOffice, або ви з нього вже вийшли. Приблизно так повинна виглядати командний рядок для перетворення файлу Word в формат OpenOffice на комп'ютері з Windows, розбита тут на два рядки:
На моєму комп'ютері файл soffice.exe не перебуває у шляху пошуку виконуваних файлів, тому я змушений вказувати для нього повний шлях - укладений в лапки, бо він містить прогалини. Ключ -invisible вказує OpenOffice, що не потрібно показувати екран з привітанням, створювати документ за замовчуванням, і взагалі відображати будь-якої GUI. (Щоб побачити список всіх доступних ключів, спробуйте запустити soffice.exe з командного рядка, задавши єдиний параметр -?) Ім'я макросу вказується у вигляді, схожому на URL: спочатку шлях в дереві макросів до потрібного макросу, потім параметр в дужках - ім'я файлу, який Ви бажаєте перевести. Вказувати ім'я для нового файлу не потрібно - макрос вибере його сам в залежності від вихідного імені і виконуваного перетворення.
У Linux в командному рядку потрібно вказувати інше ім'я виконуваного файлу. Установник OpenOffice в моїй Ubuntu помістив файл ooffice2 в шлях пошуку файлів, так що мені не доводиться вказувати при його запуску повний шлях. Я уклав виклик макросу в лапки, бо інакше знаходяться в ньому дужки неправильно оброблялися оболонкою. У всіх інших відносинах ті ж самі макроси, що були створені описаним вище способом, працювали чудово.
Я спробував перетворити кілька різних файлів. Тестовий файл sample.doc лежить у мене вже кілька років для випробування програм і сервісів, які пропонують перетворювати файли Word в XML. У цьому файлі використовуються вбудовані і призначені для користувача стилі для абзаців і знаків, вкладені марковані списки, зображення, таблиця з об'єднаними осередками, вкладена таблиця Excel, і ще кілька речей, на яких може спіткнутися програма для перетворення. SaveAsOOO з цим файлом прекрасно впорався.
Давайте перетворимо файли MS Office
Тепер, коли у вас є відкритий багатоплатформений інструмент для перетворення нових і старих (по крайней мере, аж до Office 97) файлів MS Office в XML-документи відкритого стандарту, як же найкраще скористатися цим інструментом? Все, що може запускатися з командного рядка, може використовуватися в пакетному режимі - без втручання користувача. Можна створити Perl-скрипт, який би брав список вхідних файлів і створював пакетний файл або шелл-скрипт з послідовності команд, подібних наведеним вище, які б перетворювали по одному файлу. Якщо те, що вам насправді потрібно - сам XML-документ, то цей скрипт може заодно витягувати його з zip-архіву, яким є файл OpenOffice, і перейменовувати відповідним чином. Шелл-скрипт, який виконує все це, виглядає так:
Пакетний файл для Windows:
Якщо ви збираєтеся регулярно перетворювати велике число документів, то запуск нового примірника OpenOffice для кожного перетворення буде істотно сповільнити весь процес. У Windows файл soffice.exe можна запустити в режимі «швидкого старту» (з ключем -quickstart); тоді запускаються після цього перетворення будуть виконуватися швидше. Крім цього, можна за допомогою ключа -accept вказати рядок Universal Network Objects. яка дозволила б, використовуючи API, управляти запущеним екземпляром OpenOffice з програми, написаної на C ++, OpenOffice Basic, Python. Java або іншими мовами. В цьому випадку можна було б передавати імена документів для перетворення в запущений екземпляр OpenOffice, використовуючи виклики API.
Найцікавішою можливістю, яку надає цей підхід, на мою думку навіть не перетворення присилаються мені нових файлів Word і Excel в XML-формат OpenOffice, - а перетворення наявних старих документів. Скільки у вас є старих файлів Microsoft Office? Скільки нових застосувань ви знайшли б міститься в них інформації, якби вона була представлена у відкритому і документированном XML-форматі, і ви могли б використовувати для роботи з цією інформацією будь-XML-інструменти? З огляду на, що все це тепер можливо з використанням відкритого програмного забезпечення, що працює і в Windows, і в Linux, перед нами повинні відкриватися величезні нові можливості.