Search code examples
pythonpdfreportlabpypdf

Image drawn to reportlab pdf bigger than pdf paper size


i'm writing a program which takes all the pictures in a given folder and aggregates them into a pdf. The problem I have is that when the images are drawn, they are bigger in size and are rotated to the left oddly. I've searched everywhere, havent found anything even in the reportlab documentation.

Here's the code:

import os
from PIL import Image
from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.pdfgen import canvas
from reportlab.lib.units import cm
from StringIO import StringIO


def main():
    images = image_search()
    output = PdfFileWriter()
    for image in images:
        Image_file = Image.open(image)     # need to convert the image to the specific size first.
    width, height = Image_file.size
    im_width = 1 * cm
    # Using ReportLab to insert image into PDF
    watermark_str = "watermark" + str(images.index(image)) + '.pdf'
    imgDoc = canvas.Canvas(watermark_str)

    # Draw image on Canvas and save PDF in buffer
    # define the aspect ratio first
    aspect = height / float(width)

    ## Drawing the image
    imgDoc.drawImage(image, 0,0, width = im_width, height = (im_width * aspect))    ## at (399,760) with size 160x160
    imgDoc.showPage()
    imgDoc.save()
    # Get the watermark file just created
    watermark = PdfFileReader(open(watermark_str, "rb"))

    #Get our files ready

    pdf1File = open('sample.pdf', 'rb')
    page = PdfFileReader(pdf1File).getPage(0)
    page.mergePage(watermark.getPage(0))


    #Save the result

    output.addPage(page)
    output.write(file("output.pdf","wb"))

#The function which searches the current directory for image files.
def image_search():
    found_images = []
    for doc in os.listdir(os.curdir):
        image_ext = ['.jpg', '.png', '.PNG', '.jpeg', '.JPG']
        for ext in image_ext:
            if doc.endswith(ext):
                found_images.append(doc)
    return found_images

main()

I also tried scaling and specifying the aspect ratio using the im_width variable, which gave the same output.


Solution

  • After a little bit of confusion about your goal I figured out that the goal is to make a PDF overview of the images in the current folder. To do so we actual don't need PyPDF2 as Reportlab offers everything we need for this.

    See the code below with the comments as guidelines:

    def main():
        output_file_loc = "overview.pdf"
        imgDoc = canvas.Canvas(output_file_loc)
        imgDoc.setPageSize(A4) # This is actually the default page size
        document_width, document_height = A4
    
        images = image_search()
        for image in images:
            # Open the image file to get image dimensions
            Image_file = Image.open(image)
            image_width, image_height = Image_file.size
            image_aspect = image_height / float(image_width)
    
            # Determine the dimensions of the image in the overview
            print_width = document_width
            print_height = document_width * image_aspect
    
            # Draw the image on the current page
            # Note: As reportlab uses bottom left as (0,0) we need to determine the start position by subtracting the
            #       dimensions of the image from those of the document
            imgDoc.drawImage(image, document_width - print_width, document_height - print_height, width=print_width,
                             height=print_height)
    
            # Inform Reportlab that we want a new page
            imgDoc.showPage()
    
        # Save the document
        imgDoc.save()