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

相关推荐
a程序小傲11 分钟前
字节跳动Java面试被问:Fork/Join框架的使用场景
开发语言·python
老歌老听老掉牙19 分钟前
基于参数化模型的砂轮轮廓建模与可视化
python·数学建模
秋邱27 分钟前
Java匿名内部类的使用场景:从语法本质到实战优化全解析
android·java·开发语言·数据库·python
kimi-22228 分钟前
Transformer 模型中位置编码(Positional Encoding, PE)
pytorch·python·transformer
Irene199131 分钟前
文档加密加水印只读分享:WPS/PPT编辑后导出PDF(附:百度网盘分享流程)
pdf·加密·wps·pptx·只读
reasonsummer34 分钟前
【教学类-89-02】20251229新年篇11—— 马年红包(Python图片)
python·通义万相
Mqh18076234 分钟前
day53 预训练模型CBAM注意力
python
程序员佳佳34 分钟前
【硬核实测】GPT-5.2-Pro 对决 Gemini-3-Pro (Banana Pro):开发者如何低成本接入下一代 AI 模型?附 Python 源码
人工智能·python·gpt·chatgpt·ai作画·midjourney·ai编程
努力变大白39 分钟前
Python多指标综合评价及预测方法实战:CRITIC法+熵权法+TOPSIS+博弈论组合赋权综合评价预测全流程解析
开发语言·python
非自律懒癌患者44 分钟前
‘module1 is module2‘ VS ‘module1 == module2‘
python·深度学习·计算机视觉