Не удается объединить страницы PDF с pypdf2 - PullRequest
0 голосов
/ 20 мая 2018

С этими демонстрационными файлами ,

test.pdf: "Hello"
tomerge1.pdf: "1"
tomerge2.pdf: "2"

в output.pdf, я хотел бы:

  • Страница 1: Страница 1 из test.pdf объединена со Страной 1 из tomerge1.pdf, то есть "Hello"1 "
  • Страница 2: Страница 1 из test.pdf объединена со Страной 1 из tomerge2.pdf, т. Е." Hello 2 "

Вот что я использовал:

from PyPDF2 import PdfFileWriter, PdfFileReader

outputpdf = PdfFileWriter()
inputpdf = PdfFileReader(open("test.pdf", "rb"))
tomerge1 = PdfFileReader(open("tomerge1.pdf", "rb"))
tomerge2 = PdfFileReader(open("tomerge2.pdf", "rb"))

page = inputpdf.getPage(0)
page.mergePage(tomerge1.getPage(0))
outputpdf.addPage(page)

# exit()
# if we stop here, the output is "Hello 1", which is good
# Why isn't "Hello 1" remembered here?
# del page    # doesn't change anything

page = inputpdf.getPage(0)
page.mergePage(tomerge2.getPage(0))
outputpdf.addPage(page)

with open("output.pdf", "wb") as f:
    outputpdf.write(f)

К сожалению, это не работает: вместо «Hello 1» / «Hello 2» выводится: «Hello 2» / «Hello 2».

Вопрос: как вести себя ожидаемым образом? (без очень быстрого увеличения размера при 10 или 20 страницах)

1 Ответ

0 голосов
/ 20 мая 2018

Я обнаружил, когда выполнял аналогичное упражнение, которое вам нужно прочитать один раз и объединить один раз.Чтобы обойти это, нужно настроить два считывателя для слияния входного файла («test.pdf») из двух считывателей.Пример кода ниже:

addressfile = open("Documents/addresses.pdf","rb")
xwfile = "Downloads/input.pdf"
crosswordfile = open(xwfile,"rb")
xword = PdfFileReader(crosswordfile)
xw2 = PdfFileReader(crosswordfile)
addr = PdfFileReader(addressfile)
xwpage = xword.getPage(0)
addpage1 = addr.getPage(1)
addpage2 = addr.getPage(2)
pdfWriter = PdfFileWriter()
xp2 = xw2.getPage(0)
xwpage.mergePage(addpage1)
xp2.mergePage(addpage2)
res = open("/home/paula/xw.pdf",'wb')
pdfWriter.addPage(xwpage)
pdfWriter.addPage(xp2)
pdfWriter.write(res)
res.close()
crosswordfile.close()

Так в вашем коде это будет:

testfile = open("test.pdf", "rb")
outputpdf = PdfFileWriter()
inputpdf1 = PdfFileReader(testfile)
inputpdf2 = PdfFileReader(testfile)
tomerge1 = PdfFileReader(open("tomerge1.pdf", "rb"))
tomerge2 = PdfFileReader(open("tomerge2.pdf", "rb"))

page1 = inputpdf1.getPage(0)
page1.mergePage(tomerge1.getPage(0))
outputpdf.addPage(page1)

# exit()
# No need stop here, the output will have both "Hello 1" and "Hello 2"
# Using two readers for the same file fools PyPdf2 into thinking they 
# are two different files, i.e. that we are merging from two sperate sources

page2 = inputpdf2.getPage(0)
page2.mergePage(tomerge2.getPage(0))
outputpdf.addPage(page2)

with open("output.pdf", "wb") as f:
    outputpdf.write(f)
...