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模拟登录验证码(代码简单)
Feb 06 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
Python实现聊天机器人的示例代码
Jul 09 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 Python
win10环境下配置vscode python开发环境的教程详解
Oct 16 Python
mac使用python识别图形验证码功能
Jan 10 Python
python实现俄罗斯方块小游戏
Apr 24 Python
python 读取.nii格式图像实例
Jul 01 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
python 递归相关知识总结
Mar 03 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
PHP 手机归属地查询 api
2010/02/08 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
2014/07/28 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
Dom 是什么的详细说明
2010/10/25 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
提高NodeJS中SSL服务的性能
2014/07/15 NodeJs
JS逆序遍历实现代码
2014/12/02 Javascript
javascript修改图片src的方法
2015/01/27 Javascript
基于jquery实现鼠标左右拖动滑块滑动附源码下载
2015/12/23 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
jquery  实现轮播图详解及实例代码
2016/10/12 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
使用clipboard.js实现复制功能的示例代码
2017/10/16 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
python多线程方式执行多个bat代码
2016/06/07 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
2020/10/12 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
预备党员思想汇报范文
2013/12/29 职场文书
秋季运动会广播稿
2014/02/22 职场文书
销售团队口号大全
2014/06/06 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
工程合作意向书范本
2015/05/09 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书