大型PDF使用ReportLab花费的时间成倍增加

时间:2019-03-13 12:48:48

标签: python django pdf-generation reportlab platypus

我正在使用ReportLab来生成PDF报告,以下是该报告的代码。问题是,对于X的页面数,它需要T时间,但是对于2X的页面,它所需要的时间远远超过2T。由于我需要生成最多35000页的PDF,因此非常麻烦。我该怎么做才能绕开这个问题。

from reportlab.platypus import TableStyle, SimpleDocTemplate, LongTable, Table
from reportlab.lib.pagesizes import letter

class JournalPDFGenerator(object):
    """
    Generates Journal PDF with ReportLab
    """

    def __init__(self, pdf_name, profile_report_id):
        self.pdf_name = pdf_name
        self.profile_report_id = profile_report_id
        self.profile_report = ProfileWatchReport.objects.get(id=self.profile_report_id)
        self.document = SimpleDocTemplate(self.pdf_name, pagesize=letter)
        self.story = []

    def get_prepared_rows(self):
        row = [your_mark_details, threat_mark_details]
        yield row

    def generate_pdf(self):
        report_table = LongTable([row for row in self.get_prepared_rows()])
        self.story.append(report_table)
        self.document.build(self.story)

2 个答案:

答案 0 :(得分:0)

35k页面并不是PDF的主流使用,因此任何故障都不是完全意外的。探索一些想法:

  • 很可能机器只是用完了RAM来处理大量数据,而硬件升级会有所帮助。
  • 您可以尝试将数据分为多个表而不是一个大表,以查看这样做是否可以提高性能。
  • 是否可以将内容临时拆分(使用GhostScript等不同工具将其重新缝合到一个文件中)还是永久地拆分为多个文件?
  • 是否可以自己处理分页(例如,如果内容元素的长度是可预测的)?大表的分页可能会(或可能不会)失控。
  • 您可以尝试测试与LongTable不同且长度相同的数据结构,以检查问题是否与该特定结构有关;如果是;您也许可以找到其他选择。
  • 最后(或首先,取决于您的意愿),您可以查看相关代码和/或向ReportLab团队提出问题。

答案 1 :(得分:0)

我花了很多时间来查找上述问题的原因。您可以尝试使用为处理大数据而优化的BigDataTable类来代替LongTable。

GIST BigDataTable faster LongTable on the big data

经过6500行和7列测试:

  • LongTable:> 1小时的总文档构建时间处理
  • BigDataTable:约占文档构建时间的 24.2秒