【问题标题】:reportlab LayoutError: Flowable Spacer too largereportlab LayoutError:Flowable Spacer 太大
【发布时间】:2016-02-18 23:31:31
【问题描述】:

我正在使用 reportlab 3.2.0。

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'

有没有办法防止它抛出异常(即忽略空格元素)?

【问题讨论】:

    标签: reportlab


    【解决方案1】:

    这是 Spacer 的一个快速实现,它会用完您分配给它的高度或当前页面上剩余的空间中的较小者。

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

    你可以像 Spacer 一样使用它。

    【讨论】:

    • 谢谢。我能够重现我的问题,然后成功使用上面的覆盖。你能解释一下availHeight-1e-8
    • 传递给 wrap 函数的availHeight 是当前页面或框架上间隔可用的空间量。我没有使用所有 availableHeight 进行测试,但 flowables 模块本身使用与 1e-8 相同的设置用于不同的元素,所以我只是在这里应用它。我想在某些极端情况下,占用所有空间会导致错误,所以你会占用所有空间,除了非常少的空间。
    猜你喜欢
    • 2010-12-22
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2014-11-30
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多