pdf 文件版面分析--PyMuPDF (python 文档解析提取)

1.介绍

PyMuPDF 和Fitz 是用于Python中处理PDF文件的相关模块。Fitz是P有MuPDF的字模块。提供一个简化和封装版本的P有MuPDF功能。

关系:
  • PyMuPDF: 提供广泛的功能,用于操作PDF文档, 包括方便的高级函数与底层操作
  • Fitz :简化和封装了PyMuPDF的功能,使在python中处理PDF文件更加简单

2. 基本操作

获取PDF的文档基本信息

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import fitz

pdf_path = 'rag_datas/text.pdf'
doc = fitz.open(pdf_path) # 文件加载

# basic PDF info
title = doc.metadata['title']
author= doc.metadata['author']# 文档作者
create_data= doc.metadata['creationDate']   # 文档创建时间
num_pages = doc.page_count # 文档页数
page = doc.load_page(0) # 第一页
page_height = page.bound().height 
page_width = page.bound().width

获取pdf文档中的文本

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import fitz

pdf_path = 'rag_datas/text.pdf'
doc = fitz.open(pdf_path) # 文件加载
num_pages = doc.page_count # 文档页数

# Text info of pdf
for page_index in range(num_pages ):
	page = doc.load_page(page_index)# 获取页面内容
	text = page.get_text()# 获取页面文本
	print(f"第{page_index + 1} 页的文本内容为:\n{text }\n")

获取pdf文档中的图片

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import fitz

pdf_path = 'rag_datas/text.pdf'
doc = fitz.open(pdf_path) # 文件加载
num_pages = doc.page_count # 文档页数

# Image info of pdf
for page_index in range(num_pages ):
	page = doc.load_page(page_index)# 获取页面内容
	image_list = page.get_images()# 获取页面图片
	print(image_list) # 图片基本信息
	for img in image_list:
		xref = img[0]
		pix = fitz.Pixmap(doc, xref)
		print(pix.colorspace, '-->', fitz.csRGB)
		img_path f'../output/image{page_index + 1}_{xref}.png'
		pix.save(img_path )

获取pdf文档中的表格

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import fitz

pdf_path = 'rag_datas/text.pdf'
doc = fitz.open(pdf_path) # 文件加载
num_pages = doc.page_count # 文档页数

# tables info of pdf
for page_index in range(num_pages ):
	page = doc.load_page(page_index)# 获取页面内容
	tables = page.find_tables()# 获取页面表格
	print(f"tables: "{tables})
	# 提取的表格数据将会保存为csv格式文件
	for i, table in enumerate(tables):
		df = tables[0].to_pandas()
		print(df.head())
		df.to_csv(f"../output/table_pd_{page_index}_{i+1}.csv", index=False)	

获取pdf 文档 分割

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import fitz

pdf_path = 'rag_datas/text.pdf'
doc = fitz.open(pdf_path) # 文件加载
num_pages = doc.page_count # 文档页数
# 构建输出文件名,以页数命名
# 
for i in range(1, num_pages ):
	print(f"i"{i}")
	# 创建一个新的Document对象,包含当前页面
	new_pdf = fitz.open()
	new_pdf.insert_pdf(pdf_document. from_page=i-1, to_page=i)
	# 保存单独的PDF文件
	new_pdf.save(output_pdf.format(i))
	new_pdf.close()
    pdf_document.close()

借助大模型进行文档问答

python 复制代码
# -*- coding: utf-8 -*-
# PyMuPDF==1.23.26
import os
import fitz
from openai import OpenAI

def get_pdf_content(pdf_path:str)-> str:
	doc = fitz.open(pdf_path)
	num_pages = doc.page_count
	bg_content_list = []
	#Full Text of PDF
	for page_index in range(num_pages):
		page = doc.load_page(page_index)
		text = page.get_text()
		bg_content_list.append(text)
	return ''.join(bg_content_list)

def get_answer(pdf_content: str, query:str) -> str:
	client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
	response = clinet.chat.completions.create(
					model = "gpt-3.5-turbo",
					messages=[
						{"role":"system","content":"You are a helpful assistant."},
						{"role":"user","content":"f"The full text of PDF file is : {pdf_content}"},
						{"role":"user","content":query}
						],
					max_tokens=1000
				)
	answer = response.choices[0].message.content
	return answer

if __name__=="__main__":
    content = get_pdf_content("rag_datas/text.pdf")
    query_1 = '蚂蚁集团发布的大模型叫什么?'
    print(get_answer(pdf_content = content, query=query_1 ))
	
	query_2 = '混元大模型是什么时候发布的?'
    print(get_answer(pdf_content = content, query=query_2 ))

参考:
版面分析--PDF解析神器PyMuPDF

github: https://github.com/pymupdf/PyMuPDF

官方文档:https://pymupdf.readthedocs.io/en/latest/tutorial.html

相关推荐
原来是猿5 小时前
博客系统自动化测试实战总结
python
小江的记录本6 小时前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
大数据魔法师6 小时前
Streamlit(十三)- API 参考文档(六)- 媒体展示组件
python·web
爱写代码的倒霉蛋6 小时前
Hello-Agents的第一个练习-5分钟实现一个智能体(实现详解)
python
金銀銅鐵6 小时前
[Java] 用图形化界面演示 iadd, isub, iconst_<i> 指令的效果
java·后端·python
春日见7 小时前
五分钟入门 强化学习---DQN(Deep Q Net)算法与实现
人工智能·python·深度学习·算法·microsoft·机器学习
SomeOtherTime7 小时前
Geojson相关(AI回答)
java·前端·python
weelinking7 小时前
【产品】11_实现后端接口——数据在背后如何流动
java·人工智能·python·sql·oracle·json·ai编程
Dxy12393102167 小时前
三种方式避坑:案例 + 解决方法
python·mysql
moMo7 小时前
Python 的 dict 和 set —— 有无value的区别
python