这篇文章介绍使用Python处理PDF文件的编辑任务。分为几个不同的部分:加密PDF,提取PDF的文字内容,合并PDF文件,添加水印。
加密PDF文件
我们先来拷贝一份PDF文件,然后对它加密。在这里,需要使用到库PyPDF2,如果没有的话,需要提前安装: pip3 install PyPDF2
,所有的读写操作都可以由它完成,对于文件加密,它提供了非常方便的接口PdfFileWriter::encrypt
,接下来看看例子。
code snippet:
import PyPDF2
fileName = "/Users/weiyang/Desktop/Test.pdf"
newFileName = "/Users/weiyang/Desktop/NewTest.pdf"
file = open( fileName, 'rb' )
reader = PyPDF2.PdfFileReader( file )
writer = PyPDF2.PdfFileWriter()
for pageIndex in range( reader.numPages ):
writer.addPage( reader.getPage( pageIndex ) )
writer.encrypt( 'bell' ) #passwd
newFile = open( newFileName, "wb" )
writer.write( newFile )
newFile.close()
file.close()
result:

如果不想保留原始的文件,可以使用OS库中的rename方法,将新的文件覆盖Test.pdf即可。要使用Python解密的话,PdfFileReader的decrypt方法可以帮助到我们。
从PDF中提取文本内容
实验的材料还是上面部分的Test.pdf,第三方库PyPDF2能帮助我们提取文本,可它也仅限于提取文本内容,不能要求更多了。PDF是一种二进制文件,很难做到全部提取。从目前的技术水平来看,我们只能尽可能提取多的文本。
下面的代码展示了简单的提取流程,结果不完美,少了一行文字。
import PyPDF2
import os
fileName = "/Users/weiyang/Desktop/Test.pdf"
file = open( fileName, 'rb' )
reader = PyPDF2.PdfFileReader( file )
page = reader.getPage( 0 )
content = page.extractText()
print content
file.close()
合并两份不同的PDF文件
有时候,我们想要把不同的PDF文件合并成一份,在PyPDF2看来,这就是读写操作的组合。在下面的例子中,我将Test1.pdf和Test2.pdf合并成新的文件NewTest.pdf。
(我们还可以针对Test1.pdf和Test2.pdf组合writer.addPage,调整页面的次序,自由发挥)
import PyPDF2
fileName1 = "/Users/weiyang/Desktop/Test1.pdf"
fileName2 = "/Users/weiyang/Desktop/Test2.pdf"
newFileName = "/Users/weiyang/Desktop/NewTest.pdf"
file1 = open( fileName1, 'rb' )
file2 = open( fileName2, 'rb' )
reader1 = PyPDF2.PdfFileReader( file1 )
reader2 = PyPDF2.PdfFileReader( file2 )
writer = PyPDF2.PdfFileWriter()
for pageIndex in range( reader1.numPages ):
writer.addPage( reader1.getPage( pageIndex ) )
for pageIndex in range( reader2.numPages ):
writer.addPage( reader2.getPage( pageIndex ) )
newFile = open( newFileName, "wb" )
writer.write( newFile )
newFile.close()
file1.close()
file2.close()
当file.close之后,才能确保内容被写入磁盘哦。
给PDF加水印
我使用微软Office doc写了个艺术字,然后导出成一份PDF文件,把它作为水印文件 —— 机智如我,接着把它叠加到NewTest.pdf的每一页上。

叠加,并不像我们想象的那么复杂,PageObject::mergePage能帮助我们很容易做到这一点。参考下面的例子。
Code:
import PyPDF2
fileName = "/Users/weiyang/Desktop/NewTest.pdf"
fileName2 = "/Users/weiyang/Desktop/WaterMark.pdf"
fileName3 = "/Users/weiyang/Desktop/Result.pdf"
file = open( fileName, 'rb' )
reader = PyPDF2.PdfFileReader( file )
waterMarkReader = PyPDF2.PdfFileReader( open( fileName2, "rb" ) )
writer = PyPDF2.PdfFileWriter()
for pageIndex in range( reader.numPages ):
pageObj = reader.getPage( pageIndex )
pageObj.mergePage( waterMarkReader.getPage( 0 ) )
writer.addPage( pageObj )
resultFile = open( fileName3, "wb" )
writer.write( resultFile )
resultFile.close()
file.close()
Result:

网友评论