Andrey Koltsov
Andrey Koltsov

Reputation: 1974

ReportLab LongTable LayoutError: too large on page

I'm using LongTables to show tabled data, but when row height more then page height it crashes with

  File "c:\edat\19_with_edm\fiods\..\fiods\reporting\pdf_utils.py", line 1497, in build_table
    doc.build(story, canvasmaker=NumberedCanvas)

  File "C:\Python27\lib\site-packages\reportlab\platypus\doctemplate.py", line 880, in build
    self.handle_flowable(flowables)

  File "C:\Python27\lib\site-packages\reportlab\platypus\doctemplate.py", line 793, in handle_flowable
    raise LayoutError(ident)

LayoutError: Flowable <LongTable@0x018DB0A8 30 rows x 20 cols> with cell(0,0) containing
'Eq\nLvl\nD'(756.0 x 967.6) too large on page 2 in frame 'edat_table_frame'(756.0 x 504.0*) of template 'edat_page_template'

Upvotes: 3

Views: 3735

Answers (1)

Nicholas TJ
Nicholas TJ

Reputation: 1649

The error looks like you try to format the table, which is out of the limit if the frame in a single page. I tested a code with 'Table' and 'LongTable' and it will show the data over multiple pages as long as you do not attempt to format first page and second page at the same time.

Example code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from reportlab.platypus import SimpleDocTemplate, Table, LongTable, TableStyle, BaseDocTemplate, Frame, Paragraph, NextPageTemplate, PageTemplate
from reportlab.lib.pagesizes import letter, inch
from reportlab.lib import colors

def testPdf():
    doc = BaseDocTemplate("testpdf.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18, showBoundary=True)
width, height = letter
print width 
print height

elements = []
datas = []
for x in range(1,50):
    datas.append(
        [x,x+1]
    )
t=LongTable(datas)

tTableStyle=[
    ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
    ('BOX', (0,0), (-1,-1), 0.25, colors.black),
  ]
t.setStyle(TableStyle(tTableStyle))
elements.append(t)

frameT = Frame(doc.leftMargin, doc.bottomMargin, doc.width, doc.height, id='normal')

doc.addPageTemplates([PageTemplate(id='OneCol',frames=frameT)])

doc.build(elements)

if __name__ == '__main__':
    testPdf()

if you format the table with let's say:

tTableStyle=[
    ('SPAN',(0,0),(0,38), #span over the frame limit
    ('INNERGRID', (0,0), (-1,-1), 0.25, colors.black),
    ('BOX', (0,0), (-1,-1), 0.25, colors.black),
  ]

Then you'll encounter this error. I'd say probably the best way is to format the table manually, but I'm hoping there's a better solution.

Upvotes: 3

Related Questions