0

Using another stackoverflow question & answer, I was able to locate code which partially resolves what I am trying to do Merge PDF files.

However, this modified code results in the contents of two PDFs overlapping each outer. I am trying to stack them or vertically concatenate the results:

Example:

  • PDF1 Contents -> "Hello World"
  • PDF2 Contents -> "I am Bill"

Code below results in the following overlapping image:

  • Invalid Result

Desired results would look as follows:

  • Desired Result

Code Used resulting in overlapping imge:

import pdfrw
dirPATH = r'c:\users\<username>\projects\concat_pdfs'
pdf1 = os.path.join(dirPATH, 'PDF1.pdf')
pdf2 = os.path.join(dirPATH, 'PDF2.pdf')

def concat_pdfs(pdf1, pdf2, output):
    form = pdfrw.PdfReader(pdf1)
    olay = pdfrw.PdfReader(pdf2)
    
    for form_page, overlay_page in zip(form.pages, olay.pages):
        merge_obj = pdfrw.PageMerge()
        overlay = merge_obj.add(overlay_page)[0]
        pdfrw.PageMerge(form_page).add(overlay).render()
        
    writer = pdfrw.PdfWriter()
    writer.write(output, form)
    
concat_pdfs(section1, section2, 'result.pdf')

Thanks in advance!

Lee_Str
  • 3,266
  • 2
  • 21
  • 32

2 Answers2

-1

Have you tried


def combine_pdfs(dir_path1, dir_path2, save_path):
    pdf1 = pdfrw.PdfReader(dir_path1)
    pdf2 = pdfrw.PdfReader(dir_path2)
    pdf_writer = pdfrw.PdfWriter()
    for page in pdf1.pages:
        pdf_writer.addpage(page)
    for page in pdf2.pages:
        pdf_writer.addpage(page)
    pdf_writer.write(save_path)

Sam
  • 86
  • 2
  • 10
  • When running this code, it produces the same overlapping results that I currently get. Looking to have the text appear on page as non-overlapping (two separate lines). Thank you though. – Lee_Str Dec 01 '21 at 18:29
  • I used the function to merge two pdfs and it was successful without getting an overlap. How are you creating your pdf? – Sam Dec 01 '21 at 19:40
-1

Here's an example using PyPDF2 library:

  merger = PdfFileMerger()
  for filename in files:
    f = files[filename]
    loc = "/tmp/" + secure_filename(filename).replace(".pdf", "") + "_" + str(time.time()) + ".pdf"
    f.save(loc)
    f.close()
    reader = PdfFileReader(loc, "rb")
    merger.append(reader)
  dest = "/tmp/merged_" + str(time.time()) + ".pdf"
  merger.write(dest)

Here is another using pike pdf:

  pdf = Pdf.new()
  for filename in files:
    f = files[filename]
    loc = "/tmp/" + secure_filename(filename).replace(".pdf", "") + "_" + str(time.time()) + ".pdf"
    f.save(loc)
    f.close()
    reader = Pdf.open(loc)
    pdf.pages.extend(reader.pages)
  dest = "/tmp/merged_" + str(time.time()) + ".pdf"
  pdf.save(dest)

Imports might look something like:

import time
import pdfkit
import os
from PyPDF2 import PdfFileMerger, PdfFileReader
from werkzeug.utils import secure_filename
from pikepdf import Pdf
shadowfox
  • 505
  • 4
  • 7
  • Both of these pieces of code merge each PDF onto its own page of a new PDF. I am needing to merge content onto a single PDF Page. Contents of PDF1 (New line character) + Contents of PDF2. With no page break... – Lee_Str Dec 01 '21 at 18:53