Уведомления

Группа в Telegram: @pythonsu

#1 Май 4, 2008 10:45:25

swift
От:
Зарегистрирован: 2008-05-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

А не кто не в курсе такой проблемы:
задача сгенерить многостраничный pdf документ содержащий кучу таблиц

Пытался сделать двумя способами
способ первый

pdf = SimpleDocTemplate(pagesize = letter,filename='document.pdf')
my_table=Table(data,style=[
('SPAN', (0,0), (0,coor_x)),
('VALIGN',(0,0),(0,0),'CENTER')
])

story.append(table)
pdf.build(story)

все шикарно работает
но только с одной страницей
как сделать разрыв страницы что бы следующая таблица была на новой таблице так и не вкурил :(
подскажите плс

способ второй

MyCanvas = canvas.Canvas(sys.argv+“.pdf”)
my_table=Table(data,style=[
('SPAN', (0,0), (0,coor_x)),
('VALIGN',(0,0),(0,0),'CENTER')
])

и вот дальше начинаются не понятки
если я в лоб дам

my_table.drawOn(MyCanvas,100,580)
]

то получу

Traceback (most recent call last):
File “file.py”, line 249, in <module>
my_table.drawOn(MyCanvas,100,780)
File “/usr/lib/python2.5/site-packages/reportlab/platypus/flowables.py”, line 102, in drawOn
self._drawOn(canvas)
File “/usr/lib/python2.5/site-packages/reportlab/platypus/flowables.py”, line 86, in _drawOn
self.draw()#this is the bit you overload
File “/usr/lib/python2.5/site-packages/reportlab/platypus/tables.py”, line 1168, in draw
cellRect = self._spanRects
AttributeError: Table instance has no attribute ‘_spanRects’


но если я где то ранее создам объект SimpleDocTemplate
и свою таблицу предвариетльно пропущу через конструкцию

story.append(my_table)
pdf.build(story)

то все пролетает на ура

в чем грабли тут я не вкурил
сам объект таблицы (точнее его содержимое) после build становится в два раза больше
как преобразовать таблицу что бы drawOn хавал ее на ура?

заранее спасибо
подскажите плс



Офлайн

#2 Май 4, 2008 18:07:15

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

swift, а тебе pisa не подойдет?



Офлайн

#3 Май 4, 2008 18:15:37

swift
От:
Зарегистрирован: 2008-05-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

pythonwin
спасибо за ссылку
посмотрю
но с репортлаб тоже хотелось бы разобраться (хотя хуже доке чем под репортлаб я еще не встречал :))



Офлайн

#4 Май 5, 2008 07:20:02

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

swift
(хотя хуже доке чем под репортлаб я еще не встречал :))
доки хватает для старта, но потом нужно
http://www.google.com/search?q=maillist+reportlab
http://two.pairlist.net/pipermail/reportlab-users/
http://ml.osdir.com/python.reportlab.user/



Офлайн

#5 Май 5, 2008 15:26:28

RDX
От:
Зарегистрирован: 2007-06-25
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

а что за story если не секрет?

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



Офлайн

#6 Май 5, 2008 16:10:24

swift
От:
Зарегистрирован: 2008-05-04
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

RDX
а что за story если не секрет?
просто массив, состоящий из элементов pdf файла

RDX
а таблицу как и любого потомка flowables надо на части резать прежде чем на страницу пихать..
и кстати этот момент в документации прекрасно отражен.
ткните носом плс :)



Офлайн

#7 Май 5, 2008 16:13:08

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

RDX
а таблицу как и любого потомка flowables надо на части резать прежде чем на страницу пихать..
а как ты предлагаешь это делать?
PS видел код для ReportLab где не нужно “резать” таблицу



Офлайн

#8 Май 6, 2008 07:23:17

RDX
От:
Зарегистрирован: 2007-06-25
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по ReportLab

в репортлабовском юзергайде

5.3 Flowables
Flowables are things which can be drawn and which have wrap, draw and perhaps split methods.
Flowable is an abstract base class for things to be drawn and an instance knows its size and draws in its
own coordinate system (this requires the base API to provide an absolute coordinate system when the
Flowable.draw method is called). To get an instance use f=Flowable().
It should be noted that the Flowable class is an abstract class and is normally only used as a base class.
To illustrate the general way in which Flowables are used we show how a derived class Paragraph is
used and drawn on a canvas. Paragraphs are so important they will get a whole chapter to themselves.

from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Paragraph
from reportlab.pdfgen.canvas import Canvas
styleSheet = getSampleStyleSheet()
style = styleSheet['BodyText']
P=Paragraph('This is a very silly example',style)
canv = Canvas('doc.pdf')
aW = 460 # available width and height
aH = 800
w,h = P.wrap(aW, aH) # find required space
if w<=aW and h<=aH:
P.drawOn(canv,0,aH)
aH = aH - h # reduce the available height
canv.save()
else:
raise ValueError, "Not enough room"
Flowable User Methods
Flowable.draw()
This will be called to ask the flowable to actually render itself. The Flowable class does not implement
draw. The calling code should ensure that the flowable has an attribute canv which is the
pdfgen.Canvas which should be drawn to an that the Canvas is in an appropriate state (as regards
translations rotations, etc). Normally this method will only be called internally by the drawOn method.
Derived classes must implement this method.
Flowable.drawOn(canvas,x,y)
This is the method which controlling programs use to render the flowable to a particular canvas. It handles
the translation to the canvas coordinate (x,y) and ensuring that the flowable has a canv attribute so that the
draw method (which is not implemented in the base class) can render in an absolute coordinate frame.
Flowable.wrap(availWidth, availHeight)
This will be called by the enclosing frame before objects are asked their size, drawn or whatever. It returns
the size actually used.
Flowable.split(self, availWidth, availheight)
This will be called by more sophisticated frames when wrap fails. Stupid flowables should return meaning
that they are unable to split. Clever flowables should split themselves and return a list of flowables. It is up to
the client code to ensure that repeated attempts to split are avoided. If the space is sufficient the split method
should return . Otherwise the flowable should rearrange itself and return a list of flowables
which will be considered in order. The implemented split method should avoid changing self as this will
allow sophisticated layout mechanisms to do multiple passes over a list of flowables.

тонкий момент. split разделяет таблицу ток на 2е части.. т.е. первая чтоб влезла на страницу вторая - все остальное
вроде.. :)

to pythonwin:
если знаешь способ размещения таблицы с размерами больше страницы не разрезая ее то поделись пожалст
ибо мне вот совсем не нравится геморрой с расположением таблиц



Отредактировано (Май 6, 2008 07:31:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version