如何用python将pdf转为text并提取其中的图片

要将 PDF 转为文本并提取其中的图片,可以使用 Python 的几个库来实现:

  1. PDF 转文本:使用 PyMuPDFpdfplumber 来提取文本。
  2. 提取图片:使用 PyMuPDFpdf2image 来提取图像。

以下是实现的步骤和代码示例:

1. 安装必要的库

你需要安装以下库:

pip install PyMuPDF pdfplumber Pillow

2. 代码示例

提取 PDF 中的文本

你可以使用 PyMuPDFpdfplumber 来提取 PDF 中的文本。以下是使用 PyMuPDF 提取文本的示例:

import fitz  # PyMuPDF

# 打开PDF文件
pdf_document = fitz.open("your_pdf_file.pdf")

# 提取每页的文本
text = ""
for page_num in range(pdf_document.page_count):
    page = pdf_document.load_page(page_num)
    text += page.get_text()

# 输出提取的文本
print(text)
提取 PDF 中的图片

PyMuPDF 可以提取 PDF 中的图像。下面是一个提取图像的示例:

import fitz  # PyMuPDF
import io
from PIL import Image

# 打开PDF文件
pdf_document = fitz.open("your_pdf_file.pdf")

# 遍历每页并提取图片
image_list = []
for page_num in range(pdf_document.page_count):
    page = pdf_document.load_page(page_num)
    
    # 获取页面的所有图像
    image_list.extend(page.get_images(full=True))

# 保存提取的图像
for img_index, img in enumerate(image_list):
    xref = img[0]  # 图像的xref
    base_image = pdf_document.extract_image(xref)
    image_bytes = base_image["image"]

    # 使用Pillow保存图片
    image = Image.open(io.BytesIO(image_bytes))
    image.save(f"image_{img_index + 1}.png")

3. 解释代码

  • PyMuPDF (fitz): 用于处理 PDF 文件,包括提取文本和图像。
  • get_text(): 提取页面中的文本。
  • get_images(full=True): 提取页面中的所有图像。
  • extract_image(): 提取图像内容,并通过 PillowPIL)将图像保存为文件。

4. 输出

  • 代码会提取 PDF 中的所有文本,并将其打印出来。
  • 代码会提取 PDF 中的所有图像,并保存为 PNG 文件。

要将 PDF 中的文本和图片按原本的顺序保存为一个新的文件(例如将文本和图片结合在一起,创建一个新的 PDF),可以使用 PyMuPDF 来处理这个任务。下面是如何提取 PDF 的文本和图片,并按照原始顺序将它们合并并保存为新 PDF 文件的步骤。

步骤:

  1. 提取 PDF 中的文本和图片
  2. 创建新的 PDF,将提取的文本和图片按顺序添加到新的文件中。

1. 安装必要的库

首先,确保你已经安装了所需的库:

pip install PyMuPDF Pillow

2. 代码实现

下面的代码会从原始 PDF 中提取文本和图片,并将它们按顺序保存到一个新的 PDF 文件中。

import fitz  # PyMuPDF
import io
from PIL import Image

# 打开原始PDF文件
pdf_document = fitz.open("your_pdf_file.pdf")
new_pdf_document = fitz.open()  # 创建一个新的PDF文件

# 遍历每一页
for page_num in range(pdf_document.page_count):
    page = pdf_document.load_page(page_num)

    # 提取文本并添加到新页面
    text = page.get_text()
    
    # 创建新的页面,大小与原页面一致
    new_page = new_pdf_document.new_page(width=page.rect.width, height=page.rect.height)
    
    # 将文本添加到新页面
    new_page.insert_text((10, 10), text, fontsize=12)

    # 提取图片并添加到新页面
    image_list = page.get_images(full=True)
    for img_index, img in enumerate(image_list):
        xref = img[0]  # 图像的xref
        base_image = pdf_document.extract_image(xref)
        image_bytes = base_image["image"]

        # 使用Pillow保存图像并插入到新页面
        image = Image.open(io.BytesIO(image_bytes))
        image_path = f"image_{page_num + 1}_{img_index + 1}.png"
        image.save(image_path)
        
        # 在新页面中插入图片,指定位置
        img_rect = fitz.Rect(100, 100, 300, 300)  # 设置图片插入位置和大小
        new_page.insert_image(img_rect, filename=image_path)

# 保存新的PDF文件
new_pdf_document.save("output_pdf_with_text_and_images.pdf")
new_pdf_document.close()

3. 代码解析

  • 提取文本:使用 get_text() 提取每页的文本内容。
  • 提取图片:通过 get_images() 获取每页的图像,并使用 extract_image() 提取图像数据。提取出的图像会被保存在临时文件中,之后可以使用 insert_image() 将图片插入到新 PDF 页面中。
  • 创建新的 PDF 页面:为每页创建新的页面,并将文本和图像插入到这些页面中。
  • 保存新 PDF:使用 new_pdf_document.save() 方法将新的 PDF 保存为文件。

