在数据处理和分析领域,PDF 文件常常包含丰富的文本、表格和图形信息。然而,从 PDF 中提取这些数据并非易事,尤其是当需要保留格式和颜色信息时。幸运的是,Python 社区提供了多个强大的库来帮助我们完成这项任务,其中最常用的两个库是 PyMuPDFpdfplumber。本文将详细介绍这两个库的特点、使用方法,并通过实际案例对比它们的优缺点。

一、PyMuPDF 和 pdfplumber 简介

1. PyMuPDF (fitz)

PyMuPDF 是一个基于 MuPDF 的高性能 Python 库,用于处理 PDF 文件。它支持多种功能,包括文本提取、图像提取、表格提取、页面渲染等。PyMuPDF 的底层是用 C++ 编写的,因此在处理大型文件时表现出色。

2. pdfplumber

pdfplumber 是一个基于 pdfminer.six 的 Python 库,专注于从 PDF 文件中提取文本、表格和图像。它提供了简单直观的 API,适合需要精确文本位置和表格提取的场景。

二、安装方法

PyMuPDF

pip install pymupdf

PyMuPDF 支持 Python 3.8 及以上版本。

pdfplumber

pip install pdfplumber

pdfplumber 适合 Python 3.8、3.9、3.10 和 3.11。

三、功能对比

1. 文本提取

  • PyMuPDF:支持多种文本提取格式,包括纯文本、HTML、JSON 和 XML。
  • pdfplumber:提取文本时保留原始布局,支持自定义提取参数,如 x_tolerancey_tolerance

2. 表格提取

  • PyMuPDF:可以提取表格结构,但需要手动解析 JSON 或字典格式。
  • pdfplumber:提供了更直观的表格提取方法,支持直接将表格数据转换为 Pandas DataFrame。

3. 图像提取

  • PyMuPDF:支持提取页面中的所有图像,并可以将页面渲染为图像。
  • pdfplumber:支持提取图像,但功能相对有限。

4. 性能

  • PyMuPDF:处理速度更快,适合处理大型 PDF 文件。
  • pdfplumber:在提取文本和表格时速度较慢,但提取精度更高。

四、实战案例

1. 提取文本

PyMuPDF
import fitz  # PyMuPDFdef extract_text_from_pdf(file_path, output_path):doc = fitz.open(file_path)full_text = ""for page in doc:full_text += page.get_text()doc.close()with open(output_path, "w", encoding="utf-8") as file:file.write(full_text)return f"文本已保存到 {output_path}"result = extract_text_from_pdf("example.pdf", "output.txt")
print(result)
pdfplumber
import pdfplumberwith pdfplumber.open("example.pdf") as pdf:first_page = pdf.pages[0]text = first_page.extract_text()print(text)

2. 提取表格

PyMuPDF
import fitz  # PyMuPDFdoc = fitz.open("example.pdf")
page = doc[0]
table_data = page.get_text("dict")
print(table_data)
pdfplumber
import pdfplumber
import pandas as pdwith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]table = page.extract_table()df = pd.DataFrame(table[1:], columns=table[0])print(df)

3. 提取图像

PyMuPDF
import fitz  # PyMuPDFdoc = fitz.open("example.pdf")
page = doc[0]
for img_index, img in enumerate(page.get_images(full=True)):xref = img[0]base_image = doc.extract_image(xref)img_bytes = base_image["image"]with open(f"page_{page.number+1}_img_{img_index+1}.png", "wb") as f:f.write(img_bytes)
pdfplumber
import pdfplumberwith pdfplumber.open("example.pdf") as pdf:page = pdf.pages[0]for img in page.images:x0, y0, x1, y1 = img["x0"], img["y0"], img["x1"], img["y1"]im = page.to_image().originalcropped_im = im.crop((x0, y0, x1, y1))cropped_im.save(f"page_{page.page_number}_img_{img['object_type']}.png")

五、总结与推荐

1. PyMuPDF

  • 优点:高性能、功能全面,支持多种格式提取。
  • 缺点:API 较复杂,文档相对较少。
  • 适用场景:适合处理大型 PDF 文件,需要提取多种格式数据。

