文本在同一页面上打印两次

时间:2017-01-01 17:53:42

标签: python python-2.7 reportlab pypdf2

我生成的pdf存在问题,生成的pdf文件有4页,我使用现有的pdf和两页。我必须使用pyPD2reportlab撰写一些文字。

当我使用getPage()方法时,我想在合并之前制作页面副本,但由于某些原因,它使用相同的页面并且我多次打印文本。

我该如何避免?

我的代码

packet = io.BytesIO()
can = canvas.Canvas(packet)
can.drawString(0,0, "Print on page 1")
can.showPage()
can.drawString(200,200, "Print on page 2")
can.showPage()
can.drawString(0,0, "Print on page 3")
can.showPage()
can.drawString(200,200, "Print on page 4")
can.save()

new_pdf = PdfFileReader(packet)

path_of_two_page_pdf = 'overview.pdf'
existing_pdf = PdfFileReader(file(path_of_two_page_pdf, "rb"))

output = PdfFileWriter()
for pi in range(4):
    page = existing_pdf.getPage(pi % 2)
    page.mergePage(new_pdf.getPage(pi))
    output.addPage(page)

outputStream = file("NEW_PDF.pdf", "wb")
output.write(outputStream)
outputStream.close()

2 个答案:

答案 0 :(得分:1)

问题是getPage()实际上返回指向页面的指针而不是全新的页面。因此,当应用mergePage()时,它会将其合并到现有的pdf中。

最简单的解决方法是首先创建一个空白页面并使用它来合并其他页面,如下所示:

for pi in range(2*2):
    # By doing this we will always create a blank page with the same size as the last page of the existing_pdf
    new_page = PageObject.createBlankPage(pdf=existing_pdf)

    # Merge the pages onto the blank page
    new_page.mergePage(existing_pdf.getPage(pi % 2))
    new_page.mergePage(new_pdf.getPage(pi))

    # Add the new page to the output
    output.addPage(new_page)

一个注意事项,您可以使用createBlankPage而不是使用output.addBlankPage创建完全独立的空白页,但这需要手动设置页面大小,这可能并不理想。因此,使用pdf createBlankPage关键字,将页面大小设置为提供的pdf的最后一页。

答案 1 :(得分:0)

由于可以使用上面addBlankPage的@ B8vrede,所以我没有创建一个单独的空白页面,而是调用addBlankPage(返回对新创建页面的引用),指定A4大小

from reportlab.lib.pagesizes import A4


for pi in range(4):
    new_page = output.addBlankPage(*A4)
    new_page.mergePage(existing_pdf.getPage(pi % 2))
    new_page.mergePage(new_pdf.getPage(pi))