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

news/2025/2/26 22:59:22

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

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

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

1. 安装必要的库

你需要安装以下库:

pip install PyMuPDF pdfplumber Pillow

2. 代码示例

提取 PDF 中的文本

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

python">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 中的图像。下面是一个提取图像的示例:

python">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 文件中。

python">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 文件。


http://www.niftyadmin.cn/n/5869251.html

相关文章

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…

在 Windows 上配置 Ollama 服务并开放局域网访问

为了在局域网内共享 Ollama 服务,我们需要完成以下两步: 1、设置 Ollama 的环境变量 OLLAMA_HOST,使其监听局域网的 IP 地址。 (1) 配置 Ollama 服务的监听地址 Ollama 服务使用环境变量 OLLAMA_HOST 来指定监听的地…

elementPlus 中表单验证方法(手机号、正整数、邮箱)

1、手机号验证 <el-form ref"formRef" :model"form" :rules"rule" label-width"100px"><el-form-item label"联系电话" prop"mobile"><el-input type"tel" v-model"form.mobile&q…

服务端获取远程ip的方法

在业务系统中&#xff0c;通常需要获取用户的真实ip地址对用户进行分析&#xff0c;nginx配置需要有相关的配置才行 1、nginx配置 #server模块配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; prox…

数据保护API(DPAPI)深度剖析与安全实践

Windows DPAPI 安全机制解析 在当今数据泄露与网络攻击日益频繁的背景下&#xff0c;Windows 提供的 DPAPI&#xff08;Data Protection API&#xff09;成为开发者保护本地敏感数据的重要工具。本文将从 双层密钥体系、加密流程、跨上下文加密、已知攻击向量与防御措施、企业…

【前端】【面试】【功能函数】写一个JavaScript树形结构操作函数:`filter` 与 `forEach`

写一个JavaScript树形结构操作函数&#xff1a;filter 与 forEach 在JavaScript开发中&#xff0c;处理树形结构数据是一项常见的任务。本文将详细介绍两个用于操作树形结构数据的函数&#xff1a;filter 和 forEach&#xff0c;包括它们的功能、使用方法以及具体示例。 1. f…

ubuntu-server 安装 navidia 显卡驱动

资料 https://juejin.cn/post/7362562720708280332 过程 ubuntu-drivers devices 选择ubuntu-server安装 rootroot:~# ubuntu-drivers devices udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwdb is deprecated. Use systemd-hwdb instead. udevadm hwd…

水利工程安全包括哪几个方面

水利工程安全培训的内容主要包括以下几个方面&#xff1a; 基础知识和技能培训 &#xff1a; 法律法规 &#xff1a;学习水利工程相关的安全生产法律法规&#xff0c;了解安全生产标准及规范。 事故案例 &#xff1a;通过分析事故案例&#xff0c;了解事故原因和教训&#x…