2. pdfplumber

  • 优点:API 简单直观,提取精度高,适合文本和表格提取。
  • 缺点:性能稍弱,图像提取功能有限。
  • 适用场景:适合需要精确提取文本和表格的场景。

推荐

  • 如果你需要高效处理大型 PDF 文件,并且需要提取多种格式数据,推荐使用 PyMuPDF
  • 如果你需要精确提取文本和表格,并且对提取精度要求较高,推荐使用 pdfplumber

通过本文的介绍,希望你对这两个库有了更深入的了解,并能够根据自己的需求选择合适的工具。无论是 PyMuPDF 还是 pdfplumber,它们都能为你的 PDF 数据提取任务提供强大的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot注册过滤器的三种方式(Order 排序)

一、使用 Component Order(简单但不够灵活) 适用于全局过滤器,无需手动注册,Spring Boot 会自动扫描并注册。 Component Order(1) // 数字越小,优先级越高 public class AuthFilter implements Filter {Autowired /…

电脑硬件详解

前几天我的风扇转的很快,而且cpu占用率很高,然后我在想怎么回事,然后就浅浅研究了一下电脑的硬件。 笔记本主板: 台式机主板: 图1: 图2: 电脑硬件详解 电脑的硬件是组成计算机系统的物理设…

力扣47:全排列Ⅱ

力扣47:全排列Ⅱ题目思路代码题目 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 思路 又是任意顺序和所有不重复的排列,显而易见我们要使用回溯的办法。 首先是回溯的结束条件即新数组的长度等于nums的长度。这道题的难点…

学习笔记091——如何实现web登录时,密码复杂度校验?(后端)

