1. Александр

    08.11.2011

    0 ↑
    0 ↓
    Доброе утро

    Есть задача сгенерировать pdf отчёт,
    в документации Django есть статья:
    https://docs.djangoproject.com/en/dev/howto/outputting-pdf/
    также есть документация самой reportlab (в довольно неудобном формате):
    http://www.reportlab.com/docs/reportlab-userguide.pdf

    Есть два варианта генерации документа (конкретно в моём случае есть цикл по пользователям, по каждому пользователю генерирует три страницы отчёта (одна из них альбомная)): через canvas и используя PLATYPUS, описанный в 5 главе (60 страница) гайда. Раньше я использовал canvas и всё работало, но теперь мне потребовалось вставить сложную таблицу с неизвестным заранее числом строчек. Чтобы не усложнять жизнь подсчетом координат блока я решил изучить PLATYPUS и использовать его, но как-то у меня не очень получается разобраться с этим, прошу помочь.

    как было
    from reportlab.lib.pagesizes import letter
    ...

    MyFontObject = ttfonts.TTFont('myfont', 'timcyr.ttf')
    pdfmetrics.registerFont(MyFontObject)

    buffer = StringIO()
    c = canvas.Canvas(buffer)

    пока есть пользователи:
    пока не напечатели нужное количество копий:
    lWidth, lHeight = letter
    c.setPageSize((lHeight, lWidth))


    textobject = c.beginText()
    textobject.setTextOrigin(inch, 7.5*inch)
    textobject.setFont("myfont", 12)
    textobject.setFillGray(0.4)

    template1 = u'''
    шаблон %s template %s
    '''
    textobject.textLines(template1 % (var1, var2, ...))

    c.drawText(textobject)
    c.showPage()

    ...

    тут аналогично 2 и 3 шаблон используются нужное количество раз
    c.save()
    я использовал канвас, что я сделал:
    - указал шрифт (без него получаются квадратики вместо русских букв)
    - указал ориентацию страницы как альбомная (для данной конкретной страницы)
    - создал текстовый объект и указал настройки шрифта
    - нарисовал его
    - завершил страницу (следующая drawText() начнёт рисовать уже с новой страницы)

    теперь я пытаюсь переделать всё это с использованием PLATYPUS и у меня возникают такие непонятные вопросы:
    1. почему снова квадратики (шрифт не подцепился)
    2. как задать ориентацию страницы ( у меня три шаблона, для печати копий документов с использованием одного из них мне необходимо выводить страницу в альбомном формате, для двух других в книжном)
    3. как перевернуть страничку

    Спасибо!
  2. Александр

    08.11.2011

    0 ↑
    0 ↓
    Ну или, возможно, кто-то сможет подсказать, как сделать вот такой документ в формате docx или pdf? может быть не через reportlab, а через что-то более простое (можно даже не на python, хотя лучше на нём чтобы проще интегрировать с джангой)

    это 1 из трёх шаблонов, первая табличка имеет несколько объединенных ячеек, вторая табличка имеет неопределенное количество строчек
  3. igorekk

    08.11.2011

    0 ↑
    0 ↓
    А html не подходит почему?
  4. hardtop

    08.11.2011

    0 ↑
    0 ↓
    igorekk, действительно. Уж html можно открыть хоть вордом, хоть браузером (хотя, первого у кого то может и не быть).

    Александр, может проще сначала генерировать html, а уж потом его конвертировать в pdf?
  5. Несколько раз в жизни приходилось генерировать подобные отчеты и счета, всегда решал это созданием шаблона LaTeX и использованием pdflatex. Это может быть не самое изящное решение (много дополнительных зависимостей), зато здорово экономит время и результат получается красивый.

  6. xtelaur

    09.11.2011

    0 ↑
    0 ↓
    Мне тоже кажется лучше, чтобы вначале был HTML. А то сегодня на выходе нужен PDF, а завтра DOCX...
    Вот может пригодится - конвертер репортлабовского RML в PDF (используя его как джанго шаблон): http://code.google.com/p/template2pdf/
    На мой взгляд удобнее чем с канвасом работать, хотя синтаксис самого RML тоже не ахти.
  7. Некоторые отчеты есть в русской версии OpenERP
    Там кое что надо будет вырезать и добавить чтобы заработало в джанго.
  8. Александр

    16.11.2011

    0 ↑
    0 ↓
    Спасибо за ваши ответы!

    > А html не подходит почему?

    > igorekk, действительно. Уж html можно открыть хоть вордом, хоть браузером (хотя, первого у кого то может и не быть).

    Это не очень правильно, конечно, но заказчик хотел вручную (не через систему) редактировать часть отчётов... Желательно через Word/Excel или LibreOffice. (Но не через TinyMCE и другие WYSIWYG-редакторы в браузерах, уж не знаю, почему так..)
    PDF можно редактировать через LibreOffice, и вроде это самый распространённый формат для отчётов, поэтому выбрал его... Хотя это не принципиально, можно и html.. А идеальный вариант это, наверное, .docx

    html не выбрал потому что нормально Word откроет его только если этот html сохранялся через ворд (с кучей всякого мусора в html), я бы так и сделал, но в моём случае мне надо не просто подставить в шаблон данные и показать, а из трёх шаблонов (повторив их некоторое количество раз) скомбинировать 1 документ, то есть я побоялся проблем, связанных с объединением трёх сохраненных через word html-файлов

    а если генерировать обычный html без вордовского мусора то при открытии его в ворде может как-то поехать верстка (там у заказчика тем более 2007 офис, а не 2010, не было возможности и времени особо тестировать это поднимая виртуалку, а у меня в распоряжении есть только маковский 2011)

    идею генерировать docx также отложил потому что не нашел примеров генерации сложных табличек...

    ещё есть требование - при печати каждый отчёт должен быть на отдельной странице, в css есть такое свойство, но у меня как-то не получилось с наскока, вообщем, в итоге я ещё раз внимательно прочитал руководство и сделал через REPORTLAB pdf, но в будущем ещё подумаю на эту тему...

    генерировать html и потом конвертировать в другие форматы я думаю самая интересная идея, надо будет оценить качество подобного конвертирования, наверное, это наиболее удобный способ...

    ещё раз спасибо за ответы и ссылки, мне стоит изучить это более детально..
  9. ilyukhin-a

    17.11.2011

    0 ↑
    0 ↓
    Может подойдет pod? http://appyframework.org/pod.html

    Правда для pdf придется держать демон OO :)

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.