在使用 Flowable 添加拆分之前添加分页符
Add Page Break before adding a Split with Flowable
我有一个应用程序正在使用 reportlab 构建 tables 的文档。我想要发生的是当可流动的(在这种情况下,总是 Table
)需要跨页拆分时,它应该首先添加一个分页符。因此,应该允许拆分 Table,但拆分的任何 table 应该始终从新页面开始。同一个文档中有多个Table,如果两个可以放在同一页而不拆分,则不应出现分页。
我最接近的是在初始化文档时将 allowSplitting
设置为 False
。然而,问题是当 table 超过它必须容纳的 space 的数量时,它就会失败。如果它没有失败,它就会换行,这就是我要找的。
例如,这将失败并出现关于没有足够的错误 space:
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)
第一个 table(t1
)适合,但 t2
不适合。如果 allowSplitting
被关闭,它将适合文档中的所有内容,但是 t1
和 t2
在同一页上。因为t2
比一页长,所以我希望它在开始之前加一个分页符,然后在需要的地方拆分到后面的页面。
一种选择是利用文档高度和 table 高度来计算 PageBreak()
元素的正确位置。文档高度可以从SimpleDocTemplate
对象获取,table高度可以用wrap()
方法计算得到。
如果可用高度小于 table,下面的示例将插入一个 PageBreak()
。然后它会重新计算下一个 table.
的可用高度
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)
我有一个应用程序正在使用 reportlab 构建 tables 的文档。我想要发生的是当可流动的(在这种情况下,总是 Table
)需要跨页拆分时,它应该首先添加一个分页符。因此,应该允许拆分 Table,但拆分的任何 table 应该始终从新页面开始。同一个文档中有多个Table,如果两个可以放在同一页而不拆分,则不应出现分页。
我最接近的是在初始化文档时将 allowSplitting
设置为 False
。然而,问题是当 table 超过它必须容纳的 space 的数量时,它就会失败。如果它没有失败,它就会换行,这就是我要找的。
例如,这将失败并出现关于没有足够的错误 space:
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)
第一个 table(t1
)适合,但 t2
不适合。如果 allowSplitting
被关闭,它将适合文档中的所有内容,但是 t1
和 t2
在同一页上。因为t2
比一页长,所以我希望它在开始之前加一个分页符,然后在需要的地方拆分到后面的页面。
一种选择是利用文档高度和 table 高度来计算 PageBreak()
元素的正确位置。文档高度可以从SimpleDocTemplate
对象获取,table高度可以用wrap()
方法计算得到。
如果可用高度小于 table,下面的示例将插入一个 PageBreak()
。然后它会重新计算下一个 table.
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)