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

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

这篇文章能学到的主要内容:

基于 fitz 库和正则搜索提取图片

基于 pdf2image 库的两种方法提取图片

我们拿到一个 PDF 文件时,有时是因为兴趣有时是因为办公任务,希望将 PDF 中所有图片存到一个指定的位置。这个问题看似简单,实际上如果是手动操作较困难,不借助其他工具基本没办法完成。最后常常会变成截图保存,效率低的同时又损失了一定清晰度

在办公场景中这样的需求并不少见,因此今天跟大家系统分享几种提取 PDF 图片的方法。其实没有非常完美的方法,每种方法提取效率都不是百分之百,因此可以考虑用多种方法进行互补

1. 基于 fitz 库和正则搜索

fitz 是 pymupdf 的子模块,需要先用命令行安装 pymupdf:

pip install pymupdf

但注意导入时使用 import fitz 导入模块

利用 fitz 库提取图片需要通过正则匹配图片元素,将模板元素转化为像素后再以图片形式写出

import fitz

import re

import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径

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

def pdf2image1(path, pic_path):

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

pdf = fitz.open(path)

lenXREF = pdf._getXrefLength()

count = 1

for i in range(1, lenXREF):

text = pdf._getXrefString(i)

isImage = re.search(checkIM, text)

if not isImage:

continue

pix = fitz.Pixmap(pdf, i)

new_name = f"img_{count}.png"

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

count += 1

pix = None

pdf2image1(file_path, dir_path)

运行提取示例文件后结果如下:

有一些很小的色块也被提取成图片,那么怎么过滤掉它们呢?

有一个简单的方法是通过大小过滤,pix 像素在 fitz 库中存在一个重要的方法 pix.size 可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值 10000 为例过滤:

import fitz

import re

import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径

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

def pdf2image1(path, pic_path):

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

pdf = fitz.open(path)

lenXREF = pdf._getXrefLength()

count = 1

for i in range(1, lenXREF):

text = pdf._getXrefString(i)

isImage = re.search(checkIM, text)

if not isImage:

continue

pix = fitz.Pixmap(pdf, i)

if pix.size < 10000: # 在这里添加一处判断一个循环

continue # 不符合阈值则跳过至下

new_name = f"img_{count}.png"

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

count += 1

pix = None

pdf2image1(file_path, dir_path)

2. 基于 pdf2image 库的两种方法

一看名字就知道这个库的用处了,官方文档为:https://www.cnpython.com/pypi/pdf2image

可以简单通过 pip install pdf2image 安装,但poppler才是真正起做用的转换器,因此需要额外安装和配置:

具体发挥作用的代码官方文档也给出了详细的说明:

那么我们就分别尝试这两种方法:

from pdf2image import convert_from_path,convert_from_bytes

import tempfile

from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError

import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径

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

def pdf2image2(file_path, dir_path):

images = convert_from_path(file_path, dpi=200)

for image in images:

if not os.path.exists(dir_path):

os.makedirs(dir_path)

image.save(file_path + f'\img_{images.index(image)}.png', 'PNG')

pdf2image2(file_path, dir_path)

可以成功提取图片。再试试第二种方法:

from pdf2image import convert_from_path,convert_from_bytes

import tempfile

from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError

import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径

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

def pdf2image3(file_path, dir_path):

images = convert_from_bytes(open(file_path, 'rb').read())

for image in images:

if not os.path.exists(dir_path):

os.makedirs(dir_path)

image.save(file_path + f'\img_{images.index(image)}.png', 'PNG')

pdf2image3(file_path, dir_path)

结果和之前一致,这里就不再重复展示

再补充一下。核心方法 covert_from_bytes 包含大量参数,可以自行修改。

几个常用参数总结如下:

参数

意义

pdf_path

PDF 文档路径

dpi

图像质量(如果是学术期刊杂志常见 300dpi)

output_folder

将生成的图像写入文件夹(而不是直接写入内存)

first_page

起始转换页数

last_page

转换至哪一页

fmt

图像格式,可以指定为 png,默认为 ppm

thread_count

允许参与转换的线程数

userpw

PDF 的密码

output_file

输出文件名

poppler_path

指定 poppler 的安装路径,一开始配置好就无需指定

值得一提 thread_count 参数,多线程会大大加快转换速度,尤其是 PDF 页面较多时。有兴趣的读者可以做尝试。

