如何使用Python处理PDF文档

我真的很佩服可移植文档格式(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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值