Lazarus. Багатоплатформовий документообіг.

  1. 1. Формат Open Document
  2. 2. Робота з архівами в Lazarus
  3. Розробляємо скрипт.
  4. Запуск скриптів і bat-файлів зі своєї програми.

Як я вже зазначав в   блозі   , Є плани перейти на програмування в Lazarus Як я вже зазначав в блозі , Є плани перейти на програмування в Lazarus. З огляду на, що вже зараз вирішується питання про те, щоб перевести всі машини на роботі під управління Linux з нового року, можна починати чесати ріпу і думати яким чином перегнати великий програмний комплекс для екологів поту ж Ubuntu. Найгостріша проблема - документи. Як не крути, а звіт створений в тому ж Excel або Word, виглядає набагато привабливіше, ніж простий текстовік. Подивимося, що можна зробити в разі роботи під Linux не втратити презентабельність документів.

В принципі варіантів не так вже й багато.

Перший варіант - генерувати простий html-файл. Гідність цього підходу очевидно - простота при розробці програм. Якщо врахувати, що Lazarus цілком добре справляється з DOM, то є можливість не тільки видавати документ на друк, але і, в разі необхідності, проводити його аналіз.

Недолік такого підходу - досить важко сформувати чіткий документ, якщо в ньому зустрічається велика кількість формул, діаграм і т.д.

Другий варіант - скористатися наявними можливостями OpenOffice. На даний момент цей варіант мені найбільше подобається. Що відразу кинулося в очі при вивченні документації по OO - це те, що в документі математичні формули зберігаються точно також як і простий текст. Тобто відразу з'являється купа можливостей щодо формування складних за складом і змістом звітів і документів.

Пригадується, коли тільки починав розробляти першу версію програми, не міг зрозуміти як працювати з Delphi з MathType (надбудова в office для малювання формул). У підсумку, так і не зрозумівши як це робиться писав все формули в рядок простим текстом - корявенько і незграбно, але читаемо. З OpenOffice + Lazarus все по іншому - можна розписувати хоч 10-ти поверхові дробу.

Додатковим стимулом до використання форматів OpenOffice послужило також те, що в цьому випадку можна створити 100% кросплатформенних проект і вже не морочитися над тим, яку ОС задумають поставити адміни на машинах в наступному році - OpenOffice без проблем працює всюди.

Подивимося, що з себе в принципі являє документ OpenOffice, наприклад, візьмемо файл writer'а * .odt (аналог Word).

1. Формат Open Document

Власне, для тих, хто має хоча б загальні уявлення про будову XML-файла, не складе особливих труднощів розібратися і з форматом Open Document.

Справа в тому, що будь-який документ з OpenOffice (текстовий, таблиця, презентація, формула) являє собою простий zip-архів всередині якого міститися XML-файли, кожен з яких містить будь-яку інформацію про документ.

Більш того, сам зміст і розташування файлів в архіві біса нагадує мені сайти на narod.ru :). Ось, наприклад, вміст Файа * .odt в якому міститься всього один рядок по центру сторінки - "hello world"

Тут, напевно, розбереться навіть дитина, що основний вміст документа розташовується в файлі content.xml. Подивимося, як виглядає наша рядок Hello world ". Відкриваємо файл в браузері і бачимо:

Все ті ж знайомі вузли XML і не менш знайомі атрибути типу center тощо.
Виходить наступне. Якщо необхідно створювати документи з якого-небудь шаблоном (що мені найбільш часто і доводиться робити), то досить накидати шаблон документа і распакавать його в будь-яку папку, потім вже в своїй програмі відкрити потрібний xml-файл, змінити і запокавать назад в zip -архів, але з розширенням файлу Open Document. І ніяких тобі OLE і т.д. і т.п. Організовується все елементарно і без будь-яких сторонніх компонентів.
Якщо ж Вам потрібно розробляти документи якогось унікального змісту, то тут Вам, як не крути, доведеться з головою зануритися в документацію по Open Document Format. Благо така документація є у відкритому доступі і завантажити її можна, наприклад тут .

Отже, перший крок до розробки кроссплатформенного проекту зроблено - визначилися з форматами документів і в загальних рисах уявляємо собі алгоритм роботи.
Залишається вирішити питання з тим, як пакувати документ? Іспользоать dll, будь-який компонент або обійтися тим, що є в Lazarus?

2. Робота з архівами в Lazarus

Особисто я прихильник того підходу до розробки будь-яких програм, при якому по можливості не використовуються будь-які сторонні компоненти - тільки "рідні" компоненти і модулі.
Ця обставина позбавляє як мінімум від одного геморою - не треба за собою всюди тягати хмару сторонніх компонентів, щоб проект без проблем відкривався на будь-якому комп'ютері.
Так і в разі роботи з архівами в Lazarus - ніхто нам не забороняє скористатися компонентами, наприклад з Сторінка Wiki Lazarus . Але навіщо накручувати зайві компоненти, коли для роботи з zip-архівами в складі Lazarus є цілком зрозуміла і проста у використанні утиліта ZIP?
Скористаємося їй, а заодно подивимося, як можна обійтися в роботі зі сторонніми додатками без всяких ShellExecute, ShellAPI тощо.

Отже, пишемо свій перший багатоплатформовий архіватор, який потім використовуватимемо для збірки документів OpenOffice.
Відкриваємо Lazarus, створюємо нові проект і, для наочності роботи програми, укладаємо на форму дві кнопки і Memo.
Найпростіший варіант роботи з утилітами зразок zip і unzip - це використовувати в Win32 пакетні файли DOS (* .bat), а в Linuх - bash-скрипти. Сенс роботи простий як три копійки:
1. В залежності від того в якій ОС запущена програма, створюємо або файл скрипта з розширенням sh, або bat-файл
2. Виконуємо скрипт, який пакує необхідні файли в документ.

