@zhangyu756897669
2017-09-28T15:48:16.000000Z
字数 4785
阅读 557
未分类
PyPDF2对应的PdfFileReader对象是PdfFileWriter对象,可以创建新的PDF文件。但PyPDF2无法将任意文本写入PDF中,如Python可以使用纯文本文件。相反,PyPDF2的PDF写入功能仅限于从其他PDF,旋转页面,叠加页面和加密文件复制页面。
PyPDF2不允许您直接编辑PDF。相反,您必须创建一个新的PDF,然后从现有文档复制内容。本节中的示例将遵循以下一般方法:
创建PdfFileWriter对象仅创建一个表示Python文档的值。它不会创建实际的PDF文件。为此,您必须调用PdfFileWriter的write()方法。
write()方法使用以二进制模式打开的常规File对象。您可以通过调用Python的open()函数来获取这样一个File对象,其中包含两个参数:要使用PDF文件名的字符串,“wb”表示文件应以写入二进制模式打开。
如果这听起来有点混乱,别担心,你会看到如何在以下代码示例中工作。
您可以使用PyPDF2将页面从一个PDF文档复制到另一个。这允许您组合多个PDF文件,剪切不需要的页面或重新排序页面。
从http://nostarch.com/automatestuff/下载meetingminutes.pdf和meetingminutes2.pdf,并将PDF放在当前工作目录中。
import PyPDF2
pdf1File = open('meetingminutes.pdf', 'rb')
pdf2File = open('meetingminutes2.pdf', 'rb')
pdf1Reader = PyPDF2.PdfFileReader(pdf1File)#❶
pdf2Reader = PyPDF2.PdfFileReader(pdf2File)#❷
pdfWriter = PyPDF2.PdfFileWriter()#❸
for pageNum in range(pdf1Reader.numPages):
pageObj = pdf1Reader.getPage(pageNum)#❹
pdfWriter.addPage(pageObj)#❺
for pageNum in range(pdf2Reader.numPages):
pageObj = pdf2Reader.getPage(pageNum)#❻
pdfWriter.addPage(pageObj)#❼
pdfOutputFile = open('combinedminutes.pdf', 'wb')#❽
pdfWriter.write(pdfOutputFile)
pdfOutputFile.close()
pdf1File.close()
pdf2File.close()
以读取二进制模式打开两个PDF文件,并将两个生成的File对象存储在pdf1File和pdf2File中。调用PyPDF2.PdfFileReader()并传递给pdf1File以获取一个PdfFileReader对象,以满足meetingminutes.pdf❶。再次调用它并通过它pdf2File获取一个PdfFileReader对象为meetingminutes2.pdf❷。然后创建一个新的PdfFileWriter对象,它表示一个空白的PDF文档❸。
接下来,复制两个源PDF中的所有页面,并将它们添加到PdfFileWriter对象。通过在PdfFileReader对象❹上调用getPage()来获取页面对象。然后将该页面对象传递给您的PdfFileWriter的addPage()方法❺。这些步骤首先为pdf1Reader,然后再次为pdf2Reader。完成复制页面后,通过将File对象传递给PdfFileWriter的write()方法❻,编写一个名为combineminutes.pdf的新PDF。
PyPDF2无法在PdfFileWriter对象的中间插入页面; addPage()方法只会将页面添加到最后。
您现在已经创建了一个新的PDF文件,它将来自meetingminutes.pdf和meetingminutes2.pdf的页面组合到一个文档中。请记住,传递给PyPDF2.PdfFileReader()的File对象需要以read-binary模式打开,将'rb'作为第二个参数传递给open()。同样,传递给PyPDF2.PdfFileWriter()的File对象需要以“wb”的二进制模式打开。
PDF的页面也可以使用rotateClockwise()和rotateCounterClockwise()方法以90度的增量旋转。将这些方法中的一个整数90,180或270。在交互式shell中输入以下内容,在当前工作目录中使用meetingminutes.pdf文件:
import PyPDF2
minutesFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)
page = pdfReader.getPage(0) #❶
page.rotateClockwise(90)#❷
'/Contents': [IndirectObject(961, 0),
IndirectObject(962, 0),
IndirectObject(963, 0),
IndirectObject(964, 0),
IndirectObject(965, 0),
IndirectObject(966, 0),
IndirectObject(967, 0),
IndirectObject(968, 0)],
............
pdfWriter = PyPDF2.PdfFileWriter()
pdfWriter.addPage(page)
resultPdfFile = open('rotatedPage.pdf', 'wb')#❸
pdfWriter.write(resultPdfFile)
resultPdfFile.close()
minutesFile.close()
这里我们使用getPage(0)来选择PDF❶的第一页,然后我们在该页面上调用rotateClockwise(90)❷。我们用旋转页面写一个新的PDF,并将其保存为rotatePage.pdf❸。
结果PDF将有一页,顺时针旋转90度,如图所示。 rotateClockwise()和rotateCounterClockwise()的返回值包含大量可以忽略的信息。
PyPDF2也可以将一个页面的内容覆盖另一个页面,这对于向页面添加徽标,时间戳或水印非常有用。使用Python,可以轻松地将多个文件的水印添加到程序指定的页面。
从http://nostarch.com/automatestuff/下载watermark.pdf,并将PDF放在当前工作目录以及meetingminutes.pdf中。
import PyPDF2
minutesFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(minutesFile)#❷
minutesFirstPage = pdfReader.getPage(0)#❷
pdfWatermarkReader = PyPDF2.PdfFileReader(open('watermark.pdf', 'rb'))#❸
minutesFirstPage.mergePage(pdfWatermarkReader.getPage(0))#❹
pdfWriter = PyPDF2.PdfFileWriter()#❺
pdfWriter.addPage(minutesFirstPage)#❻
for pageNum in range(1, pdfReader.numPages):#❼
pageObj = pdfReader.getPage(pageNum)
pdfWriter.addPage(pageObj)
resultPdfFile = open('watermarkedCover.pdf', 'wb')
pdfWriter.write(resultPdfFile)
minutesFile.close()
resultPdfFile.close()
这里我们制作一个PdfFileReader对象的meetingminutes.pdf❶。我们调用getPage(0)获取第一页的Page对象,并将该对象存储在minutesFirstPage❷中。然后,然后为watermark.pdf❸制作一个PdfFileReader对象,并在minutesFirstPage and上调用mergePage()。我们传递给mergePage()的参数是watermark.pdf的第一页的Page对象。
现在我们在minutesFirstPage上调用mergePage(),minutesFirstPage表示水印的第一页。我们制作一个PdfFileWriter对象❺并添加水印的第一页❻。然后我们循环遍历在meetingminutes.pdf中的其余页面,并将它们添加到PdfFileWriter对象中。最后,我们打开一个名为watermarkedCover.pdf的新PDF,并将PdfFileWriter的内容写入新的PDF。
结果如图13-3所示。我们的新PDF,watermarkedCover.pdf,具有meetingminutes.pdf的所有内容,第一页被加水印。
PdfFileWriter对象还可以向PDF文档添加加密。
import PyPDF2
pdfFile = open('meetingminutes.pdf', 'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFile)
pdfWriter = PyPDF2.PdfFileWriter()
for pageNum in range(pdfReader.numPages):
pdfWriter.addPage(pdfReader.getPage(pageNum))
pdfWriter.encrypt('swordfish')
resultPdf = open('encryptedminutes.pdf', 'wb')
resultPdf.close()
在调用write()方法保存到文件之前,调用encrypt()方法并传递一个密码字符串❶。 PDF可以具有用户密码(允许您查看PDF)和所有者密码(允许您设置打印,注释,提取文本和其他功能的权限)。用户密码和所有者密码分别是encrypt()的第一个和第二个参数。如果只有一个字符串参数传递给encrypt(),它将用于两个密码。
在本例中,我们将meetingminutes.pdf的页面复制到PdfFileWriter对象。我们用密码swordfish加密了PdfFileWriter,打开了一个名为encryptedminutes.pdf的新PDF,并将PdfFileWriter的内容写入新的PDF。在任何人都可以查看encryptedminutes.pdf之前,他们必须输入此密码。确保其副本被正确加密后,您可能需要删除原始的,未加密的meetingminutes.pdf文件。