当前位置: 首页 > news >正文

通过python提取PDF文件指定页的图片

整体思路

要从 PDF 文件中提取指定页和指定位置的图片,可以分几个步骤来实现:

1.1 准备所需工具与库

在 Python 中处理 PDF 和图像时,需要使用几个库:

  • PyMuPDF (fitz):用于读取和处理 PDF 文件,可以精确获取指定页面内容。
  • Pillow:处理图像,用于裁剪和保存图片。
  • pdf2image:将 PDF 页面转换为图像格式,方便进一步处理。
1.2 基本流程
  1. 读取 PDF 文件:使用 PyMuPDF 读取 PDF 文件,找到指定页。
  2. 获取页面图像:使用 pdf2image 将目标页转换为图像。
  3. 确定图片区域:使用坐标来指定图像中的区域。该区域可以通过手动确定,或者通过图像识别技术(如 OCR)来定位。
  4. 提取并保存图片:使用 Pillow 裁剪出指定区域,并保存图像。
1.3 处理步骤
  • Step 1:使用 PyMuPDF 打开 PDF,找到目标页。
  • Step 2:将该页转换为图像。
  • Step 3:根据坐标裁剪指定位置的图像。
  • Step 4:保存裁剪后的图像。

代码示例:

import fitz  # PyMuPDF
from pdf2image import convert_from_path
from PIL import Image# Step 1: 打开 PDF 文件并定位指定页面
def extract_image_from_pdf(pdf_path, page_number, crop_box, output_image_path):# Step 2: 将目标页转换为图像pages = convert_from_path(pdf_path, dpi=300)target_page = pages[page_number - 1]  # Python的索引从0开始# Step 3: 使用 Pillow 裁剪图像left, top, right, bottom = crop_box  # 指定区域的坐标cropped_image = target_page.crop((left, top, right, bottom))# Step 4: 保存裁剪后的图像cropped_image.save(output_image_path)print(f"图像已保存到: {output_image_path}")# 示例使用
pdf_path = "/Users/linql/Desktop/3.5_python/0001_26110523.pdf"  # PDF 文件路径
page_number = 4  # 要提取的页码
crop_box = (10, 700,2800, 3100)  # 图像的裁剪区域 (left, top, right, bottom)
output_image_path = "output_image.png"  # 输出图像的路径extract_image_from_pdf(pdf_path, page_number, crop_box, output_image_path)

运行后,会提示:

pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

是因为:# macOS 需要安装 poppler 用于 pdf2image

brew install poppler

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • k8s笔记——kubebuilder实战
  • wifiip地址可以随便改吗?wifi的ip地址怎么改变
  • 【计算机网络 - 基础问题】每日 3 题(二)
  • linux: nvidia-smi用法详解
  • 二.Unity中使用虚拟摇杆来控制角色移动
  • Unity 第一人称游戏的武器被其他物体覆盖解决方案
  • 供应RM500UCNAB-D10-SNADA模块
  • leetcode 108.将有序数组转换为二叉搜索树
  • word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32
  • 嵌入式epoll面试题面试题及参考答案
  • Maven私服Nexus安装及使用
  • 第7篇:【系统分析师】计算机网络
  • openCV的python频率域滤波
  • 从底层原理上理解ClickHouse 中的 Distributed 引擎
  • 第四届长城杯部分wp
  • ES6指北【2】—— 箭头函数
  • 「译」Node.js Streams 基础
  • 【翻译】babel对TC39装饰器草案的实现
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • IDEA 插件开发入门教程
  • JSONP原理
  • ng6--错误信息小结(持续更新)
  • node入门
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • Yeoman_Bower_Grunt
  • 浮动相关
  • 手写一个CommonJS打包工具(一)
  • 思考 CSS 架构
  • 移动端 h5开发相关内容总结(三)
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • Java数据解析之JSON
  • #QT(一种朴素的计算器实现方法)
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)Nginx简介和安装教程
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)(4.6) Triducer
  • (6)设计一个TimeMap
  • (C++17) optional的使用
  • (八十八)VFL语言初步 - 实现布局
  • (二)c52学习之旅-简单了解单片机
  • (二)斐波那契Fabonacci函数
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (全注解开发)学习Spring-MVC的第三天
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 分布式技术比较
  • .NET企业级应用架构设计系列之开场白
  • .NET值类型变量“活”在哪?
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化