很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新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等模块实现批量操作,解放双手。

超级实用案例,Python 提取 PDF 指定内容生成新PDF相关推荐

  1. 实用脚本!Python 提取 PDF 指定内容生成新文件!

    很多时候,我们并不会预知希望提取的页号,而是希望将包含指定内容的页面提取合并为新PDF,本文就以两个真实需求为例进行讲解. 01 需求描述 数据是一份有286页的上市公司公开年报PDF,大致如下 现在 ...

  2. python提取网页指定内容

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

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

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

  4. python读取excel指定列-Python读取excel指定列生成指定sql脚本的方法

    需求 最近公司干活,收到一个需求,说是让手动将数据库查出来的信息复制粘贴到excel中,在用excel中写好的公式将指定的两列数据用update这样的语句替换掉. 例如: 有个A库,其中有两个A.01 ...

  5. python读取word指定内容_python解析html提取数据,并生成word文档实例解析

    简介 今天试着用ptyhon做了一个抓取网页内容,并生成word文档的功能,功能很简单,做一下记录以备以后用到. 生成word用到了第三方组件python-docx,所以先进行第三方组件的安装.由于w ...

  6. python创意实用案例-python实用案例

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! (python内部对异常已处理)1 class listiterator(obje ...

  7. python替换excel指定内容_Python脚本操作Excel实现批量替换功能

    大家好,给大家分享下如何使用Python脚本操作Excel实现批量替换. 使用的工具 Openpyxl,一个处理excel的python库,处理excel,其实针对的就是WorkBook,Sheet, ...

  8. python提取excel指定关键词的行数据

    系列文章目录 文章目录 系列文章目录 前言 一.需求描述 1.图片展示 2.提取方法 二.python提取第二版 1.图片展示 1.提取方法 总结 前言 一.需求描述 1.图片展示 从如图所示的数据中 ...

  9. 给知网没有书签的pdf文件添加书签(利用python解析txt文件内容并为pdf添加目录)

    今天利用tampermonkey的知网下载助手脚本下载pdf格式论文时,发现论文缺少书签,而脚本可以下载一个txt格式的书签(目录),因此打算利用python将txt格式的目录添加到pdf中. txt ...

最新文章

  1. Redis 读写分离技术架构解析
  2. R语言包_dplyr_1
  3. re模块与正则表达式
  4. jQueryMobile常用技巧
  5. SAP 电商云 Spartacus UI 的 style library 介绍
  6. C#中在主窗体中用ShowDialog方法显示子窗体的使用技巧
  7. 人本原理内涵_叶澜教育学原理课后答案资料配套题库考研真题精选课后习题章节题库...
  8. Android中service的生命周期
  9. 2022年上半年软件设计师上午真题及答案解析
  10. Invisible Backdoor Attack with Sample-Specific Triggers
  11. 新版标准日本语中级_第二十七课
  12. .netcore下使用Chloe.ORM框架
  13. 3月16日—3月20日四年级课程表
  14. 技校计算机可以学平面设计吗,上技校可以学平面设计吗 去技校学平面设计还是自己在家自学好 - 兔课网...
  15. 局域网内建立http server
  16. KBEngine warring项目源码阅读(二) 登录和baseapp的负载均衡
  17. c语言读取png文件大小,求助: C语言- 利用libpng读取png大小,并转换为jpg类型图片...
  18. 微信点餐系统—买家订单(二 Service层,重难点)
  19. OpenCV每日函数 Subdiv2D类平面细分
  20. 74LS160(两个)驱动数码管显示两位十进制数

热门文章

  1. HTML+CSS伸缩式导航栏
  2. 9个超好用的学习网站,都是充实课余知识的首选
  3. 我的心只悲伤七次-纪伯伦
  4. voipdiscount免费拨打全球电话(无需手机注册)
  5. 让老电脑焕发青春:Acer(宏碁)ASPIRE 4710G安装UbuntuKylin(优麒麟),使用Gparted调整分区大小
  6. 最美中国字|“粘”字书写技巧这样写,保证工整又好看!
  7. python第六周项目华容道_华容道游戏(中)
  8. 打峡谷之巅有眼缘 那不如我们自己写个猜数字 C语言
  9. [软件人生]关于个人所得税的讨论
  10. 音乐 美术 劳技 计算机教研组工作总结,劳技教研组工作总结