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

2024-05-15 01:03:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将大量文本文件转换为PDF(使用Python 3.8.5),然后按分页符分隔内容。分页符在这些文本文件中编码为表单提要,并在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或2MB)的一个问题。100kb范围内较小的文本文件不会太慢,但这些较大的文件需要花费数小时。当它们完成时,生成的PDF有数百或数千页长。我想缩短处理时间。在reportlab内部是否有更好的方法来做到这一点,或者建议改变方法——也许通过不同的包


Tags: fromimportpdflibglob文本文件reportlabstory
1条回答
网友
1楼 · 发布于 2024-05-15 01:03:19

您可以检查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

相关问题 更多 >

    热门问题