Python - ReportLab 和 PyPDF 编辑 PDF 问题

8

我正在尝试使用PyPDFReportLab编辑现有的pdf文件。当我尝试定位红色圆圈和红色文本时,它似乎被隐藏在白色容器或其他东西后面。如果我将其放在其他任何地方,它就可以正常工作。这是什么原因导致的?

示例pdf=https://www.puc.nh.gov/regulatory/CASEFILE/2010/10-246/INITIAL%20FILING%20-%20PETITION/10-246%202010-09-13%20BAYRING%20ATT%20TO%20PET%20FOR%20AUTH%20TO%20CONSTRUCT%20UTILITY%20CABLE%20OVER%20AND%20ACROSS%20SUNCOOK%20RIVER.PDF

错误信息:

最终结果应该是:

from PyPDF2 import PdfWriter, PdfReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.colors import red

def main():
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    can.setFillColorRGB(1, 0, 0)
    can.circle(370,780,20,fill=1)
    can.setFillColor(red)
    can.setFont("Times-Roman", 14)
    can.drawString(352, 785, "Customer Group #22")
    can.save()

    packet.seek(0)
    new_pdf = PdfReader(packet)

    existing_pdf = PdfReader(open("samplePDF.pdf", "rb"))
    output = PdfWriter()

    page = existing_pdf.pages[1]
    page.merge_page(new_pdf.pages[0])
    output.add_page(page)

    outputStream = open("finalPDF.pdf", "wb")
    output.write(outputStream)
    outputStream.close()
if __name__ == "__main__":
    main()

4
能否分享PDF文件? - Hoang Minh Quang FX15045
1
我认为最简单的方法是将文件上传到您的Google Drive(或任何其他云存储方法)。右键单击并选择共享链接。然后,您可以复制并粘贴链接到帖子中。 - Hoang Minh Quang FX15045
1
我明白了。是的,我不知道为什么红色圆圈或文本被切断了。就像隐藏在标题容器后面一样。 - zachjohn987
1
当我用LibreOffice Draw打开PDF时,我可以看到不同的横向画布和纵向页面内容。我不确定这是否是确切的问题,但我之前遇到过类似的问题。 - SajanGohil
1
PyPDF2已经被弃用,请使用pypdf。 - Martin Thoma
显示剩余6条评论
2个回答

1

尝试使用PdfFileWriter和PdfFileReader代替PdfWriter和PdfReader,并且merge_page方法应该在PdfFileWriter对象上调用,而不是PdfFileReader对象。

尝试以下代码:

from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.colors import red

def main():
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)
    can.setFillColorRGB(1, 0, 0)
    can.circle(370,780,20,fill=1)
    can.setFillColor(red)
    can.setFont("Times-Roman", 14)
    can.drawString(352, 785, "Customer Group #22")
    can.save()

    packet.seek(0)
    new_pdf_reader = PdfFileReader(packet)

    existing_pdf_reader = PdfFileReader(open("samplePDF.pdf", "rb"))
    output = PdfFileWriter()

    page = existing_pdf_reader.getPage(0)
    page.mergePage(new_pdf_reader.getPage(0))
    output.addPage(page)

    outputStream = open("finalPDF.pdf", "wb")
    output.write(outputStream)
    outputStream.close()

if __name__ == "__main__":
    main()

感谢您的回复。但是,PdfFileWriter和PdfFileReader都已过时。 - zachjohn987
PyPDF2已经不再使用,建议使用pypdf。 - Martin Thoma

1

可能原因

您的问题很可能是由于现有的PDF文档上存在白色背景,而您正在尝试在其上添加红色圆圈和文本。 由于圆圈和文本也是红色的,它们在白色背景上不可见。

解决方法

  • 您可以在现有的PDF文档上方添加一个透明层,然后
  • 在此层上添加圆圈和文本。
  • 这将确保白色背景不会干扰圆圈和文本的可见性。

代码说明

  • 您应该首先使用alpha值为0.5的rect函数创建一个透明层。
  • 这将创建一个黑色填充的矩形,透明度为50%。
  • 然后,您可以使用mergePage函数将此透明层与现有PDF页面的内容合并。
  • 这将确保红色圆圈和文本添加在透明层的顶部,并且即使在现有PDF文档的白色背景下也可见。

代码

from PyPDF2 import PdfWriter, PdfReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.lib.colors import red

def main():
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=letter)

    # Create a transparent layer
    can.setFillColorRGB(0, 0, 0, alpha=0.5)
    can.rect(0, 0, letter[0], letter[1], fill=1)

    can.setFillColorRGB(1, 0, 0)
    can.circle(370,780,20,fill=1)
    can.setFillColor(red)
    can.setFont("Times-Roman", 14)
    can.drawString(352, 785, "Customer Group #22")
    can.save()

    packet.seek(0)
    new_pdf = PdfReader(packet)

    existing_pdf = PdfReader(open("samplePDF.pdf", "rb"))
    output = PdfWriter()

    # Merge the transparent layer and the content from the existing PDF page
    page = existing_pdf.pages[1]
    page.mergePage(new_pdf.pages[0])
    output.addPage(page)

    outputStream = open("finalPDF.pdf", "wb")
    output.write(outputStream)
    outputStream.close()

if __name__ == "__main__":
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接