Хотелось бы иметь общий формат документа, из которого можно было бы в легкую переводить в doc (word), pdf, html форматы.
В проекте django-webodt был выбран формат ODF.
Описание проекта из README:
django-webodt - это django модуль для создания документов различных форматов из формата Open Document Templates.
Django-webodt поддерживает виртуально все форматы через backend приложения. Есть позитивный опыт создания PDF, HTML, RDF and MS Word (.doc) документов.
Конверсия документов производится с помощью внешних приложений, где приложения работают в django-webodt через backend's
ooffice: Используется опенофис для конвертирования в различные форматы. Опен офис должен быть запущен как демон.
abiword: легковесный конвертер, но результат выглядит не очень красиво для сложных документов (проверено на практике)
googledocs: используется бесплатный сервис Google. Имеются вроде как ограничения в ресурсах, а также нужно регистрироваться в Google.
Итак, что нужно делать, чтобы начать работать с django-webodt:
- Установка:
pip install django-webodt
- В settings.py проекта django:
INSTALLED_APPS = (
...
'webodt',
) - Для примера - используем abiword
WEBODT_CONVERTER = 'webodt.converters.abiword.AbiwordODFConverter'
- Укажем, где искать шаблоны odt
WEBODT_TEMPLATE_PATH = '.../webodt/templates/'
- Укажем, где искать шаблоны odt
WEBODT_TEMPLATE_PATH = '.../webodt/templates/'
- Использование
$ ./manage.py shell
>>> from django.template import Context
>>> import webodt
>>> template = webodt.ODFTemplate('test.odt')
>>> context = dict(user='John Doe', balance=10.05)
>>> document = template.render(Context(context))
Документ>>> document
<open file '/tmp/tmpL0AKCV.odt', mode 'rb' at 0xa7c39ec>
Это реальный файл>>> document.__class__
Установите delete_on_close=False в render, чтобы документ не удалялся
<class 'webodt.ODFDocument'>
>>> import os
>>> os.path.isfile(document.name)
True
>>> document.close()
>>> os.path.isfile(document.name)
False - Пример конвертирования в pdf:
>>> document = template.render(Context(context))
>>> from webodt.converters import converter
>>> conv = converter()
>>> pdf = conv.convert(document, format='pdf')
>>> pdf
<open file '/tmp/tmpYuAhhN.pdf', mode 'r' at 0xa7c3dfc>
Недавно мы сделали, чтобы можно было редактировать шаблоны-документы прямо в libreoffice (но включать бекенд под название опен офис надо) - раньше надо было править content.xml внутри odt.
Только надо быть внимательнее с тегами, такими как if - вставлять их под одним тегом, чтобы структура файла xml не нарушилась и документ не сломался.
Также скоро появится коммит, чтобы можно было вставлять цикл, подобный for прямо тоже как при обычном редактировании odt-файла в libreoffice.
Итак, чтобы использовать openoffice бакенд - используем команду в shell
soffice '-accept=socket,host=127.0.0.1,port=2002;urp;StarOffice.NamingService' -headless, в это в settings.py проекта django для настройки
OOFFICE_SERVER = ('127.0.0.1', 2002)
WEBODT_CONVERTER = 'webodt.converters.openoffice.OpenOfficeODFConverter'
Для использования сервиса google:
WEBODT_CONVERTER = 'webodt.converters.googledocs.GoogleDocsODFConverter'
Постоянная ссылка на документацию:http://packages.python.org/django-webodt/
Update: Если хотим получить документ html без скачивания, то передаем параметр inline=True в render_to_response:
render_to_response(..., inline=True)Update 2: Заместо soffice лучше использовать libreoffice.
Комментариев нет:
Отправить комментарий