Постраничный вывод pdf в reportlab

256 views
Skip to first unread message

d.ak...@gmail.com

unread,
Apr 15, 2008, 11:57:50 AM4/15/08
to Django russian
Доброго времени суток.

Этот вопрос прямого отношения к Django не имеет, но может кто
сталкивался.
Я впервые столкнулся с генерацией pdf в reportlab.
И не очень понравился тот момент, что, во-первых, начало координат
страницы находится в нижнем левом углу станицы (вместо верхнего
левого, как в ХТМЛ), и что нужно самому следить за открытием новых
страниц.

Т.е., предположим, генерится такой длинный текст на несколько экранов:

textobject = p.beginText()
textobject.setTextOrigin(inch, 2.5*inch)
textobject.setFont("Helvetica-Oblique", 14)
textobject.setFillGray(0.4)
for line in voina_i_mir:
textobject.textLine(line)
p.drawText(textobject)

Получается нужно периодически самому вставлять p.showPage(), чтобы
текст печатался на новых страницах. как то это рутинно получается.
Нужно следить, сколько строчек влезает на страницу и прочее.
А если к этом добавить, что определенные шрифты слетают -- то это
вообще фигня какая-то.
Нет ли метода выводить pdf по-проще? В стиле HTML =)

Ivan Illarionov

unread,
Apr 16, 2008, 8:21:46 PM4/16/08
to Django russian

d.ak...@gmail.com

unread,
Apr 17, 2008, 4:48:17 AM4/17/08
to Django russian
В общем я сам разобрался как решить эту проблему силами reportlab.
Нужно обратиться к разделу документации PLATYPUS.
Это средство возволяет выводить текст, таблицы и прочее, не заботясь о
страницах.
Так же она предоставляет возможность использования стилей и шаблонов.
Код выглядит вот так:

Story = []
p = Paragraph("bla bla bla", style)
Story.append(p)
Story.append(Spacer(1,0))
data= [['00', '01', '02', '03', '04'], ['10', '11', '12', '13',
'14'], ['20', '21', '22', '23', '24'], ['30', '31', '32', '33', '34']]
t=Table(data)
t.setStyle(TableStyle([('BACKGROUND',(1,1),(-2,-2),colors.green),
('TEXTCOLOR',(0,0),(1,-1),colors.red)]))
Story.append(t)
doc.build(Story, onFirstPage=myFirstPage,
onLaterPages=myLaterPages)

d.ak...@gmail.com

unread,
Apr 22, 2008, 3:08:35 AM4/22/08
to Django russian
Иван, решил воспользоваться вашим советом.
Установил pisa.
Но не могу решить проблему выдачи русских букв.
В простом reportlab проблема решалась подключением русского шрифта.
Тут же:

import sx.pisa3 as pisa
import cStringIO as StringIO

def faborder_html2pdf(request, id):
result = StringIO.StringIO()
pdf = pisa.CreatePDF(
StringIO.StringIO("<style>@font-face { font-family: Tahoma1;
src: url('c:\tahomabd.ttf'); } b {font-family: Tahoma1}</style>hello
<b>превед</b>"), result)
if not pdf.err:
return HttpResponse(result.getvalue(), mimetype='application/
pdf')
return HttpResponse('We had some errors')

hello выводится отлично, а вместо «превед» выводится вот это: «Ð¿Ñ
€ÐμвÐμд»

d.ak...@gmail.com

unread,
Apr 22, 2008, 5:12:35 AM4/22/08
to Django russian
Решилось, отбой =)

Необходимо помимо подключения шрифта, прописать в HTML коде мета тег:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

Во как )
Reply all
Reply to author
Forward
0 new messages