当单元格的内容对于页面而言太长时,ReportLab:LayoutError

Rub*_*ben 9 python pdf reportlab

我正在尝试用7个列创建一个表。最后一列包含一个长文本,这似乎会导致错误。似乎当单元格超出页面大小时,它将引发异常。

from reportlab.lib.pagesizes import landscape, A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, LongTable, TableStyle, Paragraph
from reportlab.lib import colors
from reportlab.lib.units import mm
from datetime import date

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)
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

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'
Run Code Online (Sandbox Code Playgroud)

我已经看到很多关于如何使用KeepTogether,Spacer,LongTable的帖子,但是没有一个适合我。

Jac*_*aco 1

这个问题通常通过将内容格式化为可流动的段落(具有定义的段落样式)来解决,否则文本不知道是否应该换行。很多时候,表格内的格式与文本之间存在冲突。上述问题是 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
Run Code Online (Sandbox Code Playgroud)