【问题标题】:Large PDFs taking exponentially longer time with ReportLab使用 ReportLab 处理大型 PDF 所需的时间呈指数级增长
【发布时间】:2019-08-04 03:43:45
【问题描述】:

我正在使用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)

【问题讨论】:

  • 您是否进行了一些测量以查看代码中发生阻塞的位置?
  • 是的,self.document.build(self.story) 占用了 99% 的全部时间

标签: python django pdf-generation reportlab platypus


【解决方案1】:

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

  • 可能只是因为机器在处理大量数据时耗尽了 RAM,而硬件升级会有所帮助。
  • 您可以尝试将数据拆分为多个表而不是一个大表,看看这是否会提高性能。
  • 是否可以将内容临时拆分(使用 GhostScript 等不同工具重新拼接到一个文件中)或永久拆分为多个文件?
  • 是否可以自己处理分页(例如,如果内容元素的长度是可预测的)?超大表格的分页可能会(也可能不会)失控。
  • 您可以尝试测试与LongTable 不同的、运行相同长度的数据结构,以检查问题是否与该特定结构有关;如果是;您也许可以找到替代方案。
  • 最后(或首先,取决于您的喜好),您可以查看相关代码和/或向 ReportLab 团队提出问题。

【讨论】:

    【解决方案2】:

    我花了很多时间寻找上述问题的原因。您可以尝试使用我的 BigDataTable 类来代替 LongTable,该类针对处理大数据进行了优化。

    GIST BigDataTable faster LongTable on the big data

    经过 6500 行 7 列测试:

    • Lo​​ngTable:> 1 小时 的总文档构建时间处理
    • BigDataTable:~ 24.2 秒 的总文档构建时间处理

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多