2016-02-18 3 views
3

Я использую reportlab 3.2.0.reportlab LayoutError: Flowable Spacer too large

SPACER = Spacer(0, 10) 
buff = BytesIO() 
doc = SimpleDocTemplate(buff, rightMargin=0.2 * inch, 
         leftMargin=0.2 * inch,\ 
         topMargin=100, bottomMargin=68) 
elements = [] 
# here add elements 
elements.append(SPACER) 
# here add more elements 
doc.build(elements) 

Всякий раз, когда пространство заканчивается близко к нижней части страницы, я получаю эту ошибку:

File "/venv/lib/python2.7/site-packages/reportlab/platypus/doctemplate.py", line 1171, in build 
    BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker) 
    File "/venv/lib/python2.7/site-packages/reportlab/platypus/doctemplate.py", line 927, in build 
    self.handle_flowable(flowables) 
    File "/venv/lib/python2.7/site-packages/reportlab/platypus/doctemplate.py", line 829, in handle_flowable 
    raise LayoutError(ident) 
LayoutError: Flowable <Spacer at 0x4c87d40 frame=normal>...(0 x 10) too large on page 2 in frame 'normal'(554.475590551 x 661.88976378) of template 'Later' 

Есть ли способ, чтобы предотвратить его бросать исключение (т.е. просто игнорировать космический элемент)?

ответ

3

Вот краткая реализация Spacer, которая использует либо меньшую высоту, назначенную вам, либо пространство, оставшееся на текущей странице.

class ConditionalSpacer(Spacer): 

    def wrap(self, availWidth, availHeight): 
     height = min(self.height, availHeight-1e-8) 
     return (availWidth, height) 

Вы можете использовать его как раз как Spacer.

+0

Спасибо. Я смог воспроизвести мою проблему, а затем успешно использовал отмену. Не могли бы вы объяснить использование availHeight-1e-8 – max

+0

. Функция availHeight, переданная в функцию обертки, представляет собой объем пространства, доступного для проставки на текущей странице или в рамке. Я не тестировал использование всего доступногоHeight, но сам модуль flowables использует одну и ту же настройку с 1e-8 для другого элемента, поэтому я просто применил его здесь. Я предполагаю, что есть какой-то угловой случай, когда занятие всего пространства вызывает ошибку, поэтому вы занимаете все пространство, за исключением очень маленькой суммы. – swehren