[Python] 如何导出PDF文件中的图片

news2024/11/24 3:20:24

文章目录

    • 一、背景说明
    • 二、代码编写
    • 三、问题
      • 3.1、如何得到图片的xref?
      • 3.2、xref有什么用呢?
    • 四、总结


cover


一、背景说明

最近在看一份pdf的书籍,其中有一些图片绘制地比较出色,所以就打算将其复制出来,以便于在需要的时候进行使用。

但是,令人无奈的是,pdf中的图片是无法直接另存为的。搜了一些网上的做法,要么是需要收费,要么就需要在线上传文件… 总之方案都不是很理想。

偶然之下了解到Python的fitz这个组件,据说是可以导出PDF中的图片的。所以,在一番学习之下写了一个小的工具,成功导出了所需的图片。

出于备忘的需要,也为了将该方法分享给广大的小伙伴,享受从PDF中导出图片的快乐,所以就有了本文的诞生。

 


二、代码编写

闲言少叙,直接上代码:

import fitz
import os

# 打开文件
pdf_file_name = "E:/books/xxx.pdf"

# 提取图片函数
def extract_pics(file_name, extract_path):

    # 1.打开文件
    doc = fitz.open(file_name)

    #文档页数
    pages = len(doc)
    print("文档共有{}页".format(pages))

    # 2.遍历并检查每页的图片
    image_count = 0
    for i in range(pages):
        # 页面对象
        page = doc[i]

        # 获取图片列表
        images = page.get_images()

        # 遍历图片
        for image in images:
            # 返回图片引用
            xref = image[0]

            # 根据引用从pdf中释放出图片
            base_image = doc.extract_image(xref)
            #获得图片数据
            image_data = base_image["image"]
            # 保存图片
            if not os.path.exists(extract_path):
                os.makedirs(extract_path)
            with open(f'{extract_path}/image_{image_count}.png', 'wb') as f:
                f.write(image_data)
                image_count = image_count + 1
    
    # 3.关闭打开的pdf
    doc.close()
    return image_count

count = extract_pics(pdf_file_name, "./pics")
print("导出 {} 张图片".format(count))

代码思路:

  • 将待导出图片的文件,定义为一个变量。传入提取图片函数,作为参数。
  • 将图片导出的目标路径作为函数的第二个参数
  • 函数所做的事情如下:
  1. 打开pdf文档。打开文档后会返回一个文档的引用,类型是fitz.Document对象。
     
  2. page.get_images(),会返回page对象中定义的图片列表。列表的每一个元素的结构是:[xref, smask, ...],所以说该方法的结果是数组的列表。我们可以看出:每个元素的第一个值就是xref。
     
  3. 所以代码 xref = image[0] 就是为了获取交叉引用。

而官方文档有这么一句:

Extract the image with img = doc.extract_image(xref). This is a dictionary containing the binary image data as img[“image”].
 
来源:https://pymupdf.readthedocs.io/en/latest/recipes-images.html#how-to-extract-images-pdf-documents

就是说:通过代码 img = doc.extract_image(xref) 可以提取图片。这个方法的返回值是一个字典。通过字典的 img["image"] 可以获取二进制的图片数据


  1. 保存提取出图片的目录。如果不存在,就新建该目录。
  2. 使用with语句优雅地将二进制图片数据写入到指定目录中。图片的命名从0开始,并记录导出图片的数量。
  3. 最后不要忘记关闭pdf文件。释放资源。

 


三、问题

3.1、如何得到图片的xref?

答:
循环访问 Page.get_images() 的项目。它会返回一个列表的列表,列表的元素结构类似于 [xref, smask, …],其中包含图像。

3.2、xref有什么用呢?

答:可以使用 img = doc.extract_image(xref) 提取图像。img是一个 字典结构。其中 img[“image”] 可以返回一个二进制图像数

 


四、总结

本文通过Python写了一个可以导出pdf文件中图片的小工具。借助这个工具可以很容易地将pdf中的所有图片都导出到指定目录。

