Python提取PDF指定内容并生成新文件


Posted in Python onJune 09, 2021

在之前的Python办公自动化案专题中,我们已经介绍了如何有选择的提取某些页面进行合并。

但是很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新PDF,本文就以两个真实需求为例进行讲解。

01需求描述

数据是一份有286页的上市公司公开年报PDF,大致如下

Python提取PDF指定内容并生成新文件

现在需要利用 Python 完成以下两个需求

需求一:提取所有包含 战略 二字的页面并合并新PDF

需求二:提取所有包含图片的页面,并分别保存为 PDF 文件

02前置知识和逻辑梳理

2.1 PyPDF2 模块实现合并

PyPDF2 导入模块的代码常常是:

from PyPDF2 import PdfFileReader, PdfFileWriter

这里导入了两个方法:

  • PdfFileReader 可以理解为读取器
  • PdfFileWriter 可以理解为写入器

利用 PyPDF2 实现合并运用的一下逻辑:

  • 读取器将所有pdf读取一遍
  • 读取器将读取的内容交给写入器
  • 写入器统一输出到一个新pdf

隐含知识点:读取器只能将读取的内容一页一页交给写入器

2.2 获取与添加页面

之前我们的推文中提到这两个代码,下面列出作为复习:

  • .getPage 获取特定页
  • .addPage 添加特定页

2.3 图片和文字的处理

要实现本文的需求还要做到很重要的一个判断:确定页面中有无包含的文字或图片

判断是否包含特定的文字比较简单,遍历每一页的时候都将包含的文本抽提出,做字符串层面的判断即可,代码思路:

  • 利用 pdfplumber 打开PDF 文件
  • 获取指定的页,或者遍历每一页
  • 利用 .extract_text() 方法提取当前页的文字
  • 判断 “战略” 是否在提取的文字中

判断是否包含图片,思路和上面是类似的,但方法不同。图片考虑用正则的方法识别,用 fitzre 配合,具体见下文代码

03代码实现

3.1 需求一的实现

首先来完成需求一的任务,导入需要用到的库:读取写入PDF文件的 PyPDF2 以及抽提文本的 pdfplumber

from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber

指定文件所在的路径,同时初始化写入器,将文件交给读取器:

path = r'C:\xxxxxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')

以上下文管理器形式通过 pdfplumber 打开文件,同时用 .getNumPages 获取读取器的最大页利于遍历每一页来抽提文字:

with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
    for i in range(pdf_reader.getNumPages()):
        page = pdf.pages[i]
        print(page.extract_text())

我们抽提文字的目的是用来判断,将符合要求的页码作为读取器 .getPage 的参数,最后用 .addPage 交给写入器:

with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
    for i in range(pdf_reader.getNumPages()):
        page = pdf.pages[i]
        print(page.extract_text())
        if '战略' in page.extract_text():
            pdf_writer.addPage(pdf_reader.getPage(i))
            print(i + 1, page.extract_text())

完成识别后让写入器输出为需要的文件名:

with open(path + r'\new_公司年报.pdf', 'wb') as out:
    pdf_writer.write(out)

至此,我们就完成了包含特定文字内容页面的提取,并整合成一个PDF。所有的页面均包含“战略”二字:

Python提取PDF指定内容并生成新文件

Python提取PDF指定内容并生成新文件

需求一完整代码如下,感兴趣的读者可以自行研究

from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumber
 
path = r'C:\xxx'
pdf_writer = PdfFileWriter()
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
 
with pdfplumber.open(path + r'\公司年报.PDF') as pdf:
    for i in range(pdf_reader.getNumPages()):
        page = pdf.pages[i]
        print(page.extract_text())
        if '战略' in page.extract_text():
            pdf_writer.addPage(pdf_reader.getPage(i))
            print(i + 1, page.extract_text())
 
with open(path + r'\new_公司年报1.pdf', 'wb') as out:
    pdf_writer.write(out)

