Как конвертировать большие файлы в таблицы в формате pdf с помощью reportlab platypus?

После поиска и прочтения различных сообщений на форуме, я думаю, что теперь я могу разместить свой вопрос здесь.

Я создаю PDF-файл, содержащий большую таблицу и текст в конце таблицы. У меня есть исходный файл (в формате.txt). Каждая строка в исходном файле составляет строку в таблице в pdf-файле.

У меня есть скрипт, который прекрасно работает, когда исходный файл небольшой.

import sys
import datetime
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Image, Table, TableStyle, Frame
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.units import inch
from reportlab.lib import utils, colors
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER

def go():
    doc=SimpleDocTemplate(filePath+".pdf", rightMargin=0.35*inch,leftMargin=0.35*inch, topMargin=1.2*inch, bottomMargin=0.6*inch)
    story=[Spacer(1,0.15*inch)]
    # Title table
    tdata=[[Paragraph("<b>Title of the table</b>",styleBH),Paragraph(" ",styleBH)]]
    title=Table(tdata,colWidths=[6.25*inch,inch])
    story.append(title)
    story.append(Spacer(1,0.1*inch))
    #result table
    data=generateData(sourceFile)
    t=Table(data,colWidths[1.35*inch,1.35*inch,inch,0.8*inch,0.8*inch,1.60*inch],repeatRows=1)
    table_style=[('ALIGN',(0,0),(-1,-1),'CENTER'),
    ('VALIGN',(0,0),(-1,-1),'MIDDLE'),
    ('BACKGROUND',(0,0),(6,0),"#b47c42"),
    ('INNERGRID',(0,0),(-1,-1),0.25,colors.black),
    ('BOX',(0,0),(-1,-1),0.25,colors.black)]
    for i in range(1,len(data)):
        if i%2==0:
            table_style.append(('BACKGROUND',(0,i),(6,i),"#FAEBD7"))
    t.setStyle(TableStyle(table_style))
    story.append(t)
    story.append(Spacer(1,0.3*inch))
    story.append(Spacer(1,0.3*inch))
    #cit text
    hcit=Paragraph("<font size=13><b>my text comes here</b>",style=stylePara)
    story.append(hcit)
    doc.build(story,myPages,myPages)   #myPages is defined

И код, который генерирует матрицу для таблицы

def generateData(sourceFile):
    #Header
    h1 = Paragraph('''<font color=white><b>Heading1</b></font>''', styleN)
    h2 = Paragraph('''<font color=white><b>Heading2</b></font>''', styleN)
    h3 = Paragraph('''<font color=white><b>Heading3</b></font>''', styleN)
    h4 = Paragraph('''<font color=white><b>Heading4</b></font>''', styleN)
    h5 = Paragraph('''<font color=white><b>Heading5</b></font>''', styleN)
    h6 = Paragraph('''<font color=white><b>Heading6</b></font>''', styleN)
#Texts
    data=[[h1,h2,h3,h4,h5,h6]]
    f=open(sourceFile,"r")
    for line in f:
        if line.startswith("#"):
            continue
        splitline=line[:-1].split("\t")
        col1 = Paragraph(splitline[0], styleN)
        col2 = Paragraph(splitline[1], styleN)
        col3 = Paragraph(splitline[3], styleN)
        col4 = Paragraph(splitline[4], styleN)
        col5 = Paragraph(splitline[5], styleN)
        col6 = Paragraph(splitline[6], styleN)
        data.append([col1,col2,col3,col4,col5,col6])
    f.close()
    return data

Стили и макет страницы определены, но здесь не показаны.

Но скрипт становится медленнее, когда исходный файл больше. Я нашел сообщение с подобным случаем в вопросе stackru, который создает абзац вместо таблицы. Я могу читать мой исходный файл кусками, но теперь мне интересно, как добавить каждый кусок таблицы к первой таблице.

Вопрос: Как сделать так, чтобы это выполнялось быстро для файла запроса размером около 1 МБ или может быть даже больше? используя чанк, как я могу распечатать все данные в одной таблице? А какие могут быть другие лучшие варианты?

0 ответов

Другие вопросы по тегам