用于处理PDF的模块是PyPDF2(区分大小写),使用pip安装。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
c:\python\Scripts>pip3.6 install PyPDF2
Collecting PyPDF2 Downloading PyPDF2-1.26.0. tar .gz (77kB)
100% |████████████████████████████████| 81kB 69kB /s
Installing collected packages: PyPDF2 Running setup.py install for PyPDF2 ... done
Successfully installed PyPDF2-1.26.0 c:\python>python.exe Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v .1900 64 bit (AMD64)] on win32
Type "help" , "copyright" , "credits" or "license" for more information.
>>> import PyPDF2
>>> |
从PDF提取文本
PyPDF2没有办法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将文本返回为python字符串。
PyPDF2从PDF提取文本时可能会出错,甚至根本不能打开某些PDF。
1
2
3
4
5
6
7
8
9
10
|
>>> import PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' ) ##采用二进制模式打开
>>> pdfReader = PyPDF2.PdfFileReader(pdf1)
PdfReadWarning: Xref table not zero - indexed. ID numbers for objects will be corrected. [pdf.py: 1736 ]
>>> pdfReader.numPages ##文档总页数
20 >>> page1 = pdfReader.getPage( 0 ) ##首页下标为0
>>> page1.extractText() ##返回该页文本的字符串
' H3C S12500 QoS\n www.h3c.com.cn \n121NI H3C S12500 QoS \n2O......SP Strict Priority \n ToS Type of Service \n ' >>> |
解密PDF
某些PDF文档有加密功能,以防止别人阅读,只有在打开文档时提供口令才能阅读。
在文件用正确的口令解密之前,尝试调用函数来读取文件,将会导致错误。
decrypt()方法只解密了PdfFileReader对象,而不是实际的PDF文件。在程序中止后,硬盘上的文件仍然是加密的。程序下次运行时,仍然需要再次调用decrypt()。
1
2
3
4
5
6
7
|
>>> import PyPDF2
>>> pdfReader = PyPDF2.PdfFileReader( open ( '125003.pdf' , 'rb' ))
>>> pdfReader.isEncrypted ##判断是否加密
True >>> pdfReader.decrypt( 'password' ) ##使用口令解密,返回0表示失败
1 >>> |
创建PDF
PdfFileWriter可以创建一个新的PDF文件。
它的能力仅限于从其他PDF中拷贝页面、旋转页面、重叠页面和加密文件。
模块不允许直接编辑PDF。必须创建一个新的PDF,然后从已有的文档拷贝内容。
-
操作步骤:
1、打开一个或多个已有的PDF,得到PdfFileReader对象
2、创建一个新的PdfFileReader对象
3、将页面从PdfFileReader对象拷贝到PdfFileWriter对象中
4、最后,利用PdfFileWriter对象写入输出的PDF
创建一个PdfFileWriter对象,只是在Python中创建一个代表PDF文档的值,这并没有创建实际的PDF文件,要实际生成文件,必须调用PdfFileWriter对象的write()方法。
拷贝页面
PyPDF2不能在PdfFileWriter对象中间插入页面,addPage()方法只能够在末尾添加页面。
传递给PyPDF2.PdfFileReader()的File对象,需要以读二进制的方式打开。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
>>> import PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf2 = open ( '125002.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdf2Reader = PyPDF2.PdfFileReader(pdf2)
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> for page in range (pdf1Reader.numPages):
... pageObj = pdf1Reader.getPage(page)
... pdfWriter.addPage(pageObj) ... >>> for page in range (pdf2Reader.numPages):
... pageObj = pdf2Reader.getPage(page)
... pdfWriter.addPage(pageObj) ... >>> pdfFile = open ( 'new.pdf' , 'wb' ) ##生成新PDF文件,包含前面几个文档的内容
>>> pdfWriter.write(pdfFile) >>> pdfFile.close() >>> pdf1.close() >>> pdf2.close() |
效果:
旋转页面
利用rotateClockwise()和rotateCounterClockwise()方法,PDF文档的页面也可以旋转90度的整数倍。
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> import PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> page = pdf1Reader.getPage( 0 )
>>> page.rotateClockwise( 90 )
{ '/CropBox' : [ 0 , 0 , 595.22 , 842 ], '/Parent' : IndirectObject( 476 , 0 ), '/Conten......0' : IndirectObject( 491 , 0 )}}, '/Type' : '/Page' }
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> pdfWriter.addPage(page) >>> newFile = open ( 'newfile.pdf' , 'wb' )
>>> pdfWriter.write(newFile) >>> newFile.close() >>> pdf1.close() |
效果:
叠加页面
通过叠加页面的方式,很容易为多个文件添加水印,并且只针对程序指定的页面添加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
>>> import PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdf1Page1 = pdf1Reader.getPage( 0 )
>>> pdfMarkReader = PyPDF2.PdfFileReader( open ( '125002.pdf' , 'rb' ))
>>> pdf1Page1.mergePage(pdfMarkReader.getPage( 0 ))
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> pdfWriter.addPage(pdf1Page1) >>> for page in range ( 1 ,pdf1Reader.numPages):
... pageObj = pdf1Reader.getPage(page)
... pdfWriter.addPage(pageObj) ... >>> resultFile = open ( 'result.pdf' , 'wb' )
>>> pdfWriter.write(resultFile) >>> pdf1.close() >>> resultFile.close() |
效果:
加密PDF
PdfFileWriter对象也可以为PDF文档进行加密。
PDF可以有一个用户口令(允许查看这个PDF)和一个拥有者口令(允许设置打印、注释、提取文本和其他功能的许可)。
用户口令和拥有者口令分别是encrypt()的第一个和第二个参数。
如果只传入一个字符串给encrypt(),它将作为两个口令。
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> import PyPDF2
>>> pdf1 = open ( '125001.pdf' , 'rb' )
>>> pdf1Reader = PyPDF2.PdfFileReader(pdf1)
>>> pdfWriter = PyPDF2.PdfFileWriter()
>>> for page in range (pdf1Reader.numPages):
... pdfWriter.addPage(pdf1Reader.getPage(page)) ... >>> pdfWriter.encrypt( '123456' )
>>> encryptFile = open ( 'encrypt.pdf' , 'wb' )
>>> pdfWriter.write(encryptFile) >>> encryptFile.close() >>> pdf1.close() |
效果: