Search code examples
pythonpdfpypdfgenerate

How to combine 5 PDFs in one in the same page


I'm generating a lot of PDFs and for each 5 PDFs, I want to combine then on one page.

from pypdf import PdfMerger

merger = PdfMerger()

for pdf in ["out_mitry.pdf", "out_cdg.pdf"]:
    merger.append(pdf)

merger.write("result.pdf")
merger.close()

My actual result is getting the merge but every pdf is on one page. I want to merge 5 pdf in one page


Solution

  • I recently ran into a problem like this and found a solution. I demonstrate solution for two one page files and you can easily extend it to any number of pdfs.

    Let's combine pages this way:

    ---------
    |   |   |
    | 1 | 2 |
    |   |   |
    ---------
    
    from pypdf import PdfWriter, PdfReader, PageObject, Transformation
    
    pdf_filenames = ["out_mitry.pdf", "out_cdg.pdf"]
    
    reader1 = PdfReader(pdf_filenames[0])
    reader2 = PdfReader(pdf_filenames[1])
    
    page1 = reader1.pages[0]
    page2 = reader2.pages[0]
    
    total_width = page1.mediabox.right + page2.mediabox.right
    total_height = max([page1.mediabox.top, page2.mediabox.top])
    
    new_page = PageObject.create_blank_page(width=total_width, height=total_height)
    
    # Add first page at the 0,0 position
    new_page.merge_page(page1)
    
    # Add second page with moving along the axis x
    page2.add_transformation(Transformation().translate(page1.mediabox.right, 0))
    page2.mediabox = new_page.mediabox  # ensure it is visible
    new_page.merge_page(page2)
    
    writer = PdfWriter()
    writer.add_page(new_page)
    writer.write(open("result.pdf", "wb"))