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

01

需求描述

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

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

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

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

02

前置知识和逻辑梳理

2.1 PyPDF2 模块实现合并

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

from PyPDF2 import PdfFileReader, PdfFileWriter

这里导入了两个方法:

  1. PdfFileReader 可以理解为读取器

  2. PdfFileWriter 可以理解为写入器

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

  1. 读取器将所有pdf读取一遍

  2. 读取器将读取的内容交给写入器

  3. 写入器统一输出到一个新pdf

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

2.2 获取与添加页面

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

  1. .getPage 获取特定页

  2. .addPage 添加特定页

2.3 图片和文字的处理

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

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

  1. 利用 pdfplumber 打开PDF 文件

  2. 获取指定的页,或者遍历每一页

  3. 利用 .extract_text() 方法提取当前页的文字

  4. 判断 “战略” 是否在提取的文字中

判断是否包含图片,思路和上面是类似的,但方法不同。图片考虑用正则的方法识别,用 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。所有的页面均包含“战略”二字:

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

from PyPDF2 import PdfFileReader, PdfFileWriter
import pdfplumberpath = 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 ospath = 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等模块实现批量操作,解放双手。

END

推荐阅读牛逼!Python常用数据类型的基本操作(长文系列第①篇)
牛逼!Python的判断、循环和各种表达式(长文系列第②篇)牛逼!Python函数和文件操作(长文系列第③篇)牛逼!Python错误、异常和模块(长文系列第④篇)

实用脚本!Python 提取 PDF 指定内容生成新文件!相关推荐

  1. 超级实用案例,Python 提取 PDF 指定内容生成新PDF

    很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新PDF,本文就以两个真实需求为例进行讲解. [注]资料.代码.技术交流,文末获取 01 需求描述 数据是一份有286页的 ...

  2. 用python提取PDF表格内容保存到excel

    一 提取pdf方法介绍 任务是用python提取PDF里的表格文件到excel里面去.做为一个 学了一个周python的人来说当然像尝试一下看能不能做到,事实证明是可以的只是可能代码有点烂...... ...

  3. python提取网页指定内容

    最近在参考w3school的文档学习python,就根据文档的请求模块进行扩展一下. 1.访问提供的网站,并提取script中的url地址. 这是w3school的请求模块案例:https://www ...

  4. python提取pdf文本内容多种方式

    安装 # pip install pdfminer pip install pdfminer3k pip install pdfminer.six 安装这个引入的内容不会报错 若安装不成功,可以试试下 ...

  5. python 原理 pdf_利用Python处理PDF——裁剪和生成新的PDF

    安装 在cmd中输入这一句: pip install -U pdfminer3k -i https://pypi.tuna.tsinghua.edu.cn/simple --user 注意:这里安装的 ...

  6. Python提取PDF发票信息保存Excel文件并制作EXE程序

    前言 通过本篇文章可学习pdf发票信息的提取,内容保存至Excel,了解命令图像工具Gooey,以及如何将python文件打包为exe程序 背景 现在电子发票越来越普遍,各公司开票形式已基本无纸化.目 ...

  7. Python提取word指定内容和图片,分类图片

    1.环境准备,python环境,安装python-docx依赖包 命令:pip install python-docx 其他镜像地址:https://mirrors.tuna.tsinghua.edu ...

  8. python删除txt指定内容_python删除文件中指定内容

    更多追问追答 追问 我按你的方法试了下,文件内容还在,没有删掉...... 追答 把你的 file.txt 贴出来,确保 20150723 在要删除行的最开始,前面不能有空格等其他任何字符. 另外, ...

  9. 如何用Python批量提取PDF文本内容?

    本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析. 问题 最近,读者们在后台的留言,愈发五花八门了. 写了几篇关于自然语言处理的文章 ...

最新文章

  1. JavaScript—— 前端编程语言
  2. 「情报局41」人工智能的下一个目标是什么?了解业务用例
  3. 模拟飞行 android,RFS模拟飞行pro安卓版
  4. Linux C 函数指针应用---回调函数
  5. 国际上首次报道的非人灵长类胰岛衰老的单细胞转录组图谱
  6. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings
  7. APACHE配置文件中文版 httpd.conf FOR Apache 2.2.4
  8. 【二 HTTP编程】2. HTTP路由
  9. java高级工程师个人简历模板
  10. ExpandableListView购物车
  11. 微信账号和语音文件的结构分析
  12. 59 SD配置-科目分配-分配科目代码
  13. 飞思卡尔Kinetis系列单片机被锁住后,怎么解锁
  14. 郑豪7.16黄金高位盘旋不破,留意跌势悄然来袭,黄金晚间走势操作建议
  15. java for coun,为什么程序中的一段for循环没有被执行
  16. 随机生成华人姓名的Java工具类:权重 + 随机
  17. 多线程下载图片并压缩
  18. 详解Arduino Uno开发板的引脚分配图及定义
  19. 基于智能优化算法PSO/GWO/AFO+柔性车间生产调度(Matlab代码实现)
  20. DIY智能插座(一) -- 硬件搭建

热门文章

  1. php计算属性集的闭包,关于swift:计算属性与带闭包的属性集之间的区别
  2. idea使用MybatisCodeHelperPro逆向生成
  3. yum安装出现No package vim available解决办法
  4. ELK学习2_用Kibana和logstash快速搭建实时日志查询、收集与分析系统
  5. python orm框架sqlalchemy_python orm 框架中sqlalchemy用法实例详解
  6. 与孩子一起学编程python_与的解释|与的意思|汉典“与”字的基本解释
  7. js压缩代码后怎么生成source map_??markdown生成导航? #x27;[toc]#x27;足矣
  8. python os 文件锁_python 中给文件加锁——fcntl模块
  9. httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析
  10. Springboot : RequestContextHolder