办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)!

Posted Python 集中营

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)!相关的知识,希望对你有一定的参考价值。

发现网上有专门做文档格式转换的网站,不过是要充会员才可以。今天来做一篇PDF转换成Excel文档的代码实战,希望大佬喜欢,哈哈,话不多说,马上进入实战环节。

【阅读全文】

首先,我们一如既往的介绍一下需要用到的第三方库。

import pdfplumber  # 专门处理PDF文档格式的文件对象
import pandas as pd  # 数据处理库,常见的DtaFrame、Series数据对象处理

然后,再把相应的PDF数据提取出来并且保存在DataFrame数据对象中。

# 打开PDF文件、得到PDF数据文件对象
pdf_obj = pdfplumber.open(\'data.pdf\')

# 这里我们以获取第一页的PDF数据为例
page_1 = pdf_obj.pages[0]

# 从得到的第一页数据中提取表格数据
data_table = page_1.extract_table()

# 将提取到的数据表格转换为DataFrame数据对象
data_frame = pd.DataFrame(data_table)

# 打印查看DataFrame数据
print(data_frame)

得到DataFrame数据对象之后,需要进行数据处理的话可以参考前面的文章DataFrame数据处理相关的知识点。

最后,将准备好的DataFrame数据对象保存成Excel格式的数据文件就大功告成啦。

writer = pd.ExcelWriter(\'C:\\\\data.xlsx\') # 设置文档路径

data_frame.to_excel(writer, index=None, startrow=1, encoding=\'utf-8\',sheet_name=\'数据统计\')  # 设置Excel对象

ws = writer.sheets[\'数据统计\']  # 写入工作表名称

ws.write_string(0, 0, \'我是一个标题\')  # 添加标题

writer.save()  # 保存

【往期精彩】

● sched 模块中巨好用的轻量级定时任务神器scheduler!

● 不用再使用命令行打包成exe,有人写出了UI应用,可视化UI界面对python程序进行打包的方法!

● 发现一个秘密:既python3.6之后字典竟然变成了有序集合,我再次验证了一下!

● 这么多的内置函数能记住吗?对python的68个内置函数分类总结!

● 必须要会的文件操作对象File,python文件读写操作利器!

● 你不知道的CS模式的进程管理工具,状态监测、项目启停一目了然!

● 如何将一个python应用以docker镜像的方式来运行?

● python-celery专注于实现分布式异步任务处理、任务调度的插件!

● python远程服务操作工具:fabric,远程命令、本地命令、服务器操作利器!

● 办公自动化:Python-win32com自动将word文档转换成pdf格式!

● pandas数据统计插件的连接函数concat()妙用,灵活处理数据对象!

● python超赞插件you-get,执行一行命令即可下载、命令行下载工具推荐!

● python常用转义字符串总结:各种字符转义的不同、如何取消转义字符效果?

● 如何使用python完成对WebService服务的调用?suds-py3插件安利一下!

欢迎关注作者公众号【Python 集中营】,专注于后端编程,每天更新技术干货,不定时分享各类资料!

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

大家好,我是启航。

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

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

 

01需求描述

 

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

Image

现在需要利用 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. 判断 “战略” 是否在提取的文字中

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

 

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。所有的页面均包含“战略”二字:

ImageImage

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

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等模块实现批量操作,解放双手。

在这里插入图片描述

 文章到这里就结束了,感谢你的观看

说实在的,每次在后台看到一些读者的回应都觉得很欣慰,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① 2000多本Python电子书(主流和经典的书籍应该都有了)

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)

⑤    Python所有知识点汇总(可以弄清楚Python的所有方向和技术)

*如果你用得到的话可以直接拿走,在我的QQ技术交流群里,可以自助拿走,群号是857113825。*
在这里插入图片描述

以上是关于办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)!的主要内容,如果未能解决你的问题,请参考以下文章

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

Python办公自动化——提取pdf文件中表格并到Excel

自动化办公:手机号码提取器,使用正则表达式轻松提取文本文件中的手机号码

办公自动化:PDF文件合并器,将多个PDF文件进行合并...

python自动化高效办公第二期,带你项目实战{excel数据处理批量化生成word模板pdf和ppt等自动化操作}

如何提取pdf中的数据将pdf转换成excel