您的位置:首页 > 编程语言 > Python开发

《Python 编程快速上手 — 让繁琐工作自动化》读书笔记之【第13章 处理PDF和Word文档(1)】

2018-03-13 22:52 1271 查看
PDF 和 Word 文档是二进制文件。

1.  PDF 文档

PDF表示Portable Document Format(可移植文档格式),使用.pdf文件扩展名。用于处理PDF的模块是PyPDF2,这个模块是区分大小写的。

1)  从 PDF 提取文本

PyPDF2无法从PDF文档中提取图像,表格或其他媒体,但是可以提取文本。提取过程如下:
a)     以“rb”模式打开PDF文件。
b)     创建PdfFileReader对象。
c)     获取Paged对象。
d)     使用extractText()返回文本的字符串。
示例:>>> import PyPDF2

>>> pdfFileObj =open('meetingminutes.pdf','rb')

>>> pdfReader =PyPDF2.PdfFileReader(pdfFileObj)

>>> pdfReader.numPages

19

>>> pageObj = pdfReader.getPage(0)

>>> pageObj.extractText()

'OOFFFFIICCIIAALL BBOOAARRDD MMIINNUUTTEESS Meeting of\nMarch 7\n, 2014\n \n The Board of Elementary and SecondaryEducation shall provide leadership and \ncreate policies for education thatexpand opportunities for children, empower \nfamilies and communities, andadvance Louisiana in an increasingly \ncompetitive glob\nal market.\n BOARD \nof ELEMENTARY\n and \n SECONDARY\n EDUCATION\n

2)  解密 PDF

某些 PDF文档有加密功能,以防止别人阅读,只有在打开文档时提供密码才能阅读。假设我们打开的PDF文件加密密码为:rosebud。
a)     使用PdfFileReader对象的isEncrypted属性判断是否加密。已经加密返回True,没有加密返回False。
b)     向decrypt(‘pwd’)方法传入一个密码进行解密。密码正确返回1,密码错误返回0。
示例:>>> import PyPDF2

>>> pdfReader =PyPDF2.PdfFileReader(open('encrypted.pdf', 'rb'))

>>> pdfReader.isEncrypted

True

>>> pdfReader.getPage(0)

Traceback (most recent call last):

File "<pyshell#173>", line1, in <module>

pdfReader.getPage()

--snip--

File"C:\Python34\lib\site-packages\PyPDF2\pdf.py", line 1173, ingetObject

raise utils.PdfReadError("file has notbeen decrypted")

PyPDF2.utils.PdfReadError: file has notbeen decrypted

>>> pdfReader.decrypt('rosebud')

1

>>> pageObj = pdfReader.getPage(0)

3)  创建PDF

PyPDF2 写入 PDF 的能力,仅限于从其他 PDF 中拷贝页面、旋转页面、重叠页面和加密文件。同时,不能直接编辑PDF,必须创建一个新的PDF。流程如下:
a)     打开一个或多个已有的 PDF(源 PDF),得到 PdfFileReader 对象。
b)     2.创建一个新的 PdfFileWriter 对象。
c)     3.将页面从PdfFileReader 对象拷贝到 PdfFileWriter 对象中。
d)     4.最后,利用PdfFileWriter 对象写入输出的 PDF。

4)  拷贝页面

PyPDF2 不能在PdfFileWriter 对象中间插入页面,addPage()方法只能够在末尾添加页面。>>>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 inrange(pdf1Reader.numPages):

 pageObj = pdf1Reader.getPage(pageNum)

pdfWriter.addPage(pageObj)

>>>for pageNum inrange(pdf2Reader.numPages):

pageObj = pdf2Reader.getPage(pageNum)

pdfWriter.addPage(pageObj)

>>> pdfOutputFile =open('combinedminutes.pdf', 'wb')

>>> pdfWriter.write(pdfOutputFile)

>>> pdfOutputFile.close()

>>> pdf1File.close()

>>> pdf2File.close()

5)  旋转页面

利用rotateClockwise()和 rotateCounterClockwise()方法,PDF文档可以顺时针旋转 90 度的整数倍。示例:>>>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),

--snip--

}

>>>pdfWriter = PyPDF2.PdfFileWriter()

>>>pdfWriter.addPage(page)

>>>resultPdfFile = open('rotatedPage.pdf', 'wb')

>>>pdfWriter.write(resultPdfFile)

>>>resultPdfFile.close()

>>>minutesFile.close()

6)  叠加页面

通过调用Page对象的mergePage()方法,PyPDF2 也可以将一页的内容叠加到另一页上,这可以用来在页面上添加公司标志、时间戳或水印。示例:>>>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)

>>> forpageNum in range(1, pdfReader.numPages):

pageObj = pdfReader.getPage(pageNum)

pdfWriter.addPage(pageObj)

>>>resultPdfFile = open('watermarkedCover.pdf', 'wb')

>>>pdfWriter.write(resultPdfFile)

>>>minutesFile.close()

>>>resultPdfFile.close()

7)  加密 PDF

>>> import PyPDF2

>>> pdfFile =open('meetingminutes.pdf', 'rb')

>>> pdfReader =PyPDF2.PdfFileReader(pdfFile)

>>> pdfWriter =PyPDF2.PdfFileWriter()

>>> for pageNum inrange(pdfReader.numPages):

pdfWriter.addPage(pdfReader.getPage(pageNum))

>>> pdfWriter.encrypt('swordfish')

>>> resultPdf =open('encryptedminutes.pdf', 'wb')

>>> pdfWriter.write(resultPdf)

>>> resultPdf.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python PDF
相关文章推荐