python自动化pdf报告_[Python] 自动化办公 PDF提取文字、表格、图片

转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒)

若公众号内转载请联系公众号:早起Python

本例可以学到的知识点:

使用 pdfplumber 提取 PDF 中的文字和表格

使用 fitz 提取 PDF 中的图片

之前我们已经详细介绍了批量 PDF 文件的处理,包括合并、拆分、水印、加密等, 批量PDF文件的处理

在文章中详细剖析了每一行的原理。这里要说明的是,针对 PDF 的模块较多,且有些模块功能并不完善,代码也没有类似 OFFICE 三件套操作那般简洁

今天学习的 PDF 图片提取亦如是。因此更多时候以理解为主,不需要完全掌握代码书写,会用会改即可

今天讲解的练习数据是一份年度报告,里面有大量的文字、表格、图片构成

一、模块安装

需要安装两个模块,第一个是 pdfplumber

在 Windows 中调出命令行:

pip install pdfplumber

第二个是 fitz, 它是 pymupdf 中的一个模块

在 Windows 中调出命令行:

pip install pymupdf

二、 PDF 文字提取

代码思路:

利用 pdfplumber 打开一个 PDF 文件

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

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

用上述代码尝试提取示例数据中第 12 页的文字:

import pdfplumber

file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:

page = pdf.pages[11]

print(page.extract_text())

提取的内容可以通过导入 python-docx 并借助 wordfile.add_paragraph() 写入 Word 文件

三、PDF 表格提取

提取单个表格和提取单页文字的代码非常类似,用的是 .extract_table()

需要注意,.extract_table() 默认提取指定页面的第一个表格,如果当前页面有多个表格都需要提取,则要直接使用 .extract_tables()

例如示例文件中第 13 页有 2 个表格,我们分别利用 .extract_table() 和 .extract_tables() 观察输出情况

import pdfplumber

file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:

page = pdf.pages[12]

print(page.extract_table())

是一个嵌套列表,熟悉这种格式的人会理解想到可以用 pandas 或者遍历该嵌套列表后借助 openpyxl 的 sheet.append(list) 写入 Excel 文件中

import pdfplumber

file_path = r'C:\xxxx\practice.PDF'

with pdfplumber.open(file_path) as pdf:

page = pdf.pages[12]

print(page.extract_tables())

.extract_tables() 提取当前页所有表格会产生了一个三级嵌套列表,第一层的列表就代表每一个表格

四、PDF 图片提取

对于图片提取,现在没有任何一个模块可以做到百分之百的提取。这边只介绍基于 fitz 模块的代码,基本思路是通过正则查找图片并将其输出

import fitz

import re

import os

file_path = r'C:\xxx\practice.PDF'

dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2pic(path, pic_path):

checkXO = r"/Type(?= */XObject)"

checkIM = r"/Subtype(?= */Image)"

pdf = fitz.open(path)

lenXREF = pdf._getXrefLength()

imgcount = 0

for i in range(1, lenXREF):

text = pdf._getXrefString(i)

isXObject = re.search(checkXO, text)

isImage = re.search(checkIM, text)

if not isXObject or not isImage:

continue

imgcount += 1

pix = fitz.Pixmap(pdf, i)

new_name = f"img_{imgcount}.png"

if pix.n < 5:

pix.writePNG(os.path.join(pic_path, new_name))

else:

pix0 = fitz.Pixmap(fitz.csRGB, pix)

pix0.writePNG(os.path.join(pic_path, new_name))

pix0 = None

pix = None

pdf2pic(file_path, dir_path)

成功提取了图片,但 PDF 中的图片远不止这些。欢迎有兴趣的读者交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天池 在线编程 最长AB子串(哈希)

文章目录1. 题目2. 解题1. 题目 描述 给你一个只由字母’A’和’B’组成的字符串s&#xff0c;找一个最长的子串&#xff0c;要求这个子串里面’A’和’B’的数目相等&#xff0c;输出该子串的长度。 这个子串可以为空。 s的长度n满足 2<n<1000000。示例 样例1 输入: s…

Tomcat 打开一闪而过

转载于:https://www.cnblogs.com/super90/p/4504326.html

java怎么递归_Java的递归、如何与流相结合

递归技术需求&#xff1a;扫描D:\test所有子文件夹及子子文件夹下的.jpg文件。我们如果用循环来做这件事&#xff0c;我们不知道循环的结束条件&#xff0c;也不知道到底有多少层&#xff0c;所以比较麻烦。我们可以用一种新的思想&#xff1a;递归。递归举例&#xff1a;从前有…

假设有搅乱顺序的一群儿童成一个队列_数据结构与算法系列之栈amp;队列(GO)...

以下完整代码均可从这里获取栈栈的基本概念「后进先出、先进后出就是典型的栈结构」。栈可以理解成一种受了限制的线性表&#xff0c;插入和删除都只能从一端进行当某个数据集合只涉及在一端插入和删除数据&#xff0c;并且满足后进先出、先进后出的特性&#xff0c;就应该首选…

python 自定义类(特殊方法)

文章目录1. 对象表示形式2. 可散列的类3. 私有属性的利弊4. __slots__ 类属性节省空间5. 覆盖类属性learn from 《流畅的python》 from array import array import mathclass Vector2D:typecode d # 类属性def __init__(self, x, y):self.x float(x)self.y float(y)classm…

网络知识

