在PDF页面上拆分ReportLab表(并排)?

2024-10-01 15:40:10 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码创建了一个很好的测试表,其中包含99行数据和在每个分页符处重复的页眉。这张表很窄,所以我想弄清楚如何使它分开,这样它在第一页的左边有1-37行,在第一页的右边有38-74行,在第二页的左边有75-99行。我称之为“在一个页面上拆分一个表”,但是对于我所要做的,可能还有一个更好的名字,所以我希望我能准确地描述它。在

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A3, A4, landscape, portrait
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfgen import canvas

pdfReportPages = "C:\\Temp\\test.pdf"
doc = SimpleDocTemplate(pdfReportPages, pagesize=A4)

# container for the "Flowable" objects
elements = []
styles=getSampleStyleSheet()
styleN = styles["Normal"]

# Make heading for each column and start data list
column1Heading = "COL ONE"
column2Heading = "COL TWO"
# Assemble data for each column using simple loop to append it into data list
data = [[column1Heading,column2Heading]]
for i in range(1,100):
    data.append(["Col 1 Row " + str(i),"Col 2 Row " + str(i)])

tableThatSplitsOverPages = Table(data, [2.5 * cm, 2.5 * cm], repeatRows=1)
tableThatSplitsOverPages.hAlign = 'LEFT'
tblStyle = TableStyle([('TEXTCOLOR',(0,0),(-1,-1),colors.black),
                       ('VALIGN',(0,0),(-1,-1),'TOP'),
                       ('LINEBELOW',(0,0),(-1,-1),1,colors.black),
                       ('BOX',(0,0),(-1,-1),1,colors.black),
                       ('BOX',(0,0),(0,-1),1,colors.black)])
tblStyle.add('BACKGROUND',(0,0),(1,0),colors.lightblue)
tblStyle.add('BACKGROUND',(0,1),(-1,-1),colors.white)
tableThatSplitsOverPages.setStyle(tblStyle)
elements.append(tableThatSplitsOverPages)

doc.build(elements)

Tags: fromimportfordatalibcmelementsblack
2条回答

如果知道页面上的确切行数,则可以使用此函数模拟两列。这样,表格仍然会自动在多个页面上流动,您不必担心页面模板。在

def columnize(data, interval):
    ret = []
    for i in range(0, len(data), interval * 2):
        for j in range(min(interval, len(data) - i)):
            ret.append(data[i + j] + (data[i + j + interval] if i + j + interval < len(data) else []))
    return ret

在您的示例中使用:

^{pr2}$

您将需要使用PageTemplates来完成此操作,方法是创建一个具有多个框架的PageTemplate,该框架允许您指定在页面内绘制文档的内容区域。不幸的是,这意味着放弃SimpleDoctTemplate,而是使用BaseDocTemplate并提供自己的页面模板(以及其他需要的东西)。在

相关问题 更多 >

    热门问题