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 list转dict示例分享
Jan 28 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
一看就懂得Python的math模块
Oct 21 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
Python面向对象程序设计示例小结
Jan 30 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
May 15 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
python能做哪方面的工作
Jun 15 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
利用python爬取有道词典的方法
Dec 08 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
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
AngularJs表单验证实例代码解析
2016/11/29 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
使用Vue.observable()进行状态管理的实例代码详解
2019/05/26 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python中执行shell命令的几个方法小结
2014/09/18 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python代码实现KNN算法
2017/12/20 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
给民警的表扬信
2014/01/08 职场文书
结婚老公保证书
2015/02/26 职场文书
终止劳动合同通知书
2015/04/16 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python