如何用python将pdf转换为json格式

使用 Python 将 PDF 文件转换为 JSON 格式,主要步骤如下:

  1. 读取 PDF 内容:首先使用一个库读取 PDF 文件内容,如 PyMuPDFpdfplumber。这些库可以逐页提取文本,并返回结构化的数据。

  2. 组织数据到 JSON:将提取的文本数据格式化为字典或嵌套字典,然后将其转化为 JSON 格式。

  3. 输出 JSON 文件:使用 json 库将字典保存为 JSON 文件。

以下是使用 pdfplumber 的示例代码:

import pdfplumber
import jsondef pdf_to_json(pdf_path, json_path):data = []with pdfplumber.open(pdf_path) as pdf:for i, page in enumerate(pdf.pages):text = page.extract_text()# 可以根据需要进一步解析或分段文本data.append({"page": i + 1, "text": text})# 将数据写入 JSON 文件with open(json_path, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)# 使用方法
pdf_path = "sample.pdf"
json_path = "output.json"
pdf_to_json(pdf_path, json_path)

代码解释

  • pdfplumber.open(pdf_path): 打开 PDF 文件。
  • pdf.pages[i].extract_text(): 从 PDF 文件的每一页提取文本。
  • json.dump(data, f, ensure_ascii=False, indent=4): 将字典数据格式化为 JSON 并写入文件。

注意事项

  • 如果 PDF 内容包含表格或复杂的结构,可能需要额外处理,例如使用 pdfplumber 提供的 extract_table() 方法提取表格数据。
  • 可以根据需要调整数据结构,将内容分为段落、标题等,以便生成更精确的 JSON 文件。

如果希望 JSON 的格式是包含 chaptertext 字段,可以先在 PDF 中查找章节标题(例如根据特定的关键字或字体格式),然后提取相应的文本内容。假设每个章节标题以 “Chapter” 开头,以下是一个可能的实现方法:

import pdfplumber
import json
import redef pdf_to_json(pdf_path, json_path):data = []current_chapter = Nonecurrent_text = []with pdfplumber.open(pdf_path) as pdf:for page in pdf.pages:text = page.extract_text()if text is None:continue# 按行分割文本,便于逐行检查lines = text.split('\n')for line in lines:# 检查是否是章节标题(例如以 "Chapter" 开头的行)if re.match(r'^\s*Chapter\s+\d+', line, re.IGNORECASE):# 保存上一章节内容到 data 中if current_chapter:data.append({"chapter": current_chapter, "text": "\n".join(current_text)})# 更新当前章节标题和内容current_chapter = line.strip()current_text = []else:# 将非章节标题的内容加入当前章节文本current_text.append(line)# 添加最后一个章节if current_chapter:data.append({"chapter": current_chapter, "text": "\n".join(current_text)})# 将数据写入 JSON 文件with open(json_path, 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4)# 使用方法
pdf_path = "sample.pdf"
json_path = "output.json"
pdf_to_json(pdf_path, json_path)

代码解释

  • current_chapter:用于保存当前章节标题。
  • current_text:用于收集当前章节的所有文本内容。
  • re.match(r'^\s*Chapter\s+\d+', line, re.IGNORECASE):使用正则表达式检查是否是章节标题(假设章节标题格式为 “Chapter X”)。
  • 当检测到一个新的章节时,将 current_chaptercurrent_text 保存到 data 列表,然后开始新的章节记录。

注意事项

  • 如果章节标题格式不同,修改正则表达式条件以适应实际标题格式。
  • 可以根据需要调整数据结构,以实现更灵活的 JSON 格式。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无法下载element-admin的依赖无法运行

目录 无法下载element-admin的依赖偷懒方法完美方法 运行element-admin错误 之前在下载element-admin时遇到了多多少少的问题 无法下载element-admin的依赖 偷懒方法 开始是从github下载源码后安装依赖时在与tui-editor相关的依赖时就会卡死,然后报错&#xff0c…

基于Java Springboot幼儿园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 🚀 更简单 👌 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/

Python | Leetcode Python题解之第564题寻找最近的回文数

