侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   743

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

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

PyPDF2 安装

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

这里写图片描述

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))) #

输出结果:

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 =

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使用 request 发送表单数据操作示例
    下一条:
    python mqtt 客户端的实现代码实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客