如何使用PyPDF2附加PDF页面

时间:2014-04-01 19:24:49

标签: python pdf pdf-generation pypdf

是否有人使用python lib PyPDF2将两页PDF文件合并为一个。 当我尝试page1.mergePage(page2)时,结果是第2页覆盖了第1页。如何将page2添加到page1的底部?

5 个答案:

答案 0 :(得分:15)

当我在网上搜索python pdf合并解决方案时,我注意到合并与追加有一种普遍的误解。

大多数人将附加操作称为合并,但事实并非如此。您在问题中描述的内容实际上是mergePage 的预期用途,应该称为applyPageOnTopOfAnother,但这有点长。您所寻找的是什么?真正将两个文件/页面附加到一个新文件中。

附加PDF文件

使用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页面

要附加不同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()

将两个页面合并为一个页面

使用mergePage

  

将两个页面的内容流合并为一个。资源参考   (即字体)从两个页面维护。 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)

以下链接中发布的代码完成了您的目标。

Using PyPDF2 to merge files into multiple output files

我相信诀窍是:

merger.append(输入)