使用 Python 的 ReportLab 包从大文本文件生成 PDF 文档很慢

Posted

技术标签:

【中文标题】使用 Python 的 ReportLab 包从大文本文件生成 PDF 文档很慢【英文标题】:Generating PDF documents from large text files using Python's ReportLab package is slow 【发布时间】:2021-04-19 15:20:49 【问题描述】:

我有大量文本文件需要转换为 PDF(使用 Python 3.8.5),然后按分页符分隔内容。分页符在这些文本文件中编码为 form feeds,并在 Python 中用子字符串 \x0c 表示。我可以通过这些表单提要阅读文本并拆分文档。然后,我使用包reportlab 创建具有正确分页的PDF。这是我的代码的精简版:

import glob
from reportlab.lib,enums import TA_JUSTIFY
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, PageBreak, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch

file = glob.glob(wdir + text_folder + "/**/*.txt", recursive=True)
for i in file:
     doc = SimpleDocTemplate(i[:-4] + ".pdf", pagesize=letter, rightmMargin=72, leftMargin=72, topMargin=72, bottomMargin=18)
     f = open(i, encoding='utf-8')
     k = f.read()
     k_breaks = k.split("\x0c")
     Story = []
     styles=getSampleStyleSheet()
     styles.add(ParagraphStyle(name='Justify', alignment=TA_JUSTIFY))
     for j in range(len(k_breaks)):
          ptext='<font size="12">' + k_breaks[j] + '</font>'
          Story.append(Paragraph(ptext, styles["Justify"]))
          Story.append(Spacer(1,12))
          if j != len(k_breaks)-1:
               Story.append(PageBreak())
     doc.build(Story)

通过跟踪,我发现我的代码似乎遇到了瓶颈

          Story.append(Paragraph(ptext, styles["Justify"]))
          Story.append(Spacer(1,12))

虽然,这实际上只是大型文本文件(超过 1 或 2 mb)的问题。 100kb 范围内的较小文本文件不会慢,但这些较大的文件需要几个小时。完成后,生成的 PDF 文件长达数百或数千页。我想减少处理时间。 reportlab 中是否有更好的方法来做到这一点,或者建议改变方法 - 也许通过不同的包?

【问题讨论】:

【参考方案1】:

您可以查看pdfme 库。它是python中最强大的创建PDF文档的库。

我不知道使用这些大文件是否会更快,但您可以尝试一下并检查以下代码:

import glob
from pdfme import build_pdf

file = glob.glob(wdir + text_folder + "/**/*.txt", recursive=True)
for i in file:
     f = open(i, encoding='utf-8')
     k = f.read()
     k_breaks = k.split("\x0c")
     sections = ["content": [k_break] for k_break in k_breaks]
     with open(i[:-4] + ".pdf", 'wb') as f:
         build_pdf(
             "style": "s": 12, "text_aling": "j",
             "page_style": "page_size": "letter", "margin": [72,72,18,72],
             "sections": sections
         , f)

查看文档here。

【讨论】:

以上是关于使用 Python 的 ReportLab 包从大文本文件生成 PDF 文档很慢的主要内容,如果未能解决你的问题,请参考以下文章

python 安装 reportlab 报错 “ImportError: No module named reportlab.lib”

Python Reportlab 分页符

如何在python的reportlab Canvas中设置任何字体?

Python:如何使 Reportlab 在 PDF 输出中移至下一页

如何将整个表格与 Python Reportlab 库对齐?

Python Reportlab PDF - 在页面上居中文本