http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html http://www.cnblogs.com/daoluanxiaozi/p/3274925.html转载于:https://www.cnblogs.com/webundle/p/4505782.html

datagridview 动态插入图片_挑战一张照片制作动态PPT背景

在PPT中&#xff0c;要做出好看的页面动画效果&#xff0c;常常需要用很多图片和装饰元素。而如果你手头的素材只有一张照片&#xff0c;如何才能快速做出好看的PPT背景效果呢&#xff1f;本期内容&#xff0c;我们就来一起挑战&#xff0c;使用一张照片&#xff0c;制作PPT动态…

sed搜索某行在行末追加_示范sed指定某行插入 追加和全局替换

有时候会有这样的需求&#xff0c;在指定的行后面或者是前面追加一行&#xff0c;这个时候可以使用sed来完成&#xff0c;具体用法如下a\ 在指定的行后面追加一行b\ 在指定的行前面追加一行使用指定的行号追加内容&#xff0c;在使用行号的过程中&#xff0c;需要注意的问题有以…

LeetCode 1941. 检查是否所有字符出现次数相同

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;如果 s 是一个 好 字符串&#xff0c;请你返回 true &#xff0c;否则请返回 false 。 如果 s 中出现过的 所有 字符的出现次数 相同 &#xff0c;那么我们称字符串 s 是 好 字符串。 示例 1&#xff1a; 输入&…

java初学者定远期目标_JAVA题,新手求解

展开全部类图设计&#xff1a;类设计&#xff1a;package car;public class Car {private String id;private String name;public void setId(String id) {this.id id;}public void setName(String name) {this.name name;}/*** 获取汽车编e69da5e6ba9062616964757a686964616…

LeetCode 1942. 最小未被占据椅子的编号(set)

文章目录1. 题目2. 解题1. 题目 有 n 个朋友在举办一个派对&#xff0c;这些朋友从 0 到 n - 1 编号。 派对里有 无数 张椅子&#xff0c;编号为 0 到 infinity 。 当一个朋友到达派对时&#xff0c;他会占据 编号最小 且未被占据的椅子。 比方说&#xff0c;当一个朋友到达时…

python哪本书好看_python入门看哪本书好

推荐几本适合python初学者的书。《Python编程 从入门到实战》本书中涵盖的内容是比较精简的&#xff0c;没有艰深晦涩的概念&#xff0c;最重要的是每个小结都附带有”动手试一试”环节&#xff0c;学编程最佳的方式就是多动手、多动脑。很多初学者看完书之后不知道下一步怎么办…

java mysql geo_GEO数据库简介

为了支持公共使用和散布基因表达数据&#xff0c;NCBI开始了基因表达汇编(GEO)计划。GEO是努力建立一个基因表达数据仓库和在线资源&#xff0c;用于从任何物种或人造的来源检索基因表达数据。来自microarray&#xff0c;高密度寡核苷酸array(HAD)&#xff0c;杂交膜(filter)和…

对每个小组的评论和建议

1、极速蜗牛&#xff1a;总体上已经有了一个小游戏的基本轮廓&#xff0c;虽然还没有达到预期的效果&#xff0c;但是能看到他们的进度。不过这次我们只看到了一直在反弹&#xff0c;对于一个游戏来说&#xff0c;娱乐性是很重要的&#xff0c;但是在这个游戏中我们没有看到很大…

vue路由懒加载_优化vue项目的首屏加载速度

最近使用vue-cli3构建了一个小型的博客系统&#xff0c;完工之后&#xff0c;build打包出来发现一个chunk-vendors包就有1.1m&#xff0c;部署上去之后&#xff0c;访问的时候&#xff0c;首屏加载非常慢。居然需要21s&#xff0c;体验极差。这是打包的结果截图根据这种情况&am…

LeetCode 1943. 描述绘画结果(差分思想)

文章目录1. 题目2. 解题1. 题目 给你一个细长的画&#xff0c;用数轴表示。 这幅画由若干有重叠的线段表示&#xff0c;每个线段有 独一无二 的颜色。 给你二维整数数组 segments &#xff0c;其中 segments[i] [starti, endi, colori] 表示线段为 半开区间 [starti, endi) 且…

java浏览器拖拽_使用Java强制移动浏览器缩小

在我的网络应用中&#xff0c;我有一些缩略图&#xff0c;可在单击时打开一个灯箱。 在移动设备上&#xff0c;缩略图很小&#xff0c;用户通常会放大。问题是&#xff0c;单击播放时&#xff0c;灯箱在可见区域之外(他们必须滚动到灯箱才能观看视频)。 是否可以强制移动浏览器…

Git学习笔记01--初始化设置

1、查看git版本 $ git --version 2、设置用户姓名和邮箱 $ git config --global user.name “Craftor” $ git config --global usrer.email “craftor0924gmail.com” 3、设置命令别名 $ git config --system alias.st status $ git config --system alias.ci commit $ git co…

LeetCode 1944. 队列中可以看到的人数(单调栈)

文章目录1. 题目2. 解题1. 题目 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。 给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他…

yolov2训练_一文看懂YOLO v2

我的CSDN博客&#xff1a;https://blog.csdn.net/litt1e我的公众号&#xff1a;工科宅生活概述新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”&#xff0c;相较于YOLO主要有两个大方面的改进&#xff1a;第一&#xff0c;作者使用了一系列的方法对原来的YOLO多…