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

【Python】常用的pdf提取库介绍对比

        提取PDF内容的Python库有多种选择,每个库都有其独特的优缺点。以下是一些常用的库以及它们的优缺点和示例代码:

  1. pdfplumber
  2. PyMuPDF (fitz)
  3. PyPDF2
  4. PDFMiner
  5. Camelot

1. pdfplumber

优点

  • 易于使用,提供简单直观的API。
  • 能提取文本、表格和图像。
  • 提供对文本进行后处理的工具,如文字搜索、行识别等。
  • 支持多页PDF文件。

缺点

  • 对于复杂的PDF文件,提取效果可能不如其他库。
  • 速度相对较慢。

示例代码

假设我们有一个PDF文件 example.pdf,内容包括文本和表格。

import pdfplumber
import pandas as pdpdf_path = 'example.pdf'
data = []with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text = page.extract_text()if text:print(f"Page {page.page_number}:")print(text)# Extract tablestables = page.extract_tables()for table in tables:df = pd.DataFrame(table[1:], columns=table[0])data.append(df)print(df)# Combine all tables into a single DataFrame
if data:all_tables = pd.concat(data)print("All extracted tables:")print(all_tables)

 

2. PyMuPDF (fitz)

优点

  • 性能高,速度快。
  • 支持文本、图像、注释等多种元素的提取。
  • 提供PDF文档的修改和操作功能,如添加文本、图像、注释等。

缺点

  • 文档和示例较少。
  • 对于新手来说,可能有点复杂。

示例代码

import fitz  # PyMuPDFpdf_path = 'example.pdf'
document = fitz.open(pdf_path)for page_num in range(document.page_count):page = document.load_page(page_num)text = page.get_text()print(f"Page {page_num + 1}:")print(text)# Extract imagesfor img in page.get_images():xref = img[0]base_image = document.extract_image(xref)image_bytes = base_image["image"]with open(f"image_{page_num + 1}_{xref}.png", "wb") as image_file:image_file.write(image_bytes)print(f"Extracted image from page {page_num + 1}, image reference {xref}")

 

3. PyPDF2

优点

  • 易于合并、拆分、旋转PDF文件。
  • 轻量级,依赖少。
  • 支持加密和解密PDF文件。

缺点

  • 对于文本提取和处理的支持较弱。
  • 不支持图像提取。

示例代码

