ReportLab:模板'First'的'normal'框中,第1页的流动对象过大

9 投票
2 回答
6809 浏览
提问于 2025-04-17 03:57

我使用ReportLab来生成PDF文件。我的程序里有一个叫做MyDocTemplate(SimpleDocTemplate)的类,这个类里面有两个方法:beforePage(self)afterPage(self),它们分别在每一页的顶部和底部添加了页眉和页脚(用PNG图片)。另外,还有一个MyDocStyle类,用来描述ParagraphStyle

主要的方法看起来是这样的:

TITLE = Paragraph(Title, MyDocStyle.h1)
TO = Paragraph(To, MyDocStyle.h2)
FROM = Paragraph(From, MyDocStyle.h2)
SUBJECT = Paragraph(Subject, MyDocStyle.h2)
LONG_PARAGRAPH = Paragraph(Text, MyDocStyle.h3)
...

Elements = [TITLE, TO, FROM, SUBJECT, LONG_PARAGRAPH, ...]
doc = MyDocTemplete('output.pdf', pagesize=A4, 
                     leftMargin=2*cm, rightMargin=2*cm,
                     topMargin=4*cm, bottomMargin=4*cm)
doc.build(Elements)

数据来自CSV文件和图形用户界面(GUI)。有时候(根据数据的长度),我会遇到一个错误:

Flowable <Spacer at 0x2631120 frame=normal>...(1 x 5.66929133858) too large
on page 1 in frame 'normal'(469.88976378 x 603.118110236) of template 'First'

这个异常会让我的程序停止运行。对于短段落,我在MyDocStyle类里设置了h2.keepWithNext = 1,但这并不是一个完美的解决方案。ReportLab能够正确处理长段落,只要段落的结尾和页面的结尾(文本区域)不“重合”。

我该如何解决这个问题呢?

2 个回答

-3

解决了。 不要用 Spacer(比如 Spacer(1, 0.2*cm))来作为 Paragraph 的分隔符。相反,应该在 ParagraphStyle 中定义 spaceBeforespaceAfter,例如:

ParagraphStyle(name = 'Normal',
               fontName = "Verdana",
               fontSize = 11,
               leading = 15,
               alignment = TA_JUSTIFY,
               allowOrphans = 0,
               spaceBefore = 20,
               spaceAfter = 20,
               wordWrap = 1)
7

这个错误发生在ReportLab尝试把一个间隔(Spacer)分到两页的时候。看起来解决这个问题的唯一办法就是把你的间隔放到一个“保持在一起”(KeepTogether)元素里:

elements.append(KeepTogether(Spacer(width, height)))

撰写回答