题目: 题解: class Solution:def nearestPalindromic(self, n: str) -> str:m len(n)candidates [10 ** (m - 1) - 1, 10 ** m 1]selfPrefix int(n[:(m 1) // 2])for x in range(selfPrefix - 1, selfPrefix 2):y x if m % 2 0 else x // 10…

爬虫——数据解析与提取

第二节:数据解析与提取 在网络爬虫开发中,获取网页内容(HTML)是第一步,但从这些内容中提取有用的数据,才是爬虫的核心部分。HTML文档通常结构复杂且充满冗余信息,因此我们需要使用高效的解析工…

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan 背景 在使用Ant Design Vue 开发数据表格时,我们常常会遇到需要合并单元格的需求。 比如,某些字段的值可能会在多行中重复出现,而我们希望将这些重复的单元格合并为…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机(Exchanges)4.2 临时队列(Temporary Queues&am…

CANoe发送和接收CAN DataBase(DBC文件)数据

目录 1、接收CAN数据,DBC解析数据内容 2、发送DBC定义的CAN报文 CANoe是一款强大的网络仿真和开发工具,它支持发送和接收基于CAN DataBase(DBC文件)的数据。 1、接收CAN数据,DBC解析数据内容 要使用CANoe接收CAN数…

【第六课】Rust所有权系统(二)

目录 前言 借用和引用 借用规则 切片和迭代器 总结 前言 上节课介绍了Rust中的所有权系统,简单回顾一下,rust的内存系统系统,每一块内存都有一个主人,主人对这块内存有着读写和释放的权限,当主人离开作用域之后&am…

ISUP协议视频平台EasyCVR私有化部署视频平台如何实现RTMP推流将大疆无人机的视频画面回传?

在现代视频监控和流媒体技术领域,EasyCVR视频融合云平台以其卓越的性能和灵活性,成为了跨区域、网络化视频监控综合管理的理想选择。作为TSINGSEE青犀视频“云边端”架构体系中的核心组件,私有化部署视频平台EasyCVR不仅能够实现视频数据的集…

排序算法 -归并排序

文章目录 1. 归并排序(Merge Sort)1.1 简介1.2 归并排序的步骤1.3 归并排序c 语言实现代码说明 1.4 时间复杂度1.5 空间复杂度1.6 动画 1. 归并排序(Merge Sort) 1.1 简介 归并排序(Merge Sort)是一种基于…

unity 一个物体随键盘上下左右旋转和前进的脚本

注意:脚本挂在gamaobject 上面 ,操作对象的目标 this.gameObject 为操作对象 using System.Collections; using System.Collections.Generic; using UnityEngine;public class changePosition : MonoBehaviour {//操作对象的目标 this.gameObject 为操…

视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做

在数字时代,视频与音频的分离与重组已成为日常需求之一。无论是出于制作背景音乐、保存讲座内容,还是编辑播客素材,提取视频中的音频并将其保存为单独文件都显得尤为重要。视频里的音频怎么提取出来成单独文件?本文将详细介绍几种…

React(一)

文章目录 项目地址一、创建第一个react项目二、JSX语法2.1 生成列表2.2 大括号识别JS的表达式2.3 列表循环array2.4 条件判断以及假值显示2.5 复杂条件渲染2.6 事件监听和绑定2.7 使用Fregments返回多个根标签2.8 多条件渲染2.9 导出子组件 三、组件3.1 设置组件3.2 props给子组…

记录一下在原有的接口中增加文件上传☞@RequestPart

首先,咱声明一下: RequestBody和 MultipartFile 不可以 同时使用!!! 因为这两者预期的请求内容类型不同。RequestBody 预期请求的 Content-Type 是 application/json 或 application/xml,而 MultipartFile …

HTTPSOK ---助力阿里云免费 SSL 证书自动续期

目前许多用户面临着 SSL 证书过期续期的难题,尤其是对于阿里云的 免费 SSL 证书,每三个月需要手动申请和更新。为了帮助用户更轻松地管理 SSL 证书,现推出了强大的 HTTPSOK 服务,为用户提供了更便捷的自动续期和管理解决方案。 什…

5G的SUCI、SUPI、5G-GUTI使用场景及关系

使用场景(来源于对23.501、23.502、33.501、23.003的理解) 1、UE初始注册时,根据HN Public Key把SUPI加密成SUCI,并发送初始注册请求 2、AMF转发SUCI给AUSF和UDM进行认证,并获取解密后的SUPI 3、AMF根据SUPI生成一个5G-GUTI,并保…

大数据-226 离线数仓 - Flume 优化配置 自定义拦截器 拦截原理 拦截器实现 Java

点一下关注吧!!!非常感谢!!持续更新!!! Java篇开始了! 目前开始更新 MyBatis,一起深入浅出! 目前已经更新到了: Hadoop&#xff0…

PyAEDT:Ansys Electronics Desktop API 简介

在本文中,我将向您介绍 PyAEDT,这是一个 Python 库,旨在增强您对 Ansys Electronics Desktop 或 AEDT 的体验。PyAEDT 通过直接与 AEDT API 交互来简化脚本编写,从而允许在 Ansys 的电磁、热和机械求解器套件之间无缝集成。通过利…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator (一)QTimer(定时器)[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时,实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…