python处理pdf文件_在Python中操作PDF文件

你们一定都熟悉PDF是什么。实际上,它们是最重要且使用最广泛的数字媒体之一。 PDF代表可移植文档格式。 它使用.pdf扩展名。 它用于可靠地显示和交换文档,而与软件,硬件或操作系统无关。

PDF由Adobe发明,现在是国际标准化组织(ISO)维护的开放标准。 PDF可以包含链接和按钮,表单字段,音频,视频和业务逻辑。

在本文中,我们将学习如何执行各种操作,例如:

从PDF提取文本

旋转PDF页面

分割PDF

使用简单的Python脚本!

安装

我们将使用第三方模块PyPDF2。

PyPDF2是一个构建为PDF工具包的python库。 它具有以下能力:

提取文档信息(标题,作者等)

逐页拆分文档

逐页合并文档

裁剪页面

将多个页面合并为一个页面

加密和解密PDF文件

以及更多!

要安装PyPDF2,请从命令行运行以下命令:

pip install PyPDF2

19121708305551.png

此模块名称区分大小写,因此请确保y为小写,其他所有内容均为大写。 本教程/文章中使用的所有代码和PDF文件都在这里。

1.从PDF文件中提取文本

# 导入所需的模块

import PyPDF2

# 创建一个pdf文件对象

pdfFileObj = open('linuxidc.pdf', 'rb')

# 创建一个PDF阅读器对象

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# 在pdf文件中打印页数

print(pdfReader.numPages)

# 创建页面对象

pageObj = pdfReader.getPage(0)

# 从页面提取文本

print(pageObj.extractText())

# 关闭pdf文件对象

pdfFileObj.close()

让我们尝试以块的形式理解上面的代码:

pdfFileObj = open('linuxidc.pdf', 'rb')

我们以二进制模式打开linuxidc.pdf。并将文件对象另存为pdfFileObj。

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

在这里,我们创建PyPDF2模块的PdfFileReader类的对象,并传递pdf文件对象并获得pdf阅读器对象。

print(pdfReader.numPages)

numPages属性提供pdf文件中的页数。例如,在我们的例子中,它是455(请参见输出的第一行)。

pageObj = pdfReader.getPage(0)

现在,我们创建一个PyPDF2模块的PageObject类的对象。 pdf阅读器对象具有getPage()函数,该函数将页码(起始索引为0)作为参数并返回该页对象。

print(pageObj.extractText())

Page object具有函数extractText(),用于从pdf页面中提取文本。

pdfFileObj.close()

最后,我们关闭pdf文件对象。

注意:虽然PDF文件非常适合以易于人们打印和阅读的方式来布置文本,但要用软件将其解析为纯文本并不是一件容易的事。因此,从PDF提取文本时,PyPDF2可能会出错,甚至根本无法打开某些PDF。不幸的是,您对此无能为力。 PyPDF2可能无法使用某些特定的PDF文件。

2、旋转PDF页面

# 导入所需的模块

import PyPDF2

def PDFrotate(origFileName, newFileName, rotation):

# 创建原始pdf的pdf文件对象

pdfFileObj = open(origFileName, 'rb')

# 创建一个pdf阅读器对象

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# 为新pdf创建pdf写入器对象

pdfWriter = PyPDF2.PdfFileWriter()

# 旋转每一页

for page in range(pdfReader.numPages):

# 创建旋转的页面对象

pageObj = pdfReader.getPage(page)

pageObj.rotateClockwise(rotation)

# 将旋转后的页对象添加到pdf写入器

pdfWriter.addPage(pageObj)

# 新的pdf文件对象

newFile = open(newFileName, 'wb')

# 将旋转的页面写入新文件

pdfWriter.write(newFile)

# 关闭原始的pdf文件对象

pdfFileObj.close()

# 关闭新的pdf文件对象

newFile.close()

def main():

# 原始pdf文件名

origFileName = 'linuxidc.pdf'

# 新的pdf文件名

newFileName = 'linuxidc.com.pdf'

#旋转角度

rotation = 270

#调用PDFrotate函数

PDFrotate(origFileName, newFileName, rotation)

if __name__ == "__main__":

# 调用main函数

main()

在这里,您可以看到旋转后的linuxidc.com.pdf第一页的样子(右图):

19121708276668.png

与上述代码有关的一些重要点:

对于旋转,我们首先创建原始pdf的pdf阅读器对象。

pdfWriter = PyPDF2.PdfFileWriter()

旋转的页面将被写入新的pdf。为了写入pdf,我们使用PyPDF2模块的PdfFileWriter类的对象。

for page in range(pdfReader.numPages):

pageObj = pdfReader.getPage(page)

pageObj.rotateClockwise(rotation)

pdfWriter.addPage(pageObj)

现在,我们迭代原始pdf的每一页。我们通过pdf阅读器类的getPage()方法获取页面对象。现在,我们通过页面对象类的rotationClockwise()方法旋转页面。然后,通过传递旋转的页面对象,使用pdf writer类的addPage()方法将页面添加到pdf writer对象。

newFile = open(newFileName, 'wb')

pdfWriter.write(newFile)

pdfFileObj.close()

newFile.close()

现在,我们必须将pdf页面写入新的pdf文件。首先,我们打开新文件对象,并使用pdf writer对象的write()方法向其中写入pdf页面。最后,我们关闭原始的pdf文件对象和新的文件对象。

3、分割PDF文件

# 导入所需的模块

import PyPDF2

def PDFsplit(pdf, splits):

# 创建输入pdf文件对象

pdfFileObj = open(pdf, 'rb')

# 创建pdf阅读器对象

pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

# 第一切片的起始索引

start = 0

# 最后一个切片的起始索引

end = splits[0]

for i in range(len(splits)+1):

# 为第(i + 1)个拆分创建pdf写入器对象

pdfWriter = PyPDF2.PdfFileWriter()

# 输出pdf文件名

outputpdf = pdf.split('.pdf')[0] + str(i) + '.pdf'

# 将页添加到pdf写入器对象

for page in range(start,end):

pdfWriter.addPage(pdfReader.getPage(page))

# 将分割的pdf页面写入pdf文件

with open(outputpdf, "wb") as f:

pdfWriter.write(f)

# 交换页面拆分开始位置以进行下一个拆分

start = end

try:

# 设置下一个拆分的拆分结束位置

end = splits[i+1]

except IndexError:

# 设置最后分割的分割结束位置

end = pdfReader.numPages

# 关闭输入的pdf文件对象

pdfFileObj.close()

def main():

# pdf文件分割

pdf = 'linuxidc.pdf'

# 分割页面位置

splits = [2,4]

# 调用PDFsplit函数拆分pdf

PDFsplit(pdf, splits)

if __name__ == "__main__":

# 调用main函数

main()

输出将是三个新的PDF文件,分别为拆分1(第0,1页),拆分2(第2,3页),拆分3(第4页末尾)。

上面的Python程序中没有使用新的函数或类。 使用简单的逻辑和迭代,我们根据传递的列表拆分创建了传递的pdf拆分。

logo.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值