使用 python 复制文本创建 Reportlab PDF

Reportlab PDF creating with python duplicating text

我正在尝试通过从 pandas 数据框中读取数据并使用 pyPDF2 和 reportlab 在现有 pdf 表单上写入页面来自动生成 pdf。该程序的主要内容在这里:

def pdfOperations(row, bp):
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    createText(row, can)
    packet.seek(0)
    new_pdf = PdfFileReader(packet)
    textPage = new_pdf.getPage(0)
    secondPage = bp.getPage(1)
    secondPage.mergePage(textPage)
    assemblePDF(frontPage, secondPage, row)
    del packet, can, new_pdf, textPage, secondPage

def main():
    df = openData()
    bp = readPDF()
    frontPage = bp.getPage(0)
    for ind in df.index:
        row = df.loc[ind]
        pdfOperations(row, bp)

这对于第一行数据和生成的第一个 pdf 工作正常,但对于后续数据,所有文本都被覆盖。 IE。第二个 pdf 包含第一次迭代和第二次迭代的文本。我认为垃圾收集会处理所有内存更改,但这似乎并没有发生。有人知道为什么吗?

我什至尝试在函数完成 运行 后强制删除对象,但没有成功...

您在循环之前只阅读了一次 bp。然后在循环中,您通过 getPage(1) 获得它的第二页并将内容合并到它。但是因为它总是来自同一个对象(bp),每次迭代都会合并到同一个页面,因此之前完成的所有合并加起来。

虽然我在 PyPDF2 的文档中找不到创建页面 "deepcopy" 的任何方法,但它应该可以为每次迭代创建一个新的 bp 对象。

readPDF 的某个地方,您一定做了一些事情,将模板 PDF 打开到二进制流中,然后将其传递给 PdfFileReader。相反,您可以将数据读入变量:

with open(filename, "rb") as f:
    bp_bin = f.read()

然后,为每个循环迭代创建一个新的 PdfFileReader 实例:

for ind in df.index:
    row = df.loc[ind]
    bp = PdfFileReader(bp_bin)
    pdfOperations(row, bp)

这应该 "reset" secondPage 每次都没有任何额外的文件 I/O 开销。每次只重新解析一次,但根据文件大小和内容,可能花费的时间很短,您可以接受。