【问题标题】:Add Page Break before adding a Split with Flowable在使用 Flowable 添加拆分之前添加分页符
【发布时间】:2018-03-03 16:43:04
【问题描述】:

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

我最接近的方法是在初始化 Document 时将 allowSplitting 设置为 False。然而问题是当一个表超过它必须容纳的空间量时,它就会失败。如果它不会失败,而是会换行,这就是我正在寻找的。​​p>

例如,这将失败并出现关于没有足够空间的错误:

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 超过一页,我希望它在开始之前添加一个分页符,然后在需要的地方拆分后续页面。

【问题讨论】:

    标签: python reportlab


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      • 2021-07-31
      相关资源
      最近更新 更多