Як зробити веб-сервіс для конвертації файлів Excel, Word, TXT та інших у PDF у режимі «як бачу»
Звідки пішла безглузда звичка зберігати рахунки, бухгалтерські та фінансові документи у форматі MS Excel? Навіщо зберігати та передавати документи, призначені для друку у форматі електронної таблиці, якщо є спеціальний формат PDF? Проте, у всіх бухгалтерських програмах документи насамперед обов'язково експортуються до MS Excel і потім пропонуються альтернативні способи збереження документів. Від сюди і постало завдання: нехай бухгалтер зберігає свої документи як хоче, але клієнт повинен отримати їх у форматі PDF і обов'язково точно в тому образі, який бухгалтер створив у шаблоні MS Excel. В якості бухгалтерської програми ми використовували безкоштовну ЗС: Бухгалтерію. (Правду сказати з цієї програми можна відразу зберігати документи в PDF, але якщо сказали excel, значить – excel.) Бухгалтер вивантажує XLS-файл у певний каталог на диску, звідки ми повинні його забрати, перекласти в PDF і зберегти в інший каталог. Все це має бути реалізовано у вигляді веб-сервісу, тобто клієнт має побачити та мати можливість скачати свої pdf-документи у «Особистому кабінеті» на сайті.
Шляхи вирішення:
Перше, що захотілося зробити, – знайти готову бібліотеку для PHP або Perl і прямо «на льоту» конвертувати файли. Такі бібліотеки для роботи з форматом Excel дійсно знайшлися, наприклад: PHPExcel, PHPExcelReader, Spreadsheet::ParseExcel та ін. Ці бібліотеки дійсно добре працюють, але роблять саме те, для чого призначені: вишукують дані в електронній таблиці Excel і оперують із нею. Нам же потрібно зовсім інше – отримати екселівську таблицю у вигляді як для друку, з усіма картинками з печатками та підписами, з форматами шрифтів та осередків.
Другий варіант рішення – віртуальний принтер. Суть його в тому, що мивідкриваємо файл у відповідній програмі та відправляємо його на друк, але не на справжній принтер, а – на віртуальний, який замість паперу збереже у файл, спочатку у постскрипт форматі ps, а потім зробить з нього PDF-файл. Оскільки система до всього ще й має функціонувати як веб-сервіс, я вибрав як платформу Linux з Apache. А як програма, яка вміє відкривати всі файли MS Office – безкоштовний OpenOffice.org 3.4
Отже, що робимо:
Встановлюємо OpenOffice. У посібнику зі встановлення конвертера PyODConverter пропонують встановлювати версію OpenOffice.org 2.4 обов'язково -headless, але я просто встановив OpenOffice.org 3.4 з репозиторію і все вийшло. Після встановлення я спробував запустити програму, але система відмовилася, захотівши ще Java Runtime Environment. А чи потрібний він? Виявилось, що ні. І запускати OpenOffice повністю, щоб відправити файл на віртуальний принтер зовсім ні до чого. Програма має чудовий конвертер у pdf, який легко викликати з командного рядка.
Робиться це так:
Створюємо конвертер у PDF
Створюємо bash-файл, наприклад, з ім'ямconverter.sh
Виставте права для запуску скрипта converter.sh (755) Помістіть в один каталог із цим скриптом (converter.sh) Excel-файл під ім'ям sample.xls, запустіть скрипт converter.sh і в каталозі з'явиться файл sample.pdf, який буде копією друкованого вигляду екселівського файлу.
Пів справи зроблено. Тепер нам потрібно організувати процес конвертації у вигляді веб-сервісу. Можна, звичайно, помістити файл converter.sh в каталог /cgi-bin/ Apache і запускати відразу його, але тут вже починаються завдання безпеки. До питання безпеки такого сервісу потрібно підійти дуже ретельно, адже ми збираємося передавати скрипту.невідомі файли та дозволяти йому зберігати невідомо що на диску. Правильний підхід – це розмістити файл converter.sh вище DOCUMENT_ROOT Apache, а звертатися до нього через скрипт-посередник, наприклад, на perl, який лежатиме в каталозі /cgi-bin/ і ретельно перевірятиме всі параметри, що передаються в converter. sh.
Які виявилися проблеми після реалізації сервісу конвертації. Виявилося, що Linux не розуміє файли з іменами українських букв у кодуванні windows-1251. Що можна зробити: 1. Умовити бухгалтера зберігати файли з латинськими іменами (складно) 2. Конвертувати ім'я файлу в utf-8 під час завантаження в каталог (цілком реально) 3. Реалізувати аналогічний сервіс під Windows – Apache (спробую)
Під Windows конвертер реалізувати теж виявилося нескладно
Я зробив так: 1. Завантажив та встановив LibreOffice 3.4 2. Завантажив PyODConverter 3. Зберіг файл DocumentConverter.py у робочому каталозі, наприклад, C:\test\ 4. Змінив у файлі DocumentConverter.py константу DEFAULT_OPENOFFICE_PORT = 8100 (за замовчуванням там було вказано інший порт) 5. Помістив у каталог C: test пробний файл для конвертації – test.xls
Тепер запускаємо процес конвертації. Спочатку запускаємо OpenOffice у прихованому режимі. У командному рядку (cmd) пишемо:
"C:\Program Files\LibreOffice.org 3.4\program\soffice.exe" -headless -nologo -norestore -accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager
Тут важливо, щоб порт збігався з DEFAULT_OPENOFFICE_PORT
Тепер запускаємо конвертацію: "C:\Program Files\LibreOffice.org 3.4\program\python" c:\test\DocumentConverter.py c:\test\test.xls c:\test\test.pdf
І в каталозі c:\test\ виявляємо конвертований PDF-файл.
Ось і готовий конвертерфайлів xls, doc, docx, rtf, txt, odt, ott, sxw, stw, html, xml, загалом, що відкриє OpenOffice.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»