使用 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 开销。每次只重新解析一次,但根据文件大小和内容,可能花费的时间很短,您可以接受。
我正在尝试通过从 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 开销。每次只重新解析一次,但根据文件大小和内容,可能花费的时间很短,您可以接受。