Python实现PyPDF2处理PDF文件的方法示例


Posted in Python onSeptember 25, 2019

实际应用中,可能会涉及处理 pdf 文件,PyPDF2 就是这样一个库,使用它可以轻松的处理 pdf 文件,它提供了读,割,合并,文件转换等多种操作。

文档地址:http://pythonhosted.org/PyPDF2/

PyPDF2 安装

PyCharm 安装:File -> Default Settings -> Project Interpreter

Python实现PyPDF2处理PDF文件的方法示例

PdfFileReader

构造方法:

PyPDF2.PdfFileReader(stream,strict = True,warndest = None,overwriteWarnings = True)

初始化一个 PdfFileReader 对象,此操作可能需要一些时间,因为 PDF 流的交叉引用表被读入内存。

参数:

  • stream:*File 对象或支持与 File 对象类似的标准读取和查找方法的对象,也可以是表示 PDF 文件路径的字符串。
  • *strict(bool): 确定是否应该警告用户所用的问题,也导致一些可纠正的问题是致命的,默认是 True
  • warndest : 记录警告的目标(默认是 sys.stderr)
  • overwriteWarnings(bool):确定是否 warnings.py 用自定义实现覆盖 Python 模块(默认为 True)

PdfFileReader 对象的属性和方法

属性和方法 描述
getDestinationPageNumber(destination) 检索给定目标对象的页码
getDocumentInfo() 检索 PDF 文件的文档信息字典
getFields(tree = None,retval = None,fileObj= None) 如果此 PDF 包含交互式表单字段,则提取字段数据,
getFormTextFields() 从文档中检索带有文本数据(输入,下拉列表)的表单域
getNameDestinations(tree = None,retval= None) 检索文档中的指定目标
getNumPages() 计算此 PDF 文件中的页数
getOutlines(node = None,outline = None,) 检索文档中出现的文档大纲
getPage(pageNumber) 从这个 PDF 文件中检索指定编号的页面
getPageLayout() 获取页面布局
getPageMode() 获取页面模式
getPageNumber(pageObject) 检索给定 pageObject 处于的页码
getXmpMetadata() 从 PDF 文档根目录中检索 XMP 数据
isEncrypted 显示 PDF 文件是否加密的只读布尔属性
namedDestinations 访问该getNamedDestinations()函数的只读属性

PDF 读取操作:

# encoding:utf-8
from PyPDF2 import PdfFileReader, PdfFileWriter

readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf'
# 获取 PdfFileReader 对象
pdfFileReader = PdfFileReader(readFile) # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
# 获取 PDF 文件的文档信息
documentInfo = pdfFileReader.getDocumentInfo()
print('documentInfo = %s' % documentInfo)
# 获取页面布局
pageLayout = pdfFileReader.getPageLayout()
print('pageLayout = %s ' % pageLayout)

# 获取页模式
pageMode = pdfFileReader.getPageMode()
print('pageMode = %s' % pageMode)

xmpMetadata = pdfFileReader.getXmpMetadata()
print('xmpMetadata = %s ' % xmpMetadata)

# 获取 pdf 文件页数
pageCount = pdfFileReader.getNumPages()

print('pageCount = %s' % pageCount)
for index in range(0, pageCount):
  # 返回指定页编号的 pageObject
  pageObj = pdfFileReader.getPage(index)
  print('index = %d , pageObj = %s' % (index, type(pageObj))) # <class 'PyPDF2.pdf.PageObject'>
  # 获取 pageObject 在 PDF 文档中处于的页码
  pageNumber = pdfFileReader.getPageNumber(pageObj)
  print('pageNumber = %s ' % pageNumber)

输出结果:

documentInfo = {'/Title': IndirectObject(157, 0), '/Producer': IndirectObject(158, 0), '/Creator': IndirectObject(159, 0), '/CreationDate': IndirectObject(160, 0), '/ModDate': IndirectObject(160, 0), '/Keywords': IndirectObject(161, 0), '/AAPL:Keywords': IndirectObject(162, 0)}
pageLayout = None
pageMode = None
xmpMetadata = None
pageCount = 3
index = 0 , pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 0
index = 1 , pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 1
index = 2 , pageObj = <class 'PyPDF2.pdf.PageObject'>
pageNumber = 2

PdfFileWriter

这个类支持 PDF 文件,给出其他类生成的页面。

属性和方法 描述
addAttachment(fname,fdata) 在 PDF 中嵌入文件
addBlankPage(width= None,height=None) 追加一个空白页面到这个 PDF 文件并返回它
addBookmark(title,pagenum,parent=None, color=None,bold=False,italic=False,fit='/fit,*args')
addJS(javascript) 添加将在打开此 PDF 是启动的 javascript
addLink(pagenum,pagedest,rect,border=None,fit='/fit',*args) 从一个矩形区域添加一个内部链接到指定的页面
addPage(page) 添加一个页面到这个PDF 文件,该页面通常从 PdfFileReader 实例获取
getNumpages() 页数
getPage(pageNumber) 从这个 PDF 文件中检索一个编号的页面
insertBlankPage(width=None,height=None,index=0) 插入一个空白页面到这个 PDF 文件并返回它,如果没有指定页面大小,就使用最后一页的大小
insertPage(page,index=0) 在这个 PDF 文件中插入一个页面,该页面通常从 PdfFileReader 实例获取
removeLinks() 从次数出中删除连接盒注释
removeText(ignoreByteStringObject = False) 从这个输出中删除图像
write(stream) 将添加到此对象的页面集合写入 PDF 文件