1、创建工具类 /*** 密码复杂度校验* param password 密码*/ public static void validatePassword(String password) {// 至少8位if (password.length() < 8) {throw new IllegalArgumentException("密码长度至少为8位");}// 包含大小写字母if (!password.matche…

雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论

一、前言在日趋复杂的分布式系统中&#xff0c;数据量越来越大&#xff0c;数据库分库分表是一贯的垂直水平做法&#xff0c;但是需要一个全局唯一ID标识一条数据或者MQ消息&#xff0c;数据库id自增就显然不能满足要求了。因为场景不同&#xff0c;分布式ID需要满足以下几个条…

【PCB设计经验】去耦电容如何布局?

0805 和 0603 以及更小 封装的电容用作于对中高频的去耦,其摆放位置是有要求的: 一、建议尽可能的靠近主控芯片的 电源管脚放置。 二、使用较宽和短的引线连接到电源和地过孔可以采用如下 图 4–1 中的图 ( 2 )、( 3)、 ( 4 )任意一种方式,避免使用长线或者较细的…

自动化运维实验

目录 一、实验拓扑 二、实验目的 三、实验步骤 实验思路&#xff1a; 代码部分&#xff1a; 四、实验结果&#xff1a; 一、实验拓扑 二、实验目的 利用python脚本&#xff0c;在本地&#xff0c;或者虚拟机里实现&#xff0c;设备CRC数量统计&#xff0c;并输出成表格 三、实验…

Wed前端第二次作业

一、作业1&#xff1a;完成自己学校的官网&#xff0c;动忘内容直接贴&#xff0c;至少三个不同的页面1、界面1&#xff08;1&#xff09;相关代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

第5节 大模型分布式推理通信优化与硬件协同

前言 在分布式推理中,多设备(如GPU、CPU)之间的数据传输(通信)是连接计算的“桥梁”。如果通信效率低下,即使单设备计算能力再强,整体性能也会大打折扣。想象一下:如果工厂之间的物流卡车跑得比生产速度还慢,再多的工厂也无法提高整体产量。 本节将从最基础的单设备内…

XGBoost 的适用场景以及与 CNN、LSTM 的区别

XGBoost 的核心优势与适用场景XGBoost 是一种梯度提升决策树算法&#xff0c;属于集成学习方法。它在处理结构化/表格化数据方面表现极其出色&#xff0c;是 Kaggle 竞赛和工业界广泛应用的“冠军”模型。其核心优势和应用场景包括&#xff1a;1. 结构化/表格化数据数据形式&a…

快速设计简单嵌入式操作系统(3):动手实操,基于STC8编写单任务执行程序,感悟MCU指令的执行过程

引言 前面我们陆续学习了操作系统常见的基础概念&#xff0c;接着简单了解了一下8051单片机的内存结构和执行顺序切换的相关概念。接下来&#xff0c;我们就开始进行实操&#xff0c;基于8051单片机STC8来编写一个简单的操作系统&#xff0c;这里我们先实现一个单任务的执行程…

Spring AI Alibaba - 聊天机器人快速上手

本节对应 Github&#xff1a;https://github.com/JCodeNest/JCodeNest-AI-Alibaba/tree/master/spring-ai-alibaba-helloworld 本文将以阿里巴巴的通义大模型为例&#xff0c;通过 Spring AI Alibaba 组件&#xff0c;手把手带你完成从零到一的构建过程&#xff1a;首先&#…

串口通信学习

不需要校验位就选8位&#xff0c;需要校验位就选9位&#xff01;USRTUSART框图STM32的外设引脚这是USART的基本结构。数据帧&#xff0c;八位是这个公式还是很重要的&#xff01;如果在编辑器里面使用printf打印汉字的话&#xff0c;会出现乱码的话&#xff0c;前提是你的编码格…

面试经典150题[001]:合并两个有序数组(LeetCode 88)

合并两个有序数组&#xff08;LeetCode 88&#xff09; https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1. 题目背景 你有两个已经排好序的数组&#xff1a; nums1&#xff1a;前面是有效数字&#xff0c;后面是空位&…

快速安装达梦8测试库

计划&#xff1a;数据库名实例名PORT_NUMMAL_INST_DW_PORTMAL_HOSTMAL_PORTMAL_DW_PORTDMDWDBINST_1533615101192.168.207.612510135101*****[2025-08-11 15:14:34]***** Last login: Fri Jul 25 17:36:04 2025 from 192.168.88.48 [rootdm01 ~]# ip a 1: lo: <LOOPBACK,UP,…

Hive中优化问题

一、小文件合并优化Hive中的小文件分为Map端的小文件和Reduce端的小文件。(1)、Map端的小文件优化是通过CombineHiveInputFormat操作。相关的参数是&#xff1a;set hive.input.formatorg.apache.hadoop.hive.ql.io.CombineHiveInputFormat;(2)、Reduce端的小文件合并Map端的小…

tlias智能学习辅助系统--Maven高级-继承

目录 一、打包方式与应用场景 二、父子工程继承关系 1. 父工程配置 2. 子工程配置 三、自定义属性与引用属性 1. 定义属性 2. 在 dependencyManagement 中引用 3. 子工程中引用 四、dependencyManagement 与 dependencies 的区别 五、项目结构示例 六、小结 在实际开…

把 AI 押进“小黑屋”——基于 LLM 的隐私对话沙盒设计与落地

标签&#xff1a;隐私计算、可信执行环境、LLM、沙盒、内存加密、TEE、SGX、Gramine ---- 1. 背景&#xff1a;甲方爸爸一句话&#xff0c;“数据不能出机房” 我们给某三甲医院做智能问诊助手&#xff0c;模型 70 B、知识库 300 GB。 甲方只给了两条铁律&#xff1a; 1. 患者…

Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用(394)

Java 大视界 -- Java 大数据在智能教育学习效果评估指标体系构建与精准评估中的应用&#xff08;394&#xff09;引言&#xff1a;正文&#xff1a;一、传统学习评估的 “数字陷阱”&#xff1a;看不全、说不清、跟不上1.1 评估维度的 “单行道”1.1.1 分数掩盖的 “学习真相”…

Dubbo 3.x源码(33)—Dubbo Consumer接收服务调用响应

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo Consumer接收服务调用响应 此前我们学习了Dubbo Provider处理服务调用请求的流程&#xff0c;现在我们来学习Dubbo Consumer接收服务调用响应流程。 实际上接收请求和接收响应同属于接收消息&#xff0c;它们的流程的很多步骤是一样…