2
votes

I'm trying to add some text (page numbers) to an existing PDF file. Using PyPDF2 package iterating through the original file, creating a canvas, then merging the two files. My problem is that once the program is finished, the new pdf file only has the last page from the original pdf, not all the pages.

eg. If the original pdf has 33 pages, the new pdf only has the last page but with the correct numbering.

Maybe the code can do a better job at explainng:

    def test(location, reference, destination):
file = open(location, "rb") 
read_pdf = PyPDF2.PdfFileReader(file)

for i in range (0, read_pdf.getNumPages()): 
    page = read_pdf.getPage(i)

    pageReference = "%s_%s"%(reference,format(i+1, '03d'))
    width = getPageSizeW(page)
    height = getPageSizeH(page)
    pagesize = (width, height)

    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize = pagesize) 
    can.setFillColorRGB(1,0,0)
    can.drawString(height*3.5, height*2.75, pageReference)
    can.save()

    packet.seek(0) 
    new_pdf = PyPDF2.PdfFileReader(packet)
    #add new pdf to old pdf
    output = PyPDF2.PdfFileWriter()

    page.mergePage(new_pdf.getPage(0))
    output.addPage(page)
    outputStream = open(destination, 'wb')
    output.write(outputStream)

    print(pageReference)

outputStream.close()
file.close()

    def getPageSizeH(p):
        h = float(p.mediaBox.getHeight()) * 0.352
        return h

   def getPageSizeW(p):
        w = float(p.mediaBox.getWidth()) * 0.352
        return w

Also if anyone has any ideas on how to insert the references on the top right in a better way, it would be appreciated.

1

1 Answers

0
votes

I'm not an expert at PyPDF2 but it looks like the only area in your function where you have PyPDF2.PdfFileWriter() is in your for loop, so I suspect you are initiating a new file and adding to it each time in your for loop, which may cause the end result what you see.