3

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)
4

2 回答 2

2

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

GIST BigDataTable 更快 LongTable 上的大数据

用 6500 行和 7 列测试:

  • LongTable:> 1 小时的总文档构建时间处理
  • BigDataTable:约24.2 秒的总文档构建时间处理
于 2019-12-17T10:57:02.163 回答
0

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

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