在添加带有Flowable的Split之前添加分页符

时间:2018-03-03 16:43:04

标签: python reportlab

我有一个使用reportlab构建表格文档的应用程序。我想要发生的是当一个可流动的(在这种情况下,总是Table)需要跨页面分割时,它应该首先添加一个分页符。因此,应允许表拆分,但任何拆分的表应始终在新页面上启动。同一文档中有多个表,如果两个表可以放在同一页面上而不进行拆分,则不应该有分页符。

我最接近的是在初始化文档时将allowSplitting设置为False。然而问题是当一个表超过它必须适应的空间量时,它就会失败。如果不是失败,它将换行,这就是我要找的。

例如,如果没有足够的空间,这将失败:

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, inch
from reportlab.platypus import SimpleDocTemplate, Table
from reportlab.lib.styles import getSampleStyleSheet

doc = SimpleDocTemplate("simple_table_grid.pdf", pagesize=letter, allowSplitting=False)
# container for the 'Flowable' objects
elements = []
data2 = []

data = [['00', '01', '02', '03', '04'],
       ['10', '11', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', '33', '34']]

for i in range(100):
  data2.append(['AA', 'BB', 'CC', 'DD', 'EE'])

t1 = Table(data)
t2 = Table(data2)

elements.append(t1)
elements.append(t2)
doc.build(elements)

第一个表格(t1)适合,但t2不适合。如果allowSplitting处于停用状态,它将适合文档中的所有内容,但t1t2位于同一页面上。由于t2长于一页,我希望它在开始之前添加分页符,然后在需要的时候分割到以下页面。

1 个答案:

答案 0 :(得分:1)

一种选择是利用文档高度和表格高度来计算PageBreak()元素的正确位置。文档高度可以从SimpleDocTemplate对象获得,表格高度可以使用wrap()方法计算。

如果可用高度小于表格高度,则下面的示例会插入PageBreak()。然后重新计算下一个表的可用高度。

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, PageBreak

doc = SimpleDocTemplate("simple_table_grid.pdf", pagesize=letter)

# Create multiple tables of various lengths.
tables = []
for rows in [10, 10, 30, 50, 30, 10]:
    data = [[0, 1, 2, 3, 4] for _ in range(rows)]
    tables.append(Table(data, style=[('BOX', (0, 0), (-1, -1), 2, (0, 0, 0))]))

# Insert PageBreak() elements at appropriate positions.
elements = []
available_height = doc.height
for table in tables:
    table_height = table.wrap(0, available_height)[1]
    if available_height < table_height:
        elements.extend([PageBreak(), table])
        if table_height < doc.height:
            available_height = doc.height - table_height
        else:
            available_height = table_height % doc.height
    else:
        elements.append(table)
        available_height = available_height - table_height

doc.build(elements)