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

问题描述 投票:0回答:1
我有大量文本文件需要转换为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 中是否有更好的方法来做到这一点,或者建议改变方法 - 也许通过不同的包?

编辑

:我知道这是很多个月后的事了,但我最终发现这个问题对于换页符放置不一致的文本文件来说尤其是一个问题(例如,脚本会处理大量没有明显区别的文本)一页开始或结束的位置)。

您可以查看
python pdf pdf-generation reportlab
1个回答
2
投票
库。它是一个强大的 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)

查看文档
此处

© www.soinside.com 2019 - 2024. All rights reserved.