【问题标题】:text printed twice on the same page在同一页上打印两次的文本
【发布时间】:2017-01-01 17:53:41
【问题描述】:

我生成的 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()

【问题讨论】:

  • 您能链接到输入文件,以便我进一步查看吗?
  • @B8vrede 我不明白为什么要投反对票。任何有两页的 PDF 都可以(我在每一页上绘制不同的字符串)。
  • 但是因为我刚刚修复了那部分,所以我删除了反对票
  • @B8vrede 感谢您的编辑。

标签: python python-2.7 reportlab pypdf2


【解决方案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)

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

【讨论】:

    【解决方案2】:

    由于可以使用上面提到的@B8vrede addBlankPage,因此我没有创建单独的空白页面,而是调用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))
    

    【讨论】:

      猜你喜欢
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2011-04-12
      相关资源
      最近更新 更多