УДК 004.91
А.В. Авдеев, А.С. Шемякин
Институт информатики и математического моделирования технологических процессов Кольского НЦ РАН
АВТОМАТИЗАЦИЯ КОНВЕРТАЦИИ ДОКУМЕНТОВ MS OFFICE В ФОРМАТ PDF НА ВЕБ-СЕРВЕРЕ ПОД УПРАВЛЕНИЕМ CENTOS LINUX*
Аннотация
В данной работе представлен механизм загрузки документов MS Office на вебсервер, работающий под управлением OS Linux (CentOS 7.3 x 64), и конвертации загруженных файлов в формат PDF. Механизм загрузки и конвертации файлов реализован на языке Python с использованием фреймворка Django. Конвертация документов MS Office в формат PDF осуществляется при помощи LibreOffice и скрипта Unoconv.
Ключевые слова:
python, LibreOffice, PDF, обработка документов.
A.V. Avdeev, A.S. Shemyakin
AUTOMATING CONVERSION OF MS OFFICE DOCUMENTS TO PDF ON A WEB SERVER RUNNING CENTOS LINUX
Abstract
This paper presents the mechanism of loading of MS Office documents on a web server running OS Linux (CentOS x64 7.3) and convert the downloaded files to a PDF. The mechanics of downloading and converting files is implemented in Python using the framework Django. Convert MS Office documents to PDF format is done using LibreOffice and Unoconv script.
Keywords:
python, LibreOffice, PDF, document processing.
В [4] была представлена программная система, позволяющая автоматизировать разработку планирующей документации. Система позволяет загружать документы в формате MS Office - doc, rtf, docx, odt. Хранение в базе данных файлов в таком формате не представляет сложностей, однако возникают проблемы с отображением таких файлов в окне браузера - требуется предварительная конвертация в формат HTML. Такая конвертация требует использования сторонних библиотек, например, Aspose [2]. Следует отметить, что на возможность выбора библиотеки может существенно повлиять выбор языка программирования, на котором создается программная система.
Формат HTML рассчитан на отображение текста с простым форматированием и не предназначен для отображения сложных документов, содержащих, например, колонтитулы, формулы, разделы с различным форматированием. Формат PDF позволяет обойти эти ограничения, т.к. предназначен для представления полиграфической продукции в электронном виде [3].
* Работа выполнена при поддержке РФФИ, проекты № 15-29-06973, № 16-07-00562.
В настоящее время современные браузеры имеют встроенные средства для отображения PDF. Представляется целесообразной идея конвертации документов в данный формат, а затем удобный их просмотр средствами браузера. В данной работе представлен механизм пакетной загрузки файлов MS Office на сервер, работающий под управлением OS Linux (CentOS 7.3 x 64), и дальнейшая автоматическая пакетная конвертация загруженных файлов в формат PDF. В ходе работы с системой [1] у пользователя может возникнуть необходимость загрузить большое количество документов различных форматов на веб-сервер; чтобы избавить пользователя от рутинной процедуры конвертирования каждого загружаемого файла в формат PDF вручную предусмотрен механизм пакетной загрузки и конвертирования загруженных файлов. Для решения этой задачи и были выбраны следующие инструменты:
• веб-фреймворк Django 1.10.3 (модифицированная лицензия BSD) -свободный фреймворк на языке Python для веб-приложений [4].
• Unoconv (лицензия GNU GPL) - скрипт-обёртка для работы с OpenOffice (Лицензия Apache) [5].
• LibreOffice (лицензия GNU GPL и MPL) - свободнораспост-раняемый офисный пакет с открытым исходным кодом, ответвление OpenOffice [6].
• расширенный текстовый редактор Atom (лицензия MIT) с плагинами ftp-remote-edit (MIT), python-indent (MIT) и др. [7].
Unoconv - консольная программа, предназначенная для преобра-зования офисных форматов между собой. Она использует надстройку (интерфейс/API) UNO в LibreOffice для интерактивного преобразования документов и, следовательно, нуждается в установленном LibreOffice или OpenOffice. Данная программа удобна пакетной автоматической конвертации форматов между собой.
Пример вызова программы из командной строки: unoconv - f pdf some-file.odt. В данном примере аргумент "-f' указывает на конечный формат документа, а аргумент "some-file.odt" - на документ, который нужно преобразовать. При выполнении данной команды из директории, в которой находится файл "some-file.odt" мы получим в этой же директории файл "some-file.pdf". Для пакетного преобразования. например, всех файлов формата doc, достаточно последним аргументом передать "*.doc".
Фреймворк примерно соответствует архитектуре MVC ("модель — вид — контроллер"), точнее ему соответствует модель MTV ("модель — шаблон — вид") [8].
Согласно архитектуре фреймворка Django приложение разбито на логические составляющие: модель, шаблон и вид (представление) (рис.).
Архитектура MTV
Для хранения документов, загружаемых на сервер, в базе созданы следующие модели:
1 from future import unicode literals
2 from django.db import models
3 class Doc(models.Model):
4 title = models.CharField(max length=255, blank=True)
5 file = models.FileField(upload to='doc/')
6 uploaded at = models.DateTimeField(auto now add=True)
7 parrent dir = models.ForeignKey('Dirs', blank=True)
8
9 class Dirs(models.Model):
10 dir name = models.CharField(max length=255, blank=True)
Данная модель описывает две таблицы в создаваемой БД. «Doc» служит для хранения информации о загружаемых файлах, «Dirs» хранит информацию о принадлежности документа к определенной категории.
В строке 3 объявляется функция Doc, которая служит для генерации новой таблицы в БД. В строке 4 задается название документа, в строке 5 задается путь до конечной папки загрузки (относительно папки с проектом), а в строке 6 - дата создания записи.
Следующий компонент архитектуры МУС - вид, отвечающий за обработку загрузки файлов в проект.
1 from django.views import View
2 import subprocess, os
3 from .forms import DocForm
4 from .models import Doc
10 class ProgressBarUpload (View):
12 def get(self, request):
13 docs list = Doc.objects.all()
14 return render(self.request, 'docs/progress bar upload/index.html', {'docs': docs_list})
15 def post(self, request):
16 form = DocForm(self.request.POST, self.request.FILES)
17 if form.is valid():
18 doc = form.save()
19 data = {'is valid': True, 'name': doc.file.name, 'url': doc.file.url}
20 else:
21 data = {'is_valid': False}
22 return JsonResponse(data)
Данная функция выполняет загрузку файлов, а JavaScript на странице пользователя показывает прогресс данной операции, в строках 19 - 22 происходит асинхронная (без перезагрузки страницы) передача данных.
Там же в представлении выполняется преобразование файлов в формат
Pdf:
41 def all to pdf(request):
42 doc list = Doc.objects.all()
43 pa = '/home/user/doc env/multiple/media/'
44 for doc in doc_list:
45 if doc.file.name.split('.')[1] != 'pdf': 4 6 pam = doc.file.name
47 subprocess.call('unoconv '+pa+pam, shell=True)
48 dox = '.'+(pam.split('.')[-1])
49 Doc.objects.filter(file = pam).update(file = pam.replace(dox,".pdf"))
50 return render(request,
'docs/progress bar upload/index.html', {'docs': doc list})
В строке 41 объявляется функция для преобразования, переменная «pa» (строка 43) хранит путь до рабочего каталога с документами, далее циклом (строки 44 - 49) перебираем все файлы в БД. Если файл имеет формат отличный
от PDF (строка 45), то в переменную «pam» записывается путь относительно рабочей папки и передается процессу «unoconv» с указанием пути к файлу (строка 47, shell=True служит для получения отладочной информации).
Собственно конвертация осуществляется вызовом функции subprocess.call.
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None) - выполняет команду, описанную args. Ожидает завершения команды, а затем возвращает код возврата. Например, команда «subprocess.caU('uname -r', shell=True)» выведет номер выпуска операционной системы (для CentOS 7.3 x64 установленной на сервере - «2.6.32-042stab123.3»)
[9].
Далее запись о первоначально загруженном файле в БД заменяется новой записью о файле уже с расширением PDF.
Последний компонент архитектуры MVC - шаблон, служит для вывода списка доступных для просмотра документов уже непосредственно языком HTML в браузере пользователя:
1{% extends "docs/base.html" %} 2{% load static %} 3{% block docs_content %} 4
5<table id-'gallery" class="table table-bordered">
6 <tbody>
7{% for doc in docs %}
8 <tr>
9 <td><ahref="{{ doc.file.url }}">{{ doc.file.name }}</a></td>
10 </tr> 11{% endfor %} 12</tbody> 13</table>
14
15{% endblock %} Заключение
В данной работе представлен механизм загрузки документов MS Office на сервер, работающий под управлением OS Linux (CentOS 7.3 x 64), и конвертации загруженных файлов в формат PDF. Механизм загрузки и конвертации файлов реализован на языке Python с использованием фреймворка Django. Конвертация документов MS Office в формат PDF осуществляется при помощи LibreOffice и скрипта Unoconv.
Поскольку все используемые инструменты являются свободно распространяемыми программными продуктами, то использование связки LibreOffice+Unoconv+PDF позволяет существенно сократить расходы на серверное программное обеспечение.
Литература
1. Шемякин, А.С. Автоматизация разработки планирующей документации по снижению промышленно-экологических рисков / А.С. Шемякин, С.Ю. Яковлев, Ю.А. Олейник, А.В. Маслобоев // Вестник Иркутского государственного технического университета. - 2016. -Т.20. -№9. -С.74-85. DOI: 10.21285/1814-3520-2016-9-74-85.
2. NET Java Android SharePoint Cloud APIs for Word Document formats.
- Режим доступа: https: //www.aspose .com/products/words
3. Portable Document Format. - Режим доступа: https://ru.wikipedia.org/wiki/Portable Document Format
4. Django makes it easier to build better Web apps more quickly and with less code.
- Режим доступа: https://www.djangoproject.com/
5. Universal Office Converter - Convert between any document format supported by LibreOffice/OpenOffice.
- Режим доступа: https: //github.com/dagwieers/unoconv
6. LibreOffice - мощный офисный пакет, полностью совместимый с 32/64-битными системами. - Режим доступа: http://ru.libreoffice.org/
7. A hackable text editor. - Режим доступа: https://atom.io/
8. Django Documentation. FAQ: General. - Режим доступа: https://docs.djangoproject.com/en/1.11/faq/general/
9. Subprocess - Subprocess management. - Режим доступа: https://docs.python.org/3/library/subprocess.html
Сведения об авторах
Шемякин Алексей Сергеевич - младший научный сотрудник,
е-mail: shemyakin@iimm. ru
Alexey S. Shemyakin - junior researcher
Авдеев Алексей Васильевич - стажер-исследователь,
e-mail: [email protected]
Alexey V. Avdeev - research assistant