4. 输出

  • 新生成的 PDF 文件将包含原始 PDF 中的文本和图像,且这些内容将按原始顺序排列。

注意事项:

  1. 图片位置:图像插入位置可以根据需要调整,上述示例中将图片插入到页面的指定位置 (100, 100)。如果需要更精确的定位,可以调整 img_rect
  2. 文本格式insert_text() 只是简单地将文本插入页面。若需要保留原始格式(如字体、大小等),可以考虑其他方法来更复杂地重建页面布局。
  3. 图片大小:通过调整 insert_image() 的矩形区域,可以设置插入图片的大小。

此代码可以将原 PDF 文件中的文本和图片按顺序提取并重新创建成一个新的 PDF 文件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计SpringBoot+Vue.js墙绘产品展示交易平台(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

springboot005学生心理咨询评估系统(源码+数据库+文档)

源码地址:学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表(含论文)后台运行截图 1.项目简介 ​ 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了,把现…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机 前言一、使用命令行(nmcli 命令)配置网络,配置主机名第一步第二步修改主机名称 二、使用图形化界面(nmtui 命令)配…

【运维】内网服务器借助通过某台可上外网的服务器实现公网访问

背景: 内网服务器无法连接公网,但是办公电脑可以连接内网服务器又可以连接公网。 安装软件 1、frp 2、ccproxy 配置 1、内网服务器 # 内网服务器启动frp服务配置文件参考vi frps.ini# frps.ini [common] bind_port 7000# 备注: bind_port端口可以随意配置。配置完…

Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强

简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想&#xff0c…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类,供MVC模式、前后端分离模式下的后台服务使用,以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式,包括状态码、返回消息、返回数据等&#x…

【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程

本小节学习建议:掌握Python编程、统计学(时间序列分析)、金融学基础(资产定价理论)三者结合,是进入量化领域的核心路径。 👉 点击关注不迷路 👉 点击关注不迷路 文章目录 1.1 量化金…

STM32的HAL库开发---单通道ADC采集(DMA读取)实验

一、实验简介 正常单通道ADC采集顺序是先开启ADC采集,然后等待ADC转换完成,也就是判断EOC位置1,然后再读取数据寄存器的值。 如果配置了DMA功能,在EOC位被硬件置1后,自动产生DMA请求,然后DMA进行数据搬运…

eclogy后台运维笔记(写的很乱,只限个人观看)

组织权限: 矩阵管理 这个很重要,比如进行流程操作者的选择时,我们进行需要选择财务部的出纳,会计,总经理。我们不能去直接选定一个人,万一这个人离职了,那所有的流程都要手动修改,…

【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch

ping:检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat:查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…

自定义Spring Boot Starter(官网文档解读)

摘要 本文将详细介绍自定义 Spring Boot Starter 的完整过程。要构建自定义 Starter,首先需掌握 Spring Boot 中 Auto-configuration 以及相关注解的工作原理,同时了解 Spring Boot 提供的一系列条件注解。在具备这些知识基础后,再按照特定步…

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…

我的技术十年

前言 十年一瞬,2014 年毕业至今,刚好十年。《异类》一书曾提到“一万小时定律”,要成为某个领域的专家,需要 10000 小时,按比例计算就是:如果你每天工作八小时,一周工作五天,那么成…

kotlin 知识点一 变量和函数

在Kotlin中定义变量的方式和Java 区别很大,在Java 中如果想要定义一个变 量,需要在变量前面声明这个变量的类型,比如说int a表示a是一个整型变量,String b表 示b是一个字符串变量。而Kotlin中定义一个变量,只允许在变量…

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 原先我的思路是图像上的思路,但是我感觉还是很复杂…

智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新

智能交通系统(Intelligent Transportation Systems, ITS)是利用先进的信息技术、通信技术、传感技术、计算机技术以及自动化技术等,来提升交通系统效率和安全性的一种交通管理方式。ITS通过收集和分析交通数据,智能化地调度、控制…

数据结构:Map set - 习题(三)

一、只出现一次的数字 题目链接https://leetcode.cn/problems/single-number/description/ 描述: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性…

【射频仿真学习笔记】Cadence的Layout EXL与ADS dynamic link联动后仿

一、EXL仿真 1. 绘制教程 当我们使用EMX仿真提取的时候,会遇到各种各样的问题,很不方便。这里我们介绍一种新的方法——EXL。可以更灵活的跑仿真。我们以带有中和电容的差分电路为例进行介绍 在使用EMX的是偶,port是连不到晶体管外围金属上…

C++——list模拟实现

目录 前言 一、list的结构 二、默认成员函数 构造函数 析构函数 clear 拷贝构造 赋值重载 swap 三、容量相关 empty size 四、数据访问 front/back 五、普通迭代器 begin/end 六、const迭代器 begin/end 七、插入数据 insert push_back push_front 八、…