我真的很佩服可移植文档格式(PDF)文件。 我记得有一天,由于Word版本中的某些差异或其他原因,此类文件解决了交换文件时的任何格式问题。
我们主要在这里谈论Python,不是吗? 而且,我们有兴趣将其与PDF文档配合使用。 好吧,您可能会说这很简单,尤其是如果您以前将Python与文本文件 (txt)一起使用过。 但是,这里有点不同。 PDF文档是二进制文件 ,比纯文本文件更复杂,尤其是因为它们包含不同的字体类型,颜色等。
这并不意味着很难使用Python处理PDF文档,而是相当简单,并且使用外部模块即可解决该问题。
PyPDF2
如上所述,使用外部模块将是关键。 我们将在本教程中使用的模块是PyPDF2
。 由于它是一个外部模块,因此我们必须要做的第一步是安装该模块。 为此,我们将使用pip ,它(基于维基百科):
软件包管理系统,用于安装和管理以Python编写的软件包。 在Python软件包索引(PyPI)中可以找到许多软件包。
您可以按照《 Python打包用户指南》中提到的步骤安装pip
,但是如果您具有Python 2.7.9
和更高版本,或者Python 3.4
和更高版本,则已经具有pip
!
现在可以通过键入以下命令(在Mac OS X的Terminal中)简单地安装PyPDF2
:
pip install pypdf2
大! 现在,您已经安装了PyPDF2
,并且可以开始播放PDF文档了。
阅读PDF文件
我们将在本教程中使用的示例文件是sample.pdf 。 继续下载该文件以遵循本教程,或者您可以简单地使用任何您喜欢的PDF文件。
现在,让我们继续阅读PDF文档。 由于我们将使用PyPDF2
,因此需要导入模块,如下所示:
import pypdf2
导入模块后,我们将使用PdfFileReader类。 因此,用于阅读PDF文档的脚本如下所示:
import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
PDF文档的更多操作
阅读PDF文档后,我们现在可以对该文档执行不同的操作,如本节所述。
页数
让我们检查sample.pdf中的页数。 为此,我们可以使用getNumPages()方法:
number_of_pages = read_pdf.getNumPages()
print number_of_pages
在这种情况下,返回值将为1
。
页码
现在让我们检查PDF文档中某些页面的数量。 我们可以使用getPageNumber(page)
方法,请注意,我们必须将类型为page
的对象传递给该方法。 要检索page
,我们将使用getPage(number)
方法,其中number
表示PDF文档中的页码。 参数number
以值0
开头。
好吧,我知道当您使用getPage(number)
您已经知道页码,但这只是为了说明如何一起使用这些方法。 可以在以下脚本中证明这一点:
page = read_pdf.getPage(0)
page_number = read_pdf.getPageNumber(page)
print page_number
继续,尝试脚本。 您得到了什么输出?
我们知道在sample.pdf
(我们正在试验的文件)中,我们只有一页(数字0
)。 如果我们将数字1
作为页码传递给getPage(number)
怎么办? 在这种情况下,您将收到以下错误:
Traceback (most recent call last):
File "test.py", line 6, in <module>
page = read_pdf.getPage(1)
File "/usr/local/lib/python2.7/site-packages/PyPDF2/pdf.py", line 1158, in getPage
return self.flattenedPages[pageNumber]
IndexError: list index out of range
这是因为该页面不可用,并且我们使用的页面号超出范围(不存在)。
页面模式
PDF页面具有以下不同的模式:
/使用无 | 不显示轮廓或缩略图面板 |
/ UseOutlines | 显示轮廓(又称书签)面板 |
/ UseThumbs | 显示页面缩略图面板 |
/全屏 | 全萤幕检视 |
/使用OC | 显示可选内容组(OCG)面板 |
/使用附件 | 显示附件面板 |
为了检查我们的页面模式,我们可以使用以下脚本:
page = read_pdf.getPage(0)
page_mode = read_pdf.getPageMode()
print page_mode
对于我们的PDF文档( sample.pdf
),返回值为none
,这意味着未指定页面模式。 如果要指定页面模式,可以使用setPageMode(mode)
方法,其中mode
是上表中列出的模式之一。
提取文字
到目前为止,我们一直在文件中徘徊,让我们看看其中的内容。 方法extractText()
将成为我们在此任务中的朋友。
让我向您展示执行此操作的完整脚本,而不是上面我仅向您显示执行操作所需的脚本。 从PDF文档中提取文本的脚本如下:
import PyPDF2
pdf_file = open('sample.pdf')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(0)
page_content = page.extractText()
print page_content
当我得到以下输出而不是sample.pdf
时,我感到很惊讶:
!"#$%#$%&%$&'()*%+,-%./01'*23%4
5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&)
%
这很可能是由于字体问题引起的,因此字符代码映射到其他值。 因此,PDF文档本身有时会出现问题,因为PDF文档可能不包含还原内容所需的数据。
因此,我尝试了另一个文件,即我的文件: paper.pdf
。 继续,将代码中的sample.pdf
替换为paper.pdf
。 在这种情况下,输出为:
Medical Imaging 2012: Image Perception, Observer Performance, and Technology Assessment, edited by Craig K. Abbey, Claudia R. Mello-Thoms, Proc. of SPIE Vol. 8318, 83181I © 2012 SPIE · CCC code: 1605-7422/12/$18 · doi: 10.1117/12.912389Proc. of SPIE Vol. 8318 83181I-1Downloaded from SPIE Digital Library on 13 Aug 2012 to 134.130.12.208. Terms of Use: http://spiedl.org/terms
但是,页面中其余文本在哪里? 好吧,实际上extractText()
方法似乎并不完美,需要进行一些改进。 但是,这里的目标是向您展示如何使用Python处理PDF文件,并且似乎需要对该领域进行一些改进。
结论
如我们所见,Python使处理PDF文档变得简单。 本教程只是介绍该主题的内容,您可以在PyPDF2文档页面上找到有关可以对PDF文档执行的不同操作的更多详细信息。
翻译自: https://code.tutsplus.com/tutorials/how-to-work-with-pdf-documents-using-python--cms-25726