有没有人使用Python库PyPDF2合并两个PDF文件页面的经验。当我尝试page1.mergePage(page2)
时,结果是page2叠加在page1上面。如何使其将page2添加到page1底部?
有没有人使用Python库PyPDF2合并两个PDF文件页面的经验。当我尝试page1.mergePage(page2)
时,结果是page2叠加在page1上面。如何使其将page2添加到page1底部?
当我在搜索Python PDF合并方案时,我注意到有一个关于合并和附加的普遍误解。
大多数人称追加操作为合并,但实际上这并非如此。您在问题描述中真正需要使用的是 mergePage
方法,它应该被称为 applyPageOnTopOfAnother
,但那有点长。您所寻找的是将两个文件/页面附加到一个新文件中。
使用 PdfFileMerger
类及其append
方法。
与
merge()
方法相同,但假设您要将所有页面连接到文件末尾而不是指定位置。
以下是从pypdf 将多个pdf文件合并成一个pdf中摘取的一种方法:
from PyPDF2 import PdfFileMerger, PdfFileReader
# ...
merger = PdfFileMerger()
merger.append(PdfFileReader(file(filename1, 'rb')))
merger.append(PdfFileReader(file(filename2, 'rb')))
merger.write("document-output.pdf")
要追加不同PDF文件的特定页面,请使用PdfFileWriter
类和addPage
方法。
向此PDF文件添加页面。该页面通常来自
PdfFileReader
实例。
file1 = PdfFileReader(file(filename1, "rb"))
file2 = PdfFileReader(file(filename2, "rb"))
output = PdfFileWriter()
output.addPage(file1.getPage(specificPageIndex))
output.addPage(file2.getPage(specificPageIndex))
outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
使用mergePage
函数。
将两个页面的内容流合并成一个。保留两个页面的资源引用(如字体)。此页面的mediabox/cropbox等不会被改变。参数page的内容流将被添加到此页面的内容流末尾,即它将在此页面之后或“顶部”绘制。
file1 = PdfFileReader(file(filename1, "rb"))
file2 = PdfFileReader(file(filename2, "rb"))
output = PdfFileWriter()
page = file1.getPage(specificPageIndex)
page.mergePage(file2.getPage(specificPageIndex))
output.addPage(page)
outputStream = file("document-output.pdf", "wb")
output.write(outputStream)
outputStream.close()
from PyPDF2 import PdfFileMerger, PdfFileReader
pdf_content_1 = requests.get('http://foo/bar.pdf').content
pdf_content_2 = requests.get('http://bar/foo.pdf').content
# Write to in-memory file-like buffers
pdf_buffer_1 = StringIO.StringIO().write(pdf_content_1)
pdf_buffer_2 = StringIO.StringIO().write(pdf_content_2)
pdf_merged_buffer = StringIO.StringIO()
merger = PdfFileMerger()
merger.append(PdfFileReader(pdf_buffer_1))
merger.append(PdfFileReader(pdf_buffer_2))
merger.write(pdf_merged_buffer)
# Option 1:
# Return the content of the buffer in an HTTP response (Flask example below)
response = make_response(pdf_merged_buffer.getvalue())
# Set headers so web-browser knows to render results as PDF
response.headers['Content-Type'] = 'application/pdf'
response.headers['Content-Disposition'] = \
'attachment; filename=%s.pdf' % 'Merged PDF'
return response
# Option 2: Write to disk
with open("merged_pdf.pdf", "w") as fp:
fp.write(pdf_merged_buffer.getvalue())
AttributeError: 'int' object has no attribute 'seek'
错误,其中包括merger.append(PdfFileReader(pdf_buffer_1))
。 - Mazze我是这样做的:
reader = PyPDF2.PdfFileReader(open("input.pdf",'rb'))
NUM_OF_PAGES = reader.getNumPages()
page0 = reader.getPage(0)
h = page0.mediaBox.getHeight()
w = page0.mediaBox.getWidth()
newpdf_page = PyPDF2.pdf.PageObject.createBlankPage(None, w, h*NUM_OF_PAGES)
for i in range(NUM_OF_PAGES):
next_page = reader.getPage(i)
newpdf_page.mergeScaledTranslatedPage(next_page, 1, 0, h*(NUM_OF_PAGES-i-1))
writer = PdfFileWriter()
writer.addPage(newpdf_page)
with open('output.pdf', 'wb') as f:
writer.write(f)
当每个页面的高度和宽度相同时,此方法可行。否则,它需要进行一些修改。
也许Emile Bergeron的解决方案更好。没有尝试过。
pdfrw库可以实现此功能。在示例目录中有一个4up示例,将4个输入页面放置在每个输出页面上,还有一个小册子示例,将8.5x11的输入创建为11x17的输出。免责声明-我是pdfrw的作者。