有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定!

今天就跟大家系统分享几种Python提取 PDF 图片的方法。其实没有非常完美的方法,每种方法提取效率都不是百分之百,因此可以考虑用多种方法进行互补,主要将涉及:基于 fitz 库和正则搜索提取图片 基于 pdf2image 库的两种方法提取图片

基于 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)

可以看到,全部图片都被正常提取!

基于 pdf2image 库的两种方法

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

可以简单通过pip install pdf2image安装,但poppler才是真正起做用的转换器,因此需要额外安装和配置: windows用户必须安装poppler for Windows,然后将bin/文件夹添加到PATH Mac用户必须安装poppler for Mac

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

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

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)

可以看到结果和之前一致,PDF中全部图片都被提取出来!

再补充一下。核心方法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中的图片的资料请关注免费资源网其它相关文章!

python提取pdf中的文字和图片_python 三种方法提取pdf中的图片相关推荐

  1. js中当等于最小值是让代码不执行_网页中JS函数自动执行常用三种方法

    本文为大家分享了在网页中JS函数自动执行常用方法,供大家参考,具体内容如下 一.JS方法 1.最简单的调用方式,直接写到html的body标签里面: 2.在JS语句调用: function myfun ...

  2. vbs执行ctrl+空格_VBS中解决路径带空格的三种方法

    vbs中,如果需要运行的程序中带有空格,按照通常的方式往往会提示错误,其实有两种形式不同的解决方法: 在应用程序前后分别加三个双引号,代码如下: Set wshell=CreateObject(&qu ...

  3. html网页自动运行函数,在网页中JS函数自动执行常用三种方法

    在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: functionn MyAutoRun() { //以下是您的函数的代码,请自行修改先! alert("函数 ...

  4. 测试Python下载图片的三种方法

    简 介: 通过Python软件包对网络URL图片链接进行下载,可以加快后期处理.本文测试了urllib, request两个软件包对图片进行下载效果.如果图片原网页有了防止下载机制,是无法下载图片. ...

  5. 计算机怎么删除表格,电脑中删除Excel2010表格多余图片的三种方法

    为了让表格看起来更加直观,很多朋友都会在Excel中插入图片.那么,当我们大批量插入图片时,如果想要删除的话,应该怎么办呢?以下是系统城小编为您带来的电脑中删除Excel2010表格多余图片的三种方法 ...

  6. html 如何给图片打标签,图文详解HTML页面中添加图片的三种方法

    在页面布局时,经常需要在页面中插入图片,那你知道如何在HTML中添加图片吗?这篇文章就给大家介绍HTML页面中插入图片的三种方法,感兴趣的朋友可以参考一下,希望对你有所帮助. 方法一.用HTML中的i ...

  7. WPS如何转换成图片?三种方法帮你实现

    WPS如何转换成图片?三种方法帮你轻松实现!在大学中,大家完成老师布置的专业课作业都是通过使用电脑中的WPS制作完成.为了防止自己的作业遭到其他同学的私自窜改或是复制粘贴的抄袭.有的同学就会将自己的作 ...

  8. mac 如何查看anaconda的路径_Mac OS如何直接查看gif图片?分享MAC直接查看gif图片的三种方法...

    想必许多刚入手Mac的用户在浏览GIF图片文件时,会发现Mac不能直接打开GIF,因此有的用户为了方便查看还特意去下载了GIF的图片查看器,其实在Mac中有多种能够直接打开GIF的方法,用户无需任何第 ...

  9. html页面转换成图片的三种方法——canvas、dom-to-image、html2canvas

    html页面转换成图片的三种方法--canvas.dom-to-image.html2canvas canvas绘制网络图片报错(跨域) 使用canvas将html页面转成图片 dom-to-imag ...

  10. 在HTML中使用CSS美化网页的三种方法

    在HTML中使用CSS美化网页的三种方法 CSS是Cascading Style Sheets(级联样式表)的缩写,CSS是一种样式表语言,用于为HTML文档定义布局.例如,CSS涉及字体.颜色.边距 ...

最新文章

  1. 用JavaScript获取URL中的参数值
  2. ViSP中识别AprilTag的C++实例代码与运行结果
  3. GDB怎么调试使用.sh(shell脚本)启动的程序?(未完成,待测试)
  4. 机器学习(三十三)——价值函数的近似表示
  5. ObjectiveC 深浅拷贝学习
  6. java 图片压缩100k_java实现图片压缩
  7. LSA类型讲解——LSA-2(第二类LSA——Network LSA)、LSA-3(第三类LSA——Network Summary LSA)详解
  8. (四)为深度伪造预处理数据集
  9. ES6快速入门——类与对象
  10. python 读取txt中的英文内容 分析词频 可视化显示
  11. char 类型的取值范围
  12. tomcat7解压版安装过程
  13. 禁用Ubuntu鼠标中键复制功能
  14. 微信企业号开发-如何建立连接
  15. 麦肯锡:释放智能网联汽车数据全生命周期价值​潜力
  16. Ardupilot飞控添加使用诺瓦泰GPS
  17. STM32学习笔记---OLED页寻址方式
  18. 分析界面,在全国公共资源交易平台使用java获取全国的招投标数据接口
  19. Solr 特点,为什么要用solr服务,
  20. VC6.0 通过ado连接access数据库

热门文章

  1. GB28181 视频服务器文档整理
  2. 项目整体管理:实施整体变更控制
  3. 普通话测试-短文60篇文章,附带拼音(11-20篇)
  4. 熟练掌握计算机应用,计算机应用技术专业个人技能怎么写
  5. 2014汽车之家笔试
  6. 测试报告包含哪些内容?(超详细,带图)
  7. 泰国之旅随感(r1笔记第70天)
  8. 微博先锋:Twitter系统结构分析
  9. AI时代大点兵-国内外知名AI公司2018年最新盘点
  10. PS放大图片而不模糊的操作方法