Розробляємо скрипт.

Думаю, що тим, хто знайомий з Linux, написати скрипт для упаковки папки в архів потрібно на все пара хвилин, а то й менше. Текст скрипта виглядає наступним чином:

#! / Bin / bash cd / шлях / до / папки / с_файламі zip -r Документ.расшіреніе *

Зверну Вашу увагу, що перехід в папку з докуменов необхідний, тому що якщо просто вказати утиліті zip розташування файлів, то в підсумку в архів буде записаний весь шлях до файлів і документ просто не розпізнається як Open Document.
У випадку з bat-файлів все також просто і зрозуміло:

CD Полнийпутьдопапкі Полнийпутьк_утілітеzip -r Document.расшіреніе Полнийпутьдопапкі

Обидва файли працюють абсолютно ідентично - пакують всю папку, яка містить xml-файли документа в один архів.
З допоміжною частиною покінчено. Переходимо в Lazarus.

Перше, що необхідно - це написати обробник однієї з кнопок для створення необхідного нам файлу в залежності від Осі. У мене вийшов наступний код:

procedure TForm1.Button2Click (Sender: TObject); var F: TextFile; begin AssignFile (F, ExtractFilePath (Application.ExeName) + 'mybash.sh'); Rewrite (F); {$ IFDEF LINUX} WriteLn (F, '#! / Bin / bash'); WriteLn (F, 'cd' + ExtractFilePath (Application.ExeName) + 'document'); WriteLn (F, 'zip -r doc.odt *'); CloseFile (F); Memo1.Lines.LoadFromFile (ExtractFilePath (Application.ExeName) + 'mybash.sh'); {$ ENDIF} {$ IFDEF WIN32} WriteLn (F, 'CD' + ExtractFilePath (Application.ExeName) + 'document'); WriteLn (F, ExtractFilePath (Application.ExeName) + 'zip -r doc.odt' + ExtractFilePath (Application.ExeName) + 'document'); CloseFile (F); Memo1.Lines.LoadFromFile (ExtractFilePath (Application.ExeName) + 'mybash.bat'); {$ ENDIF} end;

Зверніть увагу, що для того, щоб дізнатися під який ОС ми запустили програму, нам не потрібно знущатися і писати зайві процедури і функції - досить використовувати простенькі директиви "{$ IFDEF}" і "{$ ENDIF}".
У представленому обработчике в залежності від операційної системи в якій запущено додаток створюється свій файл для упаковки папки з xml-файлами документа і вміст файлу виводиться в Memo.
Тепер подивимося, як під Lazarus'ом можна запускати сторонні додатки.

Запуск скриптів і bat-файлів зі своєї програми.

Для того, щоб запустити будь-яку програму або виконати скрипт в своєму додатку і при цьому не порушити кроссплатформенность, в Lazarus передбачено використання класу TProcess або, кому зручніше використовувати компоненти, відразу три невізуальних компонента TProcess * cо вкладки System:

Укладаємо на форму сами простий з трьох компонентів - TProcess і в обробнику другої кнопки пишемо:

procedure TForm1.Button1Click (Sender: TObject); begin {$ IFDEF LINUX} Process1.CommandLine: = '/ bin / bash' + ExtractFilePath (Application.ExeName) + 'mybash.sh'; {$ ENDIF} {$ IFDEF WIN32} Process1.CommandLine: = 'cmd' + ExtractFilePath (Application.ExeName) + 'mybash.bat'; {$ ENDIF} Process1.Options: = [poWaitOnExit]; Process1.Execute; end;

Тут знову ж таки, як мені здається, особливих складнощів немає - в залежності від операційної сисема запускаємо на виконання потрібний файлик і очікуємо закінчення виконання. Аналогічним чином можна запускати абсолютно будь-які програми та додатки, відстежувати висновок консольних програм і т.д. і т.п. Щоб зайвий раз не повторюватися і копіпаст чужий текст - я просто скажу, що більш детально з працюй компонента TProcess Ви завжди можете ознайомитися в Wiki Lazarus .
Ось тепер у нас в руках є все необхідне для роботи з документами в будь-якій операційній системі. Головне, не забудьте перенести утиліту zip.exe, що входить в смоктав Lazarus до себе в проект.
Які висновки можна зробити? По-перше, робота з документами в Lazarus і OpenOffice, особисто для мене виявилася набагато простіше, ніж я очікував. Все, що потрібно - розробити грамотний шаблон і потім трохи попрацювати з XML. По-друге, використання утиліти zip позбавляє нас від використання сторонніх компонентів (не дай бог езё і платних). По-третє, розробка кроссплатформенного додатки для роботи з документами виявилася знову ж таки не складніше, ніж під чисто під Win32 - досить не забувати про елементарні директиви компілятора. Так що, якщо Вас раптом постінет та ж проблема, що і мене - перехід під іншу ОС, то можете сильно не переживати - організувати документоооборот буде не складніше, а навіть в деякому сенсі простіше, ніж для Win32 з використанням Microsoft Office.

Залишається вирішити питання з тим, як пакувати документ?
Іспользоать dll, будь-який компонент або обійтися тим, що є в Lazarus?
Але навіщо накручувати зайві компоненти, коли для роботи з zip-архівами в складі Lazarus є цілком зрозуміла і проста у використанні утиліта ZIP?
Які висновки можна зробити?

Дополнительная информация

rss
Карта