PDF解析--PyMuPDF (python 文档解析提取)

1.介绍

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

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

2. 基本操作

获取PDF的文档基本信息

# -*- 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文档中的文本

# -*- 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文档中的图片

# -*- 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文档中的表格

# -*- 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 文档 分割

# -*- 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()

借助大模型进行文档问答

# -*- 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3568 学习笔记 : u-boot 下通过设置 env ethact 设置当前工作的以太网设备

前言 正点原子 :RK3568 开发板 atompi-ca1 默认有两个网口,通过 u-boot mii 命令,可以查看 网口信息 > mii device MII devices: ethernetfe010000 ethernetfe2a0000 Current device: ethernetfe010000u-boot 下的以太网,不同…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试(Unit Testing)和 e2e 测试(End-to-End Testing,端到端测试,简称 e2e 测试),这是我第一次给后端项目写测试,发现和之前给前端项目写测试还…

UDP 的报文结构

一.UDP的报文结构 1.UDP的简单介绍 UDP是传输层协议,它是无连接,不可靠传输,面向数据报,全双工 1.无连接:UDP是一种无连接的传输协议,通信双方不需要在发送数据之前建立连接。相比之下,TCP是面向连接的协议,在传输数…

【除了协程还有哪些方式可以实现异步编程】

在Unity中,除了使用协程实现异步编程外,还有以下几种方法: 异步加载资源: 使用UnityWebRequest类进行异步加载资源,这在加载网络资源或动态加载资源时非常有用。 using UnityEngine; using UnityEngine.Networking;…

【Linux】进程控制 之 进程创建 进程终止 进程等待 进程替换

👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:Linux 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵,希望大佬指点一二 如果文章对…

每日一博 - 闲聊架构设计中的多级缓存设计

文章目录 方法论概述客户端缓存应用层缓存服务层缓存缓存设计的注意事项总结 思维导图戳这里 方法论概述 从客户端到服务层,缓存的应用广泛而重要。通过合理的缓存设计,能够有效地提高系统的性能并降低延迟。 客户端缓存 在客户端层面,浏览…

LLM2Vec介绍和将Llama 3转换为嵌入模型代码示例

嵌入模型是大型语言模型检索增强生成(RAG)的关键组成部分。它们对知识库和用户编写的查询进行编码。 使用与LLM相同领域的训练或微调的嵌入模型可以显著改进RAG系统。然而,寻找或训练这样的嵌入模型往往是一项困难的任务,因为领域内的数据通常是稀缺的。…

基于AT89C51单片机的温度上下限自动控制检报警设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89247694?spm=1001.2014.3001.5501 C 源码+仿真图+毕业设计+实物制作步骤+06 题 目 基于单片机的温度检测调节系统设计 姓 名 学 号 专业班级 指导教师 年 月 日 任务书 …

Nginx 从入门到实践(2)——Rewrite重写

Nginx Rewrite Rewrite重写 Nginx Rewriteurl组成说明Rewrite基本概述Rewrite使⽤场景rewrite优点 Rewrite配置语法location匹配概述 if指令if 判断指令语法nginx以及if 判断可使用的全局变量 set命令return指令 url组成说明 https://cn.bing.com/search?qNginxRewrite&P…

udp/tcp回显网络编程

udp DatagramSocket 用于接收和发送udp数据报 构造方法: DatagramSocket():创建一个UDP数据报套接字的Socket,绑定到本地上 一个随机可用端口上,一般用于客户端DatagramSocket(int port):创建一个UDP数据报套接字的Socket,绑定到…

Proxmox VE 8 用SDN隔离用户网络

作者:田逸(formyz) 最新发布的Proxmox VE(以下简称PVE) 8在Web管理后台集成了易于操作的SDN(软件定义网络)功能插件,其实质是对不同的PVE用户指定不同的网络,进行逻辑隔离…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 4

第十三章 车联网 数字化设备正变得越来越普遍并且相互联系。这些设备向数字生态系统智能部分的演进创造了迄今为止尚未解决安全问题的新颖应用。一个特定的例子是车辆,随着车辆从简单的交通方式发展到具有新的感知和通讯功能的智能实体,就成为智能城市的…

屏蔽罩材质和厚度对屏蔽效能的影响

​ 一.屏蔽效能的影响因素 屏蔽效能的影响因素主要有两个方面:屏蔽材料的特性和厚度;如下图所示,电磁波经过不同媒介时,会在分界面形成反射,穿过界面的电磁波一部分被反射回去,这部分能量损失…

偶然发现了Python的一个BUG。。。

一般情况下,dict(id1, **{id: 1})这句代码应该报TypeError。但如果在捕获了其他异常的情况下,再来执行这句代码,却是会报KeyError,如下图: Python3.10和Python3.9也能复现该情况,正当我摩拳踩掌&#xff0c…

百度下拉框负面信息如何删除?

百度头条360等搜索引擎,作为人们获取信息的主要途径之一。然而,一些知名的企业或个人可能会面临在搜索的下拉框中出现负面信息的问题,这可能对其声誉和形象造成不良影响。小马识途营销顾问根据自身从业经验,针对这类情况提出以下建…

【精品毕设推荐】基于JSP物流信息网的设计与实现

点击免费下载原文及代码、PPT 摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发,使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主…

LeetCode 234.回文链表

题目描述 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: 输入&#xff…

解决windows中的WSL Ubuntu子系统忘记root密码和用户密码问题

1、以管理员身份运行PowerShell 2、在powershell中执行wsl.exe --user root wsl.exe --user root如果出现了上面的报错,则需要运行步骤3、4,然后在执行步骤5改密码,如果没有出错,请直接跳到第5步改密码操作!&#xff…

一分钱不花从HTTP升级到HTTPS

HTTP升级到HTTPS是一个涉及安全性和技术实施的过程,主要目的是为了提升网站数据传输的安全性,防止数据被窃取或篡改。以下是一些关于从HTTP升级到HTTPS的技术性要点和步骤概述,结合上述信息资源: 一、理解HTTPS的重要性 HTTPS (…

微信IDE vscode插件:获取插件位置,并打开文件

背景 有没有觉得在微信开发工具里面添加一些插件可以很方便。因为微信IDE的编辑本身是依赖vscode开发,所以编写vscode插件自然可以在微信IDE使用。这样做好处就是可以满足到自己一些开发使用习惯。 1.获取插件的目录位置 那么如何获取插件里面的目录,…
最新文章