Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - ReportLab and PyPDF edit PDF Issue

I am trying to edit an existing pdf file using PyPDF and ReportLab. When I try to position the red circle and red text, it appears to be hiding behind a white container or something. If I position it anywhere else, it works fine. What is causing this?

sample 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

WHAT THE ERROR IS:

WHAT THE FINAL RESULT SHOULD BE:

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()
like image 700
zachjohn987 Avatar asked Jul 02 '26 15:07

zachjohn987


1 Answers

Try using PdfFileWriter and PdfFileReader instead of not PdfWriter and PdfReader, and The merge_page method should be called on a PdfFileWriter object, not a PdfFileReader object.

Try this code :

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()
like image 126
Hedi Mineoui Avatar answered Jul 05 '26 05:07

Hedi Mineoui



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!