文中对代码的核心功能部分进行了讲解。并结合官方文档说明了代码为什么这么写。希望对小伙伴们有帮助!!

 
 
 
 
 


参考:
https://pymupdf.readthedocs.io/en/latest/module.html
https://pymupdf.readthedocs.io/en/1.24.0/recipes-images.html#how-to-extract-images-pdf-documents

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

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

相关文章

webGIS 之 智慧校园案例

1.引入资源创建地图 //index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

【PyQt学习篇 · ⑮】:qrc/rcc资源系统

文章目录 qrc使用介绍rcc编译资源rcc 的安装与基本使用 编译成Python文件使用资源系统文件方式一&#xff1a;导入资源系统文件方式二&#xff1a;整合资源系统文件 qrc使用介绍 在PyQt中&#xff0c;qrc文件是一种资源文件&#xff0c;用于将应用程序所需的资源&#xff08;如…

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…

日历插件fullcalendar【笔记】

日历插件fullcalendar【笔记】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

事务传播行为Propagation

目录 背景Propagation测试程序1测试程序2分析 背景 前段时间&#xff0c;某个项目在部署时&#xff0c;被公司的一个检测拦截了&#xff0c;提示报错如下&#xff1a; Your code exists Method or Class with Transactional annotation that not use Propagation.REQUIRED.有…

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相…

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统&#xff0c;是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效&#xff0c;不仅引入了分割视图和侧边栏&#xff0c;还带来了全新的音乐和播客应用&#xff0c;极大地提升了用户体验。在隐私保护和安全性方面&…

Oracle 数据库、实例、用户、表空间、表之间的关系(新手入门)

Oracle 数据库、实例、用户、表空间、表之间的关系 数据库&#xff1a; Oracle数据库是数据的物理存储。这就包括&#xff08;数据文件ORA或者DBF、控制文件、联机日志、参数文件&#xff09;。其实Oracle数据库的概念和其它数据库不一样&#xff0c;这里的数据库是一个操作系…

python中dropna()函数的作用举例说明

在Python中&#xff0c;dropna()是一个Pandas库中的函数&#xff0c;用于从数据框&#xff08;DataFrame&#xff09;中删除包含缺失值&#xff08;NaN&#xff09;的行或列。它用于数据清洗和预处理阶段&#xff0c;以便去除缺失值&#xff0c;使数据更加规整。 dropna()函数…

软件杯 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

nginx的缓存和gzip

nginx的缓存 缓存的基本思想是利用客户端访问的时间局限性&#xff0c;将客户端访问过的内容做一个副本&#xff0c;在一定时间内存放到本地&#xff0c;当改数据下次被访问时&#xff0c;不必连接到后端服务器反复去查询数据&#xff0c;而是由本地保存的副本响应数据。 保存…

服务器固定IP(固定出口IP)去访问外部服务

背景 服务器上有多个IP&#xff0c;那么在服务器请求外部服务的时候&#xff0c;到底是使用哪个IP呢&#xff1f;如果要使用特定的IP去请求外部服务&#xff0c;该如何设置呢&#xff1f; 分析 遇到一个实际的场景&#xff1a; 我们产品和其他产品联调&#xff0c;我们的服务…

【A-010】基于SSH的宠物狗商城系统(含论文)

【A-010】基于SSH的宠物狗商城系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 项目介绍&#xff1a; 在科学技术飞速发展的今天&#xff0c;互联网成为人们快速获取、发布和传递信息的重要渠道&am…

【Docker笔记01】【基础内容】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、Docker…

基于springboot实现房屋租赁系统项目【项目源码+论文说明】

基于springboot实现房屋租赁系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

浮点数(小数)在计算机中如何用二进制存储?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/137182814 出自【进步*于辰的博客】 注&#xff1a;为了阐述更加严谨&#xff0c;本篇文章中将使…

【练习】滑动窗口思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Java算法&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.长度最小的子数组 题目解析 讲解 代码实现 2.无…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…