PDF 写入操作:

def addBlankpage():
  readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf'
  outFile = 'C:/Users/Administrator/Desktop/copy.pdf'
  pdfFileWriter = PdfFileWriter()

  # 获取 PdfFileReader 对象
  pdfFileReader = PdfFileReader(readFile) # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
  numPages = pdfFileReader.getNumPages()

  for index in range(0, numPages):
    pageObj = pdfFileReader.getPage(index)
    pdfFileWriter.addPage(pageObj) # 根据每页返回的 PageObject,写入到文件
    pdfFileWriter.write(open(outFile, 'wb'))

  pdfFileWriter.addBlankPage()  # 在文件的最后一页写入一个空白页,保存至文件中
  pdfFileWriter.write(open(outFile,'wb'))

结果是:在写入的 copy.pdf 文档的最后最后一页写入了一个空白页。

分割文档(取第五页之后的页面)

def splitPdf():
  readFile = 'C:/Users/Administrator/Desktop/RxJava 完全解析.pdf'
  outFile = 'C:/Users/Administrator/Desktop/copy.pdf'
  pdfFileWriter = PdfFileWriter()

  # 获取 PdfFileReader 对象
  pdfFileReader = PdfFileReader(readFile) # 或者这个方式:pdfFileReader = PdfFileReader(open(readFile, 'rb'))
  # 文档总页数
  numPages = pdfFileReader.getNumPages()

  if numPages > 5:
    # 从第五页之后的页面,输出到一个新的文件中,即分割文档
    for index in range(5, numPages):
      pageObj = pdfFileReader.getPage(index)
      pdfFileWriter.addPage(pageObj)
    # 添加完每页,再一起保存至文件中
    pdfFileWriter.write(open(outFile, 'wb'))

合并文档

def mergePdf(inFileList, outFile):
  '''
  合并文档
  :param inFileList: 要合并的文档的 list
  :param outFile:  合并后的输出文件
  :return:
  '''
  pdfFileWriter = PdfFileWriter()
  for inFile in inFileList:
    # 依次循环打开要合并文件
    pdfReader = PdfFileReader(open(inFile, 'rb'))
    numPages = pdfReader.getNumPages()
    for index in range(0, numPages):
      pageObj = pdfReader.getPage(index)
      pdfFileWriter.addPage(pageObj)

    # 最后,统一写入到输出文件中
    pdfFileWriter.write(open(outFile, 'wb'))

PageObject

PageObject(pdf=None,indirectRef=None)

此类表示 PDF 文件中的单个页面,通常这个对象是通过访问 PdfFileReader 对象的 getPage() 方法来得到的,也可以使用 createBlankPage() 静态方法创建一个空的页面。

参数:

  • pdf : 页面所属的 PDF 文件。
  • indirectRef:将源对象的原始间接引用存储在其源 PDF 中。

PageObject 对象的属性和方法

属性或方法 描述
static createBlankPage(pdf=None,width=None,height=None) 返回一个新的空白页面
extractText() 找到所有文本绘图命令,按照他们在内容流中提供的顺序,并提取文本
getContents() 访问页面内容,返回 Contents 对象或 None
rotateClockwise(angle) 顺时针旋转 90 度
scale(sx,sy) 通过向其内容应用转换矩阵并更新页面大小

粗略读取 PDF 文本内容

def getPdfContent(filename):
  pdf = PdfFileReader(open(filename, "rb"))
  content = ""
  for i in range(0, pdf.getNumPages()):
    pageObj = pdf.getPage(i)

    extractedText = pageObj.extractText()
    content += extractedText + "\n"
    # return content.encode("ascii", "ignore")
  return content

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用matplotlib绘制折线图教程
Feb 08 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
python合并同类型excel表格的方法
Apr 01 Python
python读取视频流提取视频帧的两种方法
Oct 22 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
启动Atom并运行python文件的步骤
Nov 09 Python
python中嵌套函数的实操步骤
Feb 27 Python
python 实现两个线程交替执行
May 02 Python
python如何停止递归
Sep 09 Python
5款实用的python 工具推荐
Oct 13 Python
pandas处理csv文件的方法步骤
Oct 16 Python
python mqtt 客户端的实现代码实例
Sep 25 #Python
python实现的登录与提交表单数据功能示例
Sep 25 #Python
python 利用pyttsx3文字转语音过程详解
Sep 25 #Python
python retrying模块的使用方法详解
Sep 25 #Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 #Python
python 魔法函数实例及解析
Sep 25 #Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 #Python
You might like
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
jQuery中data()方法用法实例
2014/12/27 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
vue小图标favicon不显示的解决方案
2017/09/19 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
JavaScript设计模式之观察者模式与发布订阅模式详解
2020/05/07 Javascript
[48:48]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Dream TIME
2014/05/21 DOTA
python使用7z解压apk包的方法
2015/04/18 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Python使用paramiko操作linux的方法讲解
2019/02/25 Python
python 三元运算符使用解析
2019/09/16 Python
python序列化与数据持久化实例详解
2019/12/20 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
在校生党员自我评价
2013/09/25 职场文书
应届大学生自荐信
2013/12/05 职场文书
2015年重阳节主持词
2015/07/04 职场文书
springcloud整合seata
2022/05/20 Java/Android