import PyPDF2pdf_path = 'example.pdf'
with open(pdf_path, 'rb') as file:reader = PyPDF2.PdfFileReader(file)for page_num in range(reader.numPages):page = reader.getPage(page_num)text = page.extract_text()print(f"Page {page_num + 1}:")print(text)# Example: Merging two PDFs
merger = PyPDF2.PdfFileMerger()
merger.append('example1.pdf')
merger.append('example2.pdf')
merger.write('merged.pdf')
merger.close()# Example: Splitting a PDF
input_pdf = PyPDF2.PdfFileReader('example.pdf')
output_pdf = PyPDF2.PdfFileWriter()
for page_num in range(input_pdf.numPages // 2):output_pdf.addPage(input_pdf.getPage(page_num))
with open('split.pdf', 'wb') as output_file:output_pdf.write(output_file)

 

4. PDFMiner

优点

  • 非常强大的文本提取功能。
  • 支持复杂的PDF结构。
  • 提供详细的PDF文档解析功能。

缺点

  • 相对复杂,不易上手。
  • 速度较慢。

示例代码

 
from pdfminer.high_level import extract_text
from pdfminer.high_level import extract_text_to_fp
import iopdf_path = 'example.pdf'# Extract text to a string
text = extract_text(pdf_path)
print(text)# Extract text to a file-like object
output_string = io.StringIO()
with open(pdf_path, 'rb') as file:extract_text_to_fp(file, output_string)
print(output_string.getvalue())

 

5. Camelot

优点

  • 专门用于从PDF文件中提取表格。
  • 提供了流模式和Lattice模式,处理不同类型的表格。
  • 生成的表格可以方便地转换为pandas DataFrame。

缺点

  • 只适用于表格提取,不支持其他类型的PDF内容提取。
  • 依赖于第三方工具(如Ghostscript)。

示例代码

import camelotpdf_path = 'example.pdf'
tables = camelot.read_pdf(pdf_path, flavor='stream')  # Use 'stream' for stream mode, 'lattice' for lattice modefor table in tables:print(f"Table on page {table.page}:")print(table.df)  # DataFrame of the extracted table# Save tables to a CSV file
for i, table in enumerate(tables):table.to_csv(f'table_{i}.csv')

 

总结

  • pdfplumber 是一个易于使用的库,适用于一般的PDF文本和表格提取,特别适合处理表格。
  • PyMuPDF (fitz) 性能强大且速度快,适合需要高效处理的场景,特别是需要处理图像和注释的PDF文档。
  • PyPDF2 适用于PDF文件的合并、拆分和旋转,但文本提取功能较弱,更适合处理PDF文档的结构而不是内容。
  • PDFMiner 提供了最强大的文本提取功能,适合处理复杂PDF结构,但相对复杂且慢,适合需要详细解析PDF内容的场景。
  • Camelot 专用于表格提取,适合处理PDF中的表格数据,特别是在需要将表格数据转换为结构化数据时。

选择合适的库取决于具体需求和PDF文档的复杂性。如果只是需要提取文本和表格,pdfplumberCamelot 是不错的选择。如果需要高性能处理或处理图像和注释,可以考虑 PyMuPDF (fitz)。如果需要处理复杂的PDF结构,PDFMiner 是最强大的工具。而 PyPDF2 适合处理PDF文件的结构操作,如合并和拆分。

 

相关文章:

【Python】常用的pdf提取库介绍对比

提取PDF内容的Python库有多种选择,每个库都有其独特的优缺点。以下是一些常用的库以及它们的优缺点和示例代码: pdfplumberPyMuPDF (fitz)PyPDF2PDFMinerCamelot 1. pdfplumber 优点: 易于使用,提供简单直观的API。能提取文本…...

sbatch提交并行作业 运行python程序 指定输入参数从1到100

#!/bin/bash #SBATCH --job-namemy_python_job #SBATCH --outputmy_python_job_%j.out #SBATCH --errormy_python_job_%j.err #SBATCH --ntasks100# 载入所需模块 # module load python/3.8.5# 执行Python脚本并传递任务ID作为参数 for i in {1..100}; dosrun python my_script…...

OD C卷 - 中庸行者

中庸行者 (200) 给一个m*n的整数矩阵作为地图,矩阵数值为地形的高度,选择图中任意一点作为起点,向左右上下四个方向移动: 只能上坡、下坡,不能走相同高度的点;不允许连续上坡 或者连…...

最新CSS3横向菜单的实现

横向菜单 原始代码&#xff1a; <nav class"list1"><ul><li><a href"#">Shirts</a></li><li><a href"#">Pants</a></li><li><a href"#">Dresses</a>…...

(2024,LlamaGen,Llama,自回归下一token预测,模型扩展)自回归模型优于扩散:Llama 用于可扩展图像生成

Autoregressive Model Beats Diffusion: Llama for Scalable Image Generation 目录 0. 摘要 1. 引言 2. 自回归模型在图像生成中的应用 2.1 概述 2.2 图像 tokenizer 2.3 自回归模型生成图像 2.4 规模扩展 2.5 服务 3. 实验 5. 结论 0. 摘要 我们介绍 LlamaGen&…...

重新安装操作系统的软件都有哪些?

重新安装操作系统关键步骤 重新安装操作系统通常涉及到几个关键步骤&#xff1a;创建可启动媒体、备份现有数据、安装操作系统、以及系统初始化和配置。以下是一些常用工具和软件&#xff0c;它们可以帮助你完成这些步骤&#xff1a; 创建可启动媒体 Rufus&#xff1a;用于W…...

深圳水务展|2025深圳国际水务科技博览会

2025深圳国际水务科技博览会 展会主题: 新质生产力赋能水务产业高质量发展 展会时间&#xff1a;2025年7月24-26日 展会地点&#xff1a;深圳会展中心&#xff08;福田&#xff09; 主办单位&#xff1a; 广东省水利学会 深圳市水务学会 协办单位&#xff1a; 中国水利…...

OpenAI not returning a result?

题意&#xff1a;OpenAI 没有返回结果吗&#xff1f; 问题背景&#xff1a; Im trying to use the OpenAI beta but I cant seem to get a result. Im accessing the API via an NPM package (openai-api - npm). I have that setup and working but when I make a request th…...

[Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]

场景 开发WTL/ATL/Win32程序时, 有时候需要获取系统版本号&#xff0c;以便判断用户在使用软件时的系统。在某一天突然发现获取的系统版本号是错的, 一直是版本号6.2.x,什么情况&#xff1f; 说明 如果软件没有针对Win8.1或Win10以上的系统做兼容处理&#xff0c;返回的是Wi…...

2024,Java开发在中国市场还有发展前景吗?

随着2024年的到来&#xff0c;Java作为一种经典而强大的编程语言&#xff0c;依然在中国的软件开发市场中扮演着重要角色。然而&#xff0c;许多人对Java的未来发展前景持有不同的看法。让我们来探讨一下当前情况和未来的走向。 Java程序员真的过剩了吗&#xff1f; 2023年, 各…...

gcc: string.c_str gcc-8.5的一个问题

https://en.cppreference.com/w/cpp/string/basic_string/c_str https://sourceforge.net/p/cppcheck/wiki/ListOfChecks/ common mistakes when using string::c_str()string的这个成员是返回c类型的一个字符数组指针。但是这个指针所对应的地址有赖于string对象的生命周期。所…...

一道笔试题 - 无重复字符的最长子串

老生常谈的一道题&#xff0c;常见并 文章目录 描述预期结果Java代码 描述 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的最长子串的长度。 预期结果 Java代码 import java.util.HashSet; import java.util.Set;public class Demo2 {public static void main(S…...

C#反射的NullReferenceException

背景 xml文件中有些元素的属性被删除&#xff0c;导致文件无法被读取&#xff08;C#&#xff09;。 调试之后发现&#xff0c;因为属性被删除&#xff0c;读进来会保持默认值null&#xff0c;在后续的反射中如果用这个null给字符串属性赋值&#xff0c;会抛异常。 另外发现前面…...

100道C/C++面试题

1. static的作用2. 引用与指针的区别3. .h头文件中的ifndef/define/endif 的作用4 #include<file.h>与#include"file.h"的区别?5 描述实时系统的基本特性6 全局变量和局部变量在内存中是否有区别?如果有&#xff0c;是什么区别?7 什么是平衡二叉树?8 堆栈溢…...

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…...

【八股文】Java基础篇

1. 和 equals的区别是什么&#xff1f; 判断两个变量或者实例是否都指向同一内存空间的值&#xff08;不仅值相同&#xff0c;地址也要相同&#xff09;equals是判断两个变量执行的内存空间的值是否相同&#xff08;值相同&#xff0c;地址可以不同&#xff09;&#xff0c;所…...

python rsa如何安装

Python中的一些模块是用一个包管理器来发布的&#xff0c;RSA模块就是&#xff0c;所以首先需要安装setup tools工具。 1、下载文件&#xff1a;ez_setup.py 2、安装&#xff1a; sudo python ez_setup.py 3、下载RSA安装包&#xff1a;rsa-3.1.1-py2.7.egg 4、安装RSA&…...

P10289 [GESP样题 八级] 小杨的旅游

Description 给定一棵 n n n 个点的树&#xff0c;每条边权值均为 1 1 1&#xff0c;树上有 k k k 个关键点&#xff0c;关键点们在 0 0 0 的时间内相互可达&#xff0c; q q q 次询问&#xff0c;求 s → t s\to t s→t 的最短路。 Analysis 考虑暴力建图&#xff0c;…...

网络编程 ----------- 4、组播与广播

1、广播 broadcast 广播是指向同一个网络中所有的主机传输数据只有传输层协议为 UDP协议时&#xff0c;才支持广播 TCP是端对端&#xff0c;广播是一对多 &#xff0c;所以无法符合其要求。 1&#xff09;广播地址 广播地址的计算&#xff1a; 子网掩码…...

最短路径算法:Bellman-Ford算法

引言 在图论中&#xff0c;Bellman-Ford算法是一种用于计算单源最短路径的算法。与Dijkstra算法不同&#xff0c;Bellman-Ford算法可以处理带有负权边的图&#xff0c;并且可以检测图中是否存在负权环。本文将详细介绍Bellman-Ford算法的定义、步骤及其实现。 Bellman-Ford算…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...