пятница, 3 июня 2011 г.

Работа с doc, pdf, odt, html в django

Иногда нам нужно формировать документы динамически в django проекте.
Хотелось бы иметь общий формат документа, из которого можно было бы в легкую переводить в 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:
  1. Установка:
    pip install django-webodt

  2. В settings.py проекта django:
    INSTALLED_APPS = (
    ...
    'webodt',
    )
  3. Для примера - используем abiword
    WEBODT_CONVERTER = 'webodt.converters.abiword.AbiwordODFConverter'

  4. Укажем, где искать шаблоны odt
    WEBODT_TEMPLATE_PATH = '.../webodt/templates/'

  5. Укажем, где искать шаблоны odt
    WEBODT_TEMPLATE_PATH = '.../webodt/templates/'

  6. Использование
    $ ./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__
    <class 'webodt.ODFDocument'>
    >>> import os
    >>> os.path.isfile(document.name)
    True
    >>> document.close()
    >>> os.path.isfile(document.name)
    False
    Установите delete_on_close=False в render, чтобы документ не удалялся

  7. Пример конвертирования в 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.

Комментариев нет:

Отправить комментарий