是否有人使用python lib PyPDF2将两页PDF文件合并为一个。
当我尝试page1.mergePage(page2)
时,结果是第2页覆盖了第1页。如何将page2添加到page1的底部?
答案 0 :(得分:15)
当我在网上搜索python pdf合并解决方案时,我注意到合并与追加有一种普遍的误解。
大多数人将附加操作称为合并,但事实并非如此。您在问题中描述的内容实际上是mergePage
的预期用途,应该称为applyPageOnTopOfAnother
,但这有点长。您所寻找的是什么?真正将两个文件/页面附加到一个新文件中。
使用PdfFileMerger
课程及其append
method。
与
merge()
方法相同,但假设您要连接 所有页面都放在文件末尾而不是指定位置。
这是从pypdf Merging multiple pdf files into one 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
method一起使用。
向此PDF文件添加页面。该页面通常从a获取
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()
将两个页面的内容流合并为一个。资源参考 (即字体)从两个页面维护。 mediabox / cropbox /等 这个页面的内容不会改变。参数页面的内容流将是 被添加到此页面的内容流的末尾,意味着它 将在此页面之后绘制,或“在顶部”。
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()
答案 1 :(得分:2)
pdfrw库可以做到这一点。示例目录中有一个4up示例,它在每个输出页面上放置4个输入页面,以及一个小册子示例,它采用8.5x11输入并创建11x17输出。免责声明 - 我是pdfrw作者。
答案 2 :(得分:2)
这种方式:
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解决方案更好。没有尝试。
答案 3 :(得分:1)
如果本地计算机上不存在2个PDF,而是通过URL(即http://foo/bar.pdf& http://bar/foo.pdf)正常访问/下载,我们可以从远程位置获取这两个PDF将它们合并在内存中,一举一动。
这消除了开始下载PDF的假设步骤,并且允许我们概括超出磁盘上存在的两个PDF的简单情况。具体而言,它将解决方案概括为任何HTTP可访问的PDF。
示例:
if( !empty($params['searchPhrase']) )
{
$where .=" WHERE";//change this line to $where .=" AND";
.
.
.
}
答案 4 :(得分:-1)