今天就跟大家系统分享几种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

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中全部图片相关推荐

  1. python读取和保存图片的三种方法

    python读取和保存图片 opencv import cv2 #load img = cv2.imread('0.png') #show cv.imshow('title', img) #save ...

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

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

  3. pca算法python代码_三种方法实现PCA算法(Python)

    主成分分析,即Principal Component Analysis(PCA),是多元统计中的重要内容,也广泛应用于机器学习和其它领域.它的主要作用是对高维数据进行降维.PCA把原先的n个特征用数目 ...

  4. python一次性读取整个文件-python逐行读取文件内容的三种方法

    一.使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. 二.需要导入import os 三.下面是逐行读取文件内容的三种方法: ...

  5. php读取文件内容不全,php读取文件内容的三种方法

    //**************第一种读取方式***************************** 代码如下: header("content-type:text/html;chars ...

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

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

  7. python下载方法-python实现下载文件的三种方法_python

    本篇文章主要介绍了python实现下载文件的三种方法,最常用的方法就是通过Http利用urllib或者urllib2模块还有requests,有兴趣的可以了解一下. Python开发中时长遇到要下载文 ...

  8. python下载的文件放在哪里的-python实现下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  9. python键盘输入数组_python 二维数组切割Python读取键盘输入的2种方法

    Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘.如下: 1.raw_input 2.input raw_input函数raw_input() 函数从标准输入读取一个行,并返 ...

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

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

最新文章

  1. ubuntu 禁用透明大页_Linux关于透明大页的使用与禁用介绍
  2. 自动驾驶中的机器学习
  3. jsp页面之间跳转的数据传递
  4. JSON javascript 使用
  5. 正念奇迹(一则正能量)
  6. 集成电路史上著名的十个人,有几个中国人?
  7. 【朝夕技术专刊】Core3.1WebApi_Filter多种注册方式支持依赖注入
  8. 怎么用python编程前二n-1项的等差数列的和_python 等差数列末项计算方式
  9. php 图片单位转换,php如何把图片转换成二进制字符串
  10. ipython 模块搜索路径
  11. MTK 驱动开发(40 )---TP乱跳频原因
  12. virtual关键字的使用(C# 参考)
  13. modbus-tcp协议通过Java代码获取从机数据
  14. 【14NOIP普及组】珠心算测验
  15. redis 集群详解及搭建过程
  16. 小型软件企业组织结构
  17. Spark入门基础教程
  18. 教你画西游记思维导图
  19. 用队列实现栈(Java)
  20. Microsoft Platform SDK Febrary 2003下载(更新VC6的SDK)

热门文章

  1. Opencontrail 流的处理
  2. Nodejs中如何调用腾讯云的短信验证码接口并对接口进行安全限制
  3. 2022全国大学生数学建模竞赛获奖难么?国赛求解过程技巧及方案
  4. uniapp app中导出手机号码到通讯录
  5. Linux stty 指令设置串口参数
  6. 紫猫插件-网络共享数据(7-15)
  7. HTTPS 免费证书,免费 ssl 证书,FreeSSL.cn 申请多种免费证书
  8. 步进电机、伺服电机和舵机通俗解读
  9. 积分墙渠道运营那些事儿
  10. Excel 转置分组时如何保留没有对应数据的空组