@zhangyu756897669
2017-09-27T15:32:32.000000Z
字数 2451
阅读 674
python官方文档
PDF和Word文档是二进制文件,这使得它们比纯文本文件复杂得多。除了文本,它们还存储了大量的字体,颜色和布局信息。如果您希望程序读取或写入PDF或Word文档,则需要做的不仅仅是将其文件名传递给open()。
幸运的是,有一些Python模块可以让您轻松与PDF和Word文档进行交互。本章将介绍两个这样的模块:PyPDF2和Python-Docx。
PDF代表便携式文件格式,并使用.pdf文件扩展名。虽然PDF支持许多功能,本章将重点介绍两种您最常使用的功能:从PDF中读取文本内容,并从现有文档制作新的PDF。
您将用于处理PDF的模块是PyPDF2。要安装它,请从命令行运行pip安装PyPDF2。此模块名称区分大小写,因此请确保y为小写,其他所有内容为大写。 如果模块安装正确,则在交互式shell中运行导入PyPDF2不应显示任何错误。
有问题的PDF格式
虽然PDF文件非常适合用户轻松打印和阅读的方式布局文本,但软件解析为明文并不简单。因此,从PDF中提取文本时,PyPDF2可能会出错,甚至可能无法打开一些PDF。不幸的是,你可以做的不多, PyPDF2可能无法使用某些特定的PDF文件。但我还没有发现任何PDF文件到目前为止,无法用PyPDF2打开。
PyPDF2没有办法从PDF文档中提取图像,图表或其他媒体,但它可以提取文本并将其作为Python字符串返回。要开始学习PyPDF2的工作原理,我们将在图13-1所示的示例PDF中使用它。
从http://nostarch.com/automatestuff/下载此PDF
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 Secondary Education shall provide leadership and \ncreate policies for education that expand opportunities for children, empower \nfamilies and communities, and advance Louisiana in an increasingly \ncompetitive glob\nal market.\n BOARD \n of ELEMENTARY\n and \n SECONDARY\n EDUCATION\n '
首先,导入PyPDF2模块。然后以阅读二进制模式打开meetingminutes.pdf并将其存储在pdfFileObj中。要获取代表此PDF的PdfFileReader对象,请调用PyPDF2.PdfFileReader()并将其传递给pdfFileObj。将此PdfFileReader对象存储在pdfReader中。
文档中的总页数存储在PdfFileReader对象的numPages属性❶中。示例PDF有19页,但是只从第一页提取文本。
要从页面提取文本,您需要从PdfFileReader对象获取一个Page对象,该对象表示PDF的单个页面。您可以通过在PdfFileReader对象上调用getPage()方法❷来传递Page对象,并将其感兴趣的页面的页码传递给我们(在我们的例子中为0)。
PyPDF2使用基于零的索引来获取页面:第一页是第0页,第二页是简介,等等。总是这样,即使在文档中页面的编号不同。例如,说您的PDF是从较长的报告中的三页摘录,其页面编号为42,43和44.要获取本文档的第一页,您可以调用pdfReader.getPage(0)不是getPage(42)或getPage(1)。
一旦你有了你的Page对象,调用它的extractText()方法来返回一个页面文本的字符串❸。文本提取不完美:文本Charles E.“Chas”Roemer,PDF中的有些文字不在extractText()返回的字符串中,并且间距有时是不对称的。不过,PDF文本内容的近似值可能对您的程序来说已经足够好。
某些PDF文档具有加密功能,可以使其不被读取,直到打开文档的任何人提供密码。在您下载的PDF中输入以下内容,该密码已使用密码rosebud进行加密:
import PyPDF2
pdfReader = PyPDF2.PdfFileReader(open('encrypted.pdf', 'rb'))
pdfReader.isEncrypted #❶
True
pdfReader.getPage(0) #❷
PdfReadError .....
pdfReader.decrypt('rosebud') #❸
1
所有PdfFileReader对象都具有isEncrypted属性,如果PDF被加密则为True,如果不是❶,则为False。在使用正确的密码解密之前,调用读取文件的功能的任何尝试将导致错误❷。
要读取加密的PDF,请调用decrypt()函数,并将密码作为字符串❸传递。在使用正确的密码调用decrypt()后,您会看到调用getPage()不再导致错误。如果给出错误的密码,decrypt()函数将返回0,并且getPage()将继续失败。请注意,decrypt()方法仅解密PdfFileReader对象,而不是实际的PDF文件。程序终止后,硬盘上的文件将保持加密状态。您的程序将在下次运行时重新调用decrypt()。