ReportLab:当页面的内容对于页面来说太长时的布局错误

时间:2016-01-06 15:11:20

标签: python pdf reportlab

我正在尝试创建一个包含7个cols的表。最后一列包含一个似乎会产生错误的长文本。当单元格超出页面大小时,它会抛出异常。

doc = SimpleDocTemplate(response, pagesize=A4, rightMargin=30,leftMargin=30, topMargin=30,bottomMargin=18)
doc.pagesize = landscape(A4)
elements = []

styles = getSampleStyleSheet()
cell_style = styles['BodyText']
cell_style.wordWrap = 1
cell_style.fontName = 'Courier'
cell_style.spaceBefore = 30
cell_style.spaceAfter = 30

title_style = styles['Title']
title_style.fontName = 'Courier'
title = Paragraph('Export Issue Tracker (%s)' % (date.today().isoformat()), title_style)
elements.append(title)

data2 = [[Paragraph(cell, cell_style) for cell in row] for row in data]
table = LongTable(data2, colWidths=(None, None, None, None, None, None, 50*mm))
table_style = TableStyle([('BOX', (0,0), (-1,-1), 0.25, colors.black),
                            ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
                            ('FONTNAME',(0,0),(-1,-1),'Courier'),
                            ('VALIGN',(0,0),(-1,-1),'TOP'),
                            ('ALIGN',(0,0),(-1,0),'CENTER'),
                            ('TEXTCOLOR',(0,0),(-1,0), colors.yellow),
                            ('BACKGROUND', (0,0), (-1,0), colors.gray),
                            ('FONTSIZE',(0,0),(-1,-1),50)] + color_style)
table.setStyle(table_style)
elements.append(table)

doc.build(elements)

但是我收到以下错误:

LayoutError at /issues/export_comments/
Flowable <LongTable@0x7F5AFBBB6560 35 rows x 7 cols(tallest row 2694)> with cell(0,0) containing
u'<Paragraph at 0x7f5afbcb7ef0>9'(769.88976378 x 4782), tallest cell 2694.0 points,  too large on page 2 in frame 'normal'(769.88976378 x 535.275590551*) of template 'Later'

我已经看过许多关于如何使用KeepTogether,Spacer,LongTable的帖子,但不适用于我。

1 个答案:

答案 0 :(得分:0)

通常可以通过将内容设置为可流动的段落格式(具有定义的段落样式)来解决此问题,否则文本将不知道是否应该换行。在很多情况下,表中的格式将与文本发生冲突。上面的问题是RL抛出错误,因为尚未告知如何处理溢出文本。注释中提到的带有收缩,KeepTogether的变通方法不适用于未格式化的文本,您首先需要将其转换为段落。

以我的经验,最简单的规则是表样式可以处理除段落以外的所有内容。

以下是可建立的通用解决方案。我看到@ sagar-gupta去年年底才在寻找这个老问题的答案。

from reportlab.lib.pagesizes import letter, A4, landscape
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER, TA_RIGHT
from reportlab.lib.styles import ParagraphStyle, StyleSheet1
from reportlab.lib import colors
from reportlab.platypus import Frame, PageTemplate, KeepInFrame, Paragraph
from reportlab.lib.units import cm
from reportlab.platypus import (Table, TableStyle, BaseDocTemplate)

########################################################################

def create_pdf():
    """
    Create a pdf
    """

    # Create a frame
    text_frame = Frame(
        x1=3.00 * cm,  # From left
        y1=1.5 * cm,  # From bottom
        height=19.60 * cm,
        width=15.90 * cm,
        leftPadding=0 * cm,
        bottomPadding=0 * cm,
        rightPadding=0 * cm,
        topPadding=0 * cm,
        showBoundary=1,
        id='text_frame')

    styles = StyleSheet1()
    styles.add(ParagraphStyle(name='Breadpointlist_style',
                              alignment=TA_LEFT,
                              bulletFontSize=7,
                              bulletIndent=0,
                              endDots=None,
                              firstLineIndent=0,
                              fontSize=8,
                              justifyBreaks=0,
                              justifyLastLine=0,
                              leading=9.2,
                              leftIndent=11,
                              rightIndent=0,
                              spaceAfter=0,
                              spaceBefore=0,
                              textColor=colors.black,
                              wordWrap='LTR',
                              splitLongWords=True,
                              spaceShrinkage=0.05,
                              ))

    bps = ParagraphStyle('bps', parent=styles['Breadpointlist_style'])

    # Create a table
    test_table = []
    data = []
    for i in range(11, 1, -1):
        column1data = Paragraph('Column_1 on row {i}', bps)
        column2data = Paragraph('Column_last on row {i}', bps)
        data.append(['1','1','1','1','1',column1data, column2data])

    data_table = Table(data, 15.90 * cm / 7)
    data_table.setStyle(TableStyle([

        ('ALIGN', (0, 0), (1, -1), 'RIGHT'),
        ('SIZE', (0, 0), (-1, -1), 7),
        ('LEADING', (0, 0), (-1, -1), 8.4),
        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
        ('TOPPADDING', (0, 0), (-1, -1), 2.6),
        ('BOTTOMPADDING', (0, 0), (-1, -1), 2.6),
        ('LINEBELOW', (0, 0), (-1, -1), 0.3, colors.gray),
    ]))

    test_table.append(data_table)
    test_table = KeepInFrame(0, 0, test_table, mode='shrink')

    # Building the story
    story = [test_table] # adding test_table table (alternative, story.add(test_table))

    # Establish a document
    doc = BaseDocTemplate("Example_output.pdf", pagesize=letter)

    # Creating a page template
    frontpage = PageTemplate(id='FrontPage',
                             frames=[text_frame]
                             )
    # Adding the story to the template and template to the document
    doc.addPageTemplates(frontpage)

    # Building doc
    doc.build(story)


# ----------------------------------------------------------------------
if __name__ == "__main__":
    create_pdf() # Printing the pdf