python自动化提取pdf表格_[Python] 自动化办公 多种提取PDF图片的方法相关推荐

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

    转载请注明:陈熹 chenx6542@foxmail.com (简书号:半为花间酒) 若公众号内转载请联系公众号:早起Python 本例可以学到的知识点: 使用 pdfplumber 提取 PDF 中 ...

  2. python 提取pdf表格_用Python提取pdf文件中的表格数据

    本文作者:杨慧琳 本文编辑:周聪聪 技术总编:张学人有问题,不要怕!访问 http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx ...

  3. python pdfminer读取pdf表格_如何使用PDFMiner从pdf中提取表格?

    我正试图从pdf文档中的一些表中提取信息. 考虑输入:Title 1 some text some text some text some text some text some text some ...

  4. python读取pdf表格_【Python 库】解析PDF文本及表格——pdfminer、tabula、pdfplumber 的用法及对比...

    pdf 是个异常坑爹的东西,有很多处理 pdf 的库,但是没有完美的. 一.pdfminer3k pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本. ...

  5. python读取pdf表格_[转]Python 解析 PDF 文本和表格的四大方法介绍

    Python 解析 PDF 文本和表格的四大方法介绍 == code for paper and NSFC Proj. parsing==: https://gitee.com/sonica/pdf_ ...

  6. python提取pdf表格数据_Python骚操作,提取pdf文件中的表格数据!

    在实际研究中,我们经常需要获取大量数据,而这些数据很大一部分以pdf表格的形式呈现,如公司年报.发行上市公告等.面对如此多的数据表格,采用手工复制黏贴的方式显然并不可取.那么如何才能高效提取出pdf文 ...

  7. python文本分析 提取数据含义_从文本字符串中提取数据进行分析

    需求 在进行数据分析的时候,有时候会碰到需要从文本字符串中提取需要的数据来进行分析的情况,这种需求在网络爬虫数据分析非常常见. 比如,需要下列表格"基础薪资规则"字段中提取阶梯单量 ...

  8. python怎么读取石墨表格_每2秒进行一次statsd xaxis石墨统计 - python

    我已经安装了石墨,nodejs-statsd(用于接收数据)和python statsd客户端(用于发送数据). 下面是一个测试脚本,该脚本将数据发送到statsd进程的udp套接字. #!/usr/ ...

  9. python如何检验显著性差异_[Python] 如何证明两组样本有显著性差异(t-test假设检验) | 学步园...

    现有两组样本数据,假如它们分别基于两套不同的方法,或者测于不同的设备,又或是出自两个人之手,如何证明它们有或没有显著性差别呢?当然可以拿个Excel表把数据画个图,然后找一堆人来投票,看觉得差不多还是 ...

最新文章

  1. 大数的菲波那契计算/Huge Fibonacci Numbers - ACM
  2. php图片等比例压缩,php实现图片上传并等比例压缩
  3. 网络嗅探混杂模式与非混杂模式的区别
  4. 1、django安装,问题,创建项目,编写第一个demo
  5. Java程序的编码规范
  6. 2019华为软件精英挑战赛 赛后总结
  7. Apache下的FileUtils.listFiles方法简单使用技巧
  8. android游戏源码 2048,Android实现2048小游戏
  9. android 模拟gps坐标,android中模拟器中实现GPS坐标改变
  10. IBX 常见问题解答(译)
  11. 自我介绍html模板王,小学生个人自我介绍模板10篇
  12. Python 画图工具生成数据点图
  13. Dp-状态压缩:玉米田
  14. 感性认识spring的IoC
  15. Python爬取微信公众号素材库
  16. Spring容器框架
  17. 肯塔基大学计算机科学,西肯塔基大学计算机专业
  18. Hive desc详解
  19. 计算机微格教学心得体会,微格教学心得体会6篇.doc
  20. 如何精准地识别摄像头前方的物体类型和测距?

热门文章

  1. 网络原理考点之BSC协议
  2. 便携式CAN分析仪can总线的产品特性及选型分享
  3. can 分析仪 can卡 ——深圳超力源7220 电摩保护板联调时一个CAN盒解决所有的问题
  4. 信息管理毕设项目推荐
  5. 新浪微博被约谈下架“热搜榜”事件舆情监测报告
  6. 【C语言进阶】指针 下
  7. WSL安装CUDA并成功运行
  8. 接到面试通知后的准备
  9. 考研复试 计算机英语
  10. Java程序员需要了解的几个开源协议开源协议