3.2 需求二的实现

接下来完成需求二的任务。首先导入需要的库:

from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os

指定文件所在的路径:

path = r'C:\xxxxxx'

正则识别图片的部分不细讲,之前的推文已经介绍过,我们直接看代码:

page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\公司年报.PDF')
lenXREF = pdf._getXrefLength()
 
for i in range(lenXREF):
    text = pdf._getXrefString(i)
    isImage = re.search(checkImg, text)
    if isImage:
        page_lst.append(i)
 
print(page_lst)

获取到所有包含图片的页面后,再结合读取器和写入器的配合就能完成新 PDF 的产生。注意本需求是所有图片单独输出,因此获取到页面后交给写入器直接输出成文件:

pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
for page in page_lst:
    pdf_writer = PdfFileWriter()
    pdf_writer.addPage(pdf_reader.getPage(page))
    with open(path + r'\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
        pdf_writer.write(out)

至此也完成了第二个需求。需要说明的是目前没有非常完美提取PDF图片的方法,本案例介绍的方法识别图片也并不稳定。读者可以利用自己的数据多做尝试。完整代码如下:

from PyPDF2 import PdfFileReader, PdfFileWriter
import fitz
import re
import os
 
path = r'C:\xxx'
 
page_lst = []
checkImg = r"/Subtype(?= */Image)"
pdf = fitz.open(path + r'\公司年报.PDF')
lenXREF = pdf._getXrefLength()
for i in range(lenXREF):
    text = pdf._getXrefString(i)
    isImage = re.search(checkImg, text)
    if isImage:
        page_lst.append(i)
 
print(page_lst)
 
pdf_reader = PdfFileReader(path + r'\公司年报.PDF')
for page in page_lst:
    pdf_writer = PdfFileWriter()
    pdf_writer.addPage(pdf_reader.getPage(page))
    with open(path + r'\公司年报_{}.pdf'.format(page + 1), 'wb') as out:
        pdf_writer.write(out)

实现这两个单个需求后,就可以将相关代码封装并结合os等模块实现批量操作,解放双手。

到此这篇关于Python提取PDF指定内容并生成新文件的文章就介绍到这了,更多相关Python提取PDF指定内容内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python的struct模块中进行数据格式转换的方法
Jun 17 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
python print出共轭复数的方法详解
Jun 25 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
深入了解NumPy 高级索引
Jul 24 Python
如何基于Python实现word文档重新排版
Sep 29 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
python 实现学生信息管理系统的示例
Nov 28 Python
python3中celery异步框架简单使用+守护进程方式启动
Jan 20 Python
Python使用openpyxl批量处理数据
Jun 23 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 #Python
Python序列化与反序列化相关知识总结
Jun 08 #Python
浅谈怎么给Python添加类型标注
Python如何导出导入所有依赖包详解
Jun 08 #Python
OpenCV-Python实现油画效果的实例
OpenCV-Python实现图像平滑处理操作
OpenCV-Python模板匹配人眼的实例
You might like
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
javascript smipleChart 简单图标类
2011/01/12 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
高性能JavaScript循环语句和条件语句
2016/01/20 Javascript
jquery判断类型是不是number类型的实例代码
2016/10/07 Javascript
[01:20:47]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第一场 1月19日
2021/03/11 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python读取MRI并显示为灰度图像实例代码
2018/01/03 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
在Python中使用Neo4j的方法
2019/03/14 Python
用Cython加速Python到“起飞”(推荐)
2019/08/01 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
pycharm快捷键汇总
2020/02/14 Python
基于Python绘制个人足迹地图
2020/06/01 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
应届毕业生应聘自荐信
2013/12/07 职场文书
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
职称评定自我鉴定
2014/03/18 职场文书
企业授权委托书范本
2014/04/02 职场文书
在职员工证明书
2014/09/19 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
道士塔读书笔记
2015/06/30 职场文书
欠条范文
2015/07/03 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书