当前位置: 首页 > 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文件的结构操作,如合并和拆分。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电子电气架构 --- SOVD在域控制器的应用
  • 缓存一致性问题
  • tcpdump使用指南
  • 前端的学习-CSS(二)-弹性盒子-flex
  • 在C#中为图片添加数字水印的几种办法
  • Xinstall全链路数据统计,助力推广者破解社交分享难题
  • 汇昌联信数字做拼多多运营怎么入行?
  • Python面试题:结合Python技术,如何使用TensorFlow进行深度学习模型训练与部署
  • 计算机网络知识点汇总第一章:概述
  • C语言实现希尔排序和堆排序
  • CDH清理磁盘空间完全攻略和完整实现自动化脚本(大数据清除日志)
  • 【Unity】3D功能开发入门系列(一)
  • 【课程系列07】某乎AI大模型全栈工程师-第7期
  • 手写chatGPT——fetch解析text/event-stream会话流并逐字回显到页面——js技能提升
  • 【C++BFS算法】2998. 使 X 和 Y 相等的最少操作次数
  • CODING 缺陷管理功能正式开始公测
  • CSS 专业技巧
  • IOS评论框不贴底(ios12新bug)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • vue 配置sass、scss全局变量
  • 动态魔术使用DBMS_SQL
  • 读懂package.json -- 依赖管理
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 使用Swoole加速Laravel(正式环境中)
  • 学习HTTP相关知识笔记
  • 用element的upload组件实现多图片上传和压缩
  • 在electron中实现跨域请求,无需更改服务器端设置
  • - 转 Ext2.0 form使用实例
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​插件化DPI在商用WIFI中的价值
  • ​人工智能书单(数学基础篇)
  • ​如何防止网络攻击?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # C++之functional库用法整理
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #1015 : KMP算法
  • #vue3 实现前端下载excel文件模板功能
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (十一)手动添加用户和文件的特殊权限
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (一)VirtualBox安装增强功能
  • (一)基于IDEA的JAVA基础1
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)Linux下编译安装log4cxx
  • (转)ObjectiveC 深浅拷贝学习
  • (转)大道至简,职场上做人做事做管理
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统