Place image over PDF

后端 未结 7 1690
忘了有多久
忘了有多久 2020-12-01 02:04

How can I place an image over an existing PDF file at an specific coordinate location. The pdf represents a drawing sheet with one page. The image will be scaled. I\'m check

相关标签:
7条回答
  • 2020-12-01 02:36

    I combined ReportLab (http://www.reportlab.com/software/opensource/rl-toolkit/download/) and pyPDF (http://pybrary.net/pyPdf/) to insert an image directly without having to generate the PDF up front:

    from pyPdf import PdfFileWriter, PdfFileReader
    from reportlab.pdfgen import canvas
    from StringIO import StringIO
    
    
    # Using ReportLab to insert image into PDF
    imgTemp = StringIO()
    imgDoc = canvas.Canvas(imgTemp)
    
    # Draw image on Canvas and save PDF in buffer
    imgPath = "path/to/img.png"
    imgDoc.drawImage(imgPath, 399, 760, 160, 160)    ## at (399,760) with size 160x160
    imgDoc.save()
    
    # Use PyPDF to merge the image-PDF into the template
    page = PdfFileReader(file("document.pdf","rb")).getPage(0)
    overlay = PdfFileReader(StringIO(imgTemp.getvalue())).getPage(0)
    page.mergePage(overlay)
    
    #Save the result
    output = PdfFileWriter()
    output.addPage(page)
    output.write(file("output.pdf","w"))
    
    0 讨论(0)
  • 2020-12-01 02:39

    This is what worked for me

    from PyPDF2 import PdfFileWriter, PdfFileReader
    
    def watermarks(temp, watermar,new_file):
        template = PdfFileReader(open(temp, 'rb'))
        wpdf = PdfFileReader(open(watermar, 'rb'))
        watermark = wpdf.getPage(0)
    
        for i in xrange(template.getNumPages()):
            page = template.getPage(i)
            page.mergePage(watermark)
            output.addPage(page)
    
            with open(new_file, 'wb') as f:
                output.write(f)
    
    0 讨论(0)
  • 2020-12-01 02:42

    Its been 5 years, I think these answers need some TLC. Here is a complete solution.

    The following is tested with Python 2.7

    Install dependencies

    pip install reportlab 
    pip install pypdf2
    

    Do the magic

    from reportlab.pdfgen import canvas
    from PyPDF2 import PdfFileWriter, PdfFileReader
    
    # Create the watermark from an image
    c = canvas.Canvas('watermark.pdf')
    
    # Draw the image at x, y. I positioned the x,y to be where i like here
    c.drawImage('test.png', 15, 720)
    
    # Add some custom text for good measure
    c.drawString(15, 720,"Hello World")
    c.save()
    
    # Get the watermark file you just created
    watermark = PdfFileReader(open("watermark.pdf", "rb"))
    
    # Get our files ready
    output_file = PdfFileWriter()
    input_file = PdfFileReader(open("test2.pdf", "rb"))
    
    # Number of pages in input document
    page_count = input_file.getNumPages()
    
    # Go through all the input file pages to add a watermark to them
    for page_number in range(page_count):
        print "Watermarking page {} of {}".format(page_number, page_count)
        # merge the watermark with the page
        input_page = input_file.getPage(page_number)
        input_page.mergePage(watermark.getPage(0))
        # add page from input file to output document
        output_file.addPage(input_page)
    
    # finally, write "output" to document-output.pdf
    with open("document-output.pdf", "wb") as outputStream:
        output_file.write(outputStream)
    

    References:

    New home of pypdf: http://mstamy2.github.io/PyPDF2/

    Reportlab docs: http://www.reportlab.com/apis/reportlab/2.4/pdfgen.html

    Reportlab complete user guide: https://www.reportlab.com/docs/reportlab-userguide.pdf

    0 讨论(0)
  • 2020-12-01 02:44

    Thx to the previous answers. My way with python3.4

    # -*- coding: utf-8 -*-
    from io import BytesIO
    from PyPDF2 import PdfFileWriter, PdfFileReader
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4
    
    def gen_pdf():
        # there are 66 slides (1.jpg, 2.jpg, 3.jpg...)
        path = 'slades/{0}.jpg'
        pdf = PdfFileWriter()
    
        for num in range(1, 67):  # for each slide
            # Using ReportLab Canvas to insert image into PDF
            imgTemp = BytesIO()
            imgDoc = canvas.Canvas(imgTemp, pagesize=A4)
            # Draw image on Canvas and save PDF in buffer
            imgDoc.drawImage(path.format(num), -25, -45)
            # x, y - start position
            # in my case -25, -45 needed
            imgDoc.save()
            # Use PyPDF to merge the image-PDF into the template
            pdf.addPage(PdfFileReader(BytesIO(imgTemp.getvalue())).getPage(0))
    
        pdf.write(open("output.pdf","wb"))
    
    
    if __name__ == '__main__':
        gen_pdf()
    
    0 讨论(0)
  • 2020-12-01 02:47

    Since, its existing pdf, the most easy way to do it is:

    1. Convert pdf to .doc or .odt ( Check http://www.zamzar.com/ )
    2. Add images into the converted file however you want.
    3. Convert back to PDF (openoffice and libreoffice makes it easy to save pdfs)

    PS: If the pdf file needs to further edited always keep a backup of source .doc file, so that the changes can be done easily, too much conversion have bad effects on file quality.

    0 讨论(0)
  • 2020-12-01 02:49

    http://pybrary.net/pyPdf/:

    from pyPdf import PdfFileWriter, PdfFileReader
    
    output = PdfFileWriter()
    input1 = PdfFileReader(file("document1.pdf", "rb"))
    watermark = PdfFileReader(file("watermark.pdf", "rb"))
    
    input1.mergePage(watermark.getPage(0))
    
    # finally, write "output" to document-output.pdf
    outputStream = file("document-output.pdf", "wb")
    output.write(input1)
    outputStream.close()
    

    I think it's like watermark, see the manual for better idea

    0 讨论(0)
提交回复
热议问题