当前位置: 首页 > news >正文

ChatGPT 调教指南:从 PDF 提取标题并保存

一、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数。

我没有加任何的答案提示,看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息,一切标题或者正文全是文本框。

好的,以下是使用pymupdf包从pdf中提取标题,并保存标题名称和页数的代码示例:

import fitzdef extract_titles(pdf_path):doc = fitz.open(pdf_path)titles = []for page in doc:blocks = page.get_text("dict")["blocks"]for block in blocks:if block["type"] == 1 and block["bbox"][3] < 100:title = block["text"]page_num = page.number + 1titles.append({"title": title, "page": page_num})return titlespdf_path = "example.pdf"
titles = extract_titles(pdf_path)for title in titles:print("Title:", title["title"])print("Page:", title["page"])print()

它里面有个错误,page.getText应该是page.get_text,我改了过来。

这个逻辑完全不对,我试了以下我手头的一个文字 PDF(三眼文集.pdf),第二页doc[1]的第一行就是标题。看看能不能提取

pdf_path = r"d:/docs/wealth-books-2023/权谋/三眼文集.pdf"
doc = fitz.open(pdf_path)
print(doc[1].get_text("dict")['blocks'][0])
'''
{'number': 0,'type': 0,'bbox': (48.0, 52.383140563964844, 531.0696411132812, 96.42223358154297),'lines': [{'spans': [{'size': 16.440000534057617,'flags': 4,'font': 'MicrosoftYaHeiUI','color': 0,'ascender': 1.015625,'descender': -0.25439453125,'text': '赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层','origin': (48.0, 69.08001708984375),'bbox': (48.0,52.383140563964844,531.0696411132812,73.26226043701172)}],'wmode': 0,'dir': (1.0, 0.0),'bbox': (48.0, 52.383140563964844, 531.0696411132812, 73.26226043701172)},{'spans': [{'size': 16.440000534057617,'flags': 4,'font': 'MicrosoftYaHeiUI','color': 0,'ascender': 1.015625,'descender': -0.25439453125,'text': '玩金融!(完整版)','origin': (48.0, 92.239990234375),'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}],'wmode': 0,'dir': (1.0, 0.0),'bbox': (48.0, 75.5431137084961, 199.65902709960938, 96.42223358154297)}]}
'''

这个文本块的确是标题,但是type不是 1,根本提取不出来。

二、请使用python编写一段代码,使用pymupdf包从pdf中提取标题,保存标题名称和页数,注意不要根据文本块的类型来判断,而是根据其大小。

但是我们知道,标题的大小明显和正文不一样,比如正文大小是12,标题是16,那OK,我们引导 GPT 从大小方面区分。

您可以使用以下代码使用pymupdf包从PDF中提取标题和页数,并将其保存在列表中:

import fitzdef extract_titles(pdf_path):doc = fitz.open(pdf_path)titles = []for page_num in range(len(doc)):page = doc.load_page(page_num)blocks = page.get_text("dict", flags=11)["blocks"]for block in blocks:if block["type"] == 1 and block["bbox"][3] < 100:title = block["text"].strip()titles.append({"title": title, "page": page_num})return titlespdf_path = "your_pdf_path.pdf"
titles = extract_titles(pdf_path)for title in titles:print(f"Title: {title['title']}, Page: {title['page']}")

请将代码中的"your_pdf_path.pdf"替换为您要提取标题的PDF路径。该代码使用pymupdf包打开PDF文件并迭代每个页面,然后检查每个文本块的类型和大小。如果文本块的类型为1(即标题)且其边界框高度小于100,将提取标题和页数,并将其添加到标题列表中。最后,打印出所有提取的标题和页数。

看来还是不改,还是按照文本框高度和类型区分。

三、请使用python编写一段代码,使用pymupdf包从pdf中提取标题大致方法是获取每一页的每个文本框,如果字体大小超出平均值一定倍数,就判断为标题,之后保存标题名称和页数。

你可以使用pymupdf包来提取PDF文件中的标题。以下是一个示例代码,根据字体大小判断标题并保存标题名称和页数:

import fitzdef extract_titles_from_pdf(file_path, threshold=1.5):doc = fitz.open(file_path)titles = []for page in doc:text_blocks = page.getTextBlocks()font_sizes = [block[1] for block in text_blocks]avg_font_size = sum(font_sizes) / len(font_sizes)for block in text_blocks:font_size = block[1]text = block[4]if font_size > avg_font_size * threshold:titles.append((text, page.number))return titles# 调用示例
pdf_path = "example.pdf"
titles = extract_titles_from_pdf(pdf_path)
for title, page_num in titles:print(f"标题: {title}\t页数: {page_num}")

这段代码有个错误,就是block的前四个数值是矩形四个分量并不是大小,不过这个思路改一改应该就可以用了。

四、修改后的代码

'''
block: {'number': 1,'type': 0,'bbox': (158.25, 569.15625, 446.25, 663.375),'lines': [{'spans': [{'size': 72.0,'flags': 0,'font': 'SimSun','color': 16776960,'ascender': 1.04296875,'descender': -0.265625,'text': '三眼文集','origin': (158.25, 644.25),'bbox': (158.25, 569.15625, 446.25, 663.375)}],'wmode': 0,'dir': (1.0, 0.0),'bbox': (158.25, 569.15625, 446.25, 663.375)}]}
'''def extract_titles_from_pdf(file_path, thres=1.2):doc = fitz.open(file_path)titles = []for i, page in enumerate(doc):blocks = [block for block in page.get_text("dict")["blocks"]if block['type'] == 0]sizes = [span['size'] for block in blocksfor line in block['lines']for span in line['spans']]avg_size = sum(sizes) / (len(sizes) + 1e-9)page_titles = [(span['text'], i) for block in blocksfor line in block['lines']for span in line['spans']if span['size'] > avg_size * thres]titles += page_titlesreturn titles

好,然后调用:

res = extract_titles_from_pdf(pdf_path, 1.2)
print(res)
'''
[('赚钱的本质套路一共就3个:底层收智商税、中层找接盘侠、上层', 1),('玩金融!(完整版)', 1),('钱就是债!——金融家的秘密,老百姓的盲点!明白这个才能不被', 8),('收割', 8),('穷人才想赚快钱!教人致富多为骗局!想变富要明白一个逻辑:分', 11),('配!', 11),('历史观比财经观更重要!经济是政治的延伸,而今天是昨日的推', 14),('演!', 14),('大钱要靠分配!不是卖苦力赚的!人生是无数个局,看局方能破局', 17),('为何啥都不好干了?为何经济放缓了?本质在于这一群体快被抽', 21),('干!', 21),('过去高增长的本质是什么?', 21),...]
'''

OK 初步完成。

相关文章:

ChatGPT 调教指南:从 PDF 提取标题并保存

一、请使用python编写一段代码&#xff0c;使用pymupdf包从pdf中提取标题&#xff0c;保存标题名称和页数。 我没有加任何的答案提示&#xff0c;看看 GPT 如何反应。它应该是知道 PDF 没有任何语义信息&#xff0c;一切标题或者正文全是文本框。 好的&#xff0c;以下是使用py…...

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…...

Android修行手册 - Activity 在 Java 和 Kotlin 中怎么写构造参数

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…...

【IPC 通信】信号处理接口 Signal API(7)

收发信号思想是 Linux 程序设计特性之一&#xff0c;一个信号可以认为是一种软中断&#xff0c;通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解信号编程。 exit(5) 遵循 C11&#xff0c; POSI…...

springboot和vue:十二、VueRouter(动态路由)+导航守卫

VueRouter的简介 VueRouter是官方的路由插件&#xff0c;适合单页面应用/网页的切换。VueRouter目前有3.x版本和4.x版本&#xff0c;3.x版本只能结合vue2使用&#xff0c;4.x版本只能结合vue3使用。安装&#xff1a;npm install vue-router3 目的 初始版本&#xff1a;我们想…...

文心一言 VS 讯飞星火 VS chatgpt (103)-- 算法导论10.1 1题

一、用go语言&#xff0c;仿照图 10-1&#xff0c;画图表示依次执行操作 PUSH(S&#xff0c;4)、PUSH(S&#xff0c;1)、PUSH(S&#xff0c;3)、POP(S)、PUSH(S&#xff0c;8)和 POP(S)每一步的结果&#xff0c;栈 S初始为空&#xff0c;存储于数组 S[1…6]中。 文心一言&…...

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…...

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…...

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1&#xff1a;安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2&#xff1a;查询显…...

WordPress主题开发( 十四)之—— 主题开发示例

要深入了解WordPress主题开发的最佳实践和标准&#xff0c;参考主题示例是一种非常有效的方法。在这里&#xff0c;我们将介绍两个主题示例&#xff1a;默认的Twenty主题和Underscores主题&#xff0c;它们都是出色的学习资源。 默认“Twenty”主题 自WordPress 3.0版本开始&a…...

rust学习-any中的downcast和downcast_ref

背景 看rust官方文档,好奇Any和Go的Any是否是一回事,看到下文的一行代码,了解下它的功能 pub trait Any: static {// Required methodfn type_id(&self) -> TypeId; }std::any 用于 dynamic typing 或者 type reflection 模拟动态类型的trait。 大多数类型都实现 …...

js检测数据类型总结

目录 一、typeof 二、instanceof 三、constructor 四、Object.prototype.toString.call() Object.prototype.toString.call(obj)类型检测原理 五、__proto__ 六、 其他 一、typeof typeof在对值类型number、string、boolean 、symbol、 undefined、 function的反应是精准…...

获奖作品展示 | 2023嵌入式大赛AidLux系列作品精彩纷呈

第六届&#xff08;2023&#xff09;全国大学生嵌入式芯片与系统设计竞赛应用赛道全国总决赛已于8月下旬圆满结束。 本届赛事中&#xff0c;AidLux是广和通5G智能物联网赛题的唯一软件支持&#xff0c;阿加犀为该赛题学生们提供了全程线上辅导、技术答疑&#xff0c;以及大赛专…...

Mybatis 二级缓存(使用Redis作为二级缓存)

上一篇我们介绍了mybatis中二级缓存的使用&#xff0c;本篇我们在此基础上介绍Mybatis中如何使用Redis作为二级缓存。 如果您对mybatis中二级缓存的使用不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 二级缓存https://blog.csd…...

VMware vSphere ESXI 6.7 U3封装RTL8125B网卡驱动

之前的教程VMware vSphere ESXI 6.7 U3最新版本封装网卡驱动补丁可参考&#xff0c;本文为此文章的又一次实践 准备工作 1、ESXi-Customizer-PS-v2.6.0.ps1 &#xff08;官网下载&#xff0c;Github下载&#xff09; 2、ESXi670-202210001.zip &#xff08;VMware vSphere Hy…...

黑马JVM总结(二十五)

&#xff08;1&#xff09;字节码指令-cinit 构造方法可以分为两类&#xff0c;一类是cinit 一类init cinit是整个类的构造方法 putstatic&#xff1a;进行static变量的赋值&#xff0c;是到常量池里找到名字一个叫做i的变量 &#xff08;2&#xff09;字节码指令-init in…...

基础数据结构之——【顺序表】(上)

从今天开始更新数据结构的相关内容。&#xff08;我更新博文的顺序一般是按照我当前的学习进度来安排&#xff0c;学到什么就更新什么&#xff08;简单来说就是我的学习笔记&#xff09;&#xff0c;所以不会对一个专栏一下子更新到底&#xff0c;哈哈哈哈哈哈哈&#xff01;&a…...

Apollo自动驾驶系统概述(文末参与活动赠送百度周边)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…...

Java 21 新特性:Unnamed Classes and Instance Main Methods

Java 21引入了两个语言核心功能&#xff1a; 未命名的Java类你说新的启动协议&#xff1a;该协议允许更简单地运行Java类&#xff0c;并且无需太多样板 下面一起来看个例子。通常&#xff0c;我们初学Java的时候&#xff0c;都会写类似下面这样的 Hello World 程序&#xff1…...

Tomcat启动后的日志输出为乱码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

CSP-J第二轮试题-2021年-4题

文章目录 参考&#xff1a;总结 [CSP-J 2021] 小熊的果篮题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案答案1答案2答案3 现场真题注意事项 参考&#xff1a; https://www.luogu.com.cn/probl…...

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…...

P1540 [NOIP2010 提高组] 机器翻译(模拟)

[NOIP2010 提高组] 机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件&#xff0c;他经常用这个软件来翻译英语文章。 题目描述 这个翻译软件的原理很简单&#xff0c;它只是从头到尾&#xff0c;依次将每个英文单词用对应的中文含义来替换。对于每个英文单词&#xf…...

生信教程:ABBA-BABA分析之滑动窗口

简介 ABBA BABA 统计&#xff08;也称为 D 统计&#xff09;为偏离严格的分叉进化历史提供了简单而有力的检验。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据测试基因渗入。 虽然最初开发用于基因渗入的全基因组测试&#xff0c;但它们也可以应用于较小的窗口&#…...

二分答案(求最大值的最小值||求最小值的最大值)

引入 二分答案要建立在二分查找的基础上&#xff0c;在此之前&#xff0c;要知道二分查找的三个模板 模板一 while(l<r) {int mid(lr)>>1;if(check(mid)) rmid;else lmid1; }模板二 while(l<r) {int midlr1>>1;if(check(mid)) lmid;else rmid-1; }模板三…...

思维模型 周期

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。周期是一个看似极为简单&#xff0c;但背后却蕴藏着大智慧的模型&#xff0c;了解周期&#xff0c;对于了解王朝更替&#xff0c;数学之美&#xff0c;经济运转等都有帮助。 1 周期的应用 …...

从 0 到 1 ,手把手教你编写《消息队列》项目(Java实现) —— 介绍项目/ 需求分析

文章目录 一、消息队列是什么&#xff1f;二、需求分析结构解析功能解析规则解析绑定关系交换机类型消息应答 三、持久化存储四、网络通信提供的API复用TCP连接 五、消息队列概念图 一、消息队列是什么&#xff1f; 消息队列 (Message Queue, MQ)就是将阻塞队列这一数据结构提取…...

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…...

编程每日一练(多语言实现)基础篇:满足abcd=(ab+cd)^2的数 (增加Go语言实现)

文章目录 一、实例描述二、技术要点三、代码实现3.1 C 语言实现3.2 Python 语言实现3.3 Java 语言实现3.4 JavaScript 语言实现3.5 Go 语言实现 一、实例描述 假设 abcd 是一个四位整数&#xff0c;将它分成两段&#xff0c;即 ab 和 cd&#xff0c;使之相加求和后再平方。求满…...

LeetCode 热题 HOT 100:回溯专题

LeetCode 热题 HOT 100&#xff1a;https://leetcode.cn/problem-list/2cktkvj/ 文章目录 17. 电话号码的字母组合22. 括号生成39. 组合总和46. 全排列补充&#xff1a;47. 全排列 II &#xff08;待优化)78. 子集79. 单词搜索124. 二叉树中的最大路径和200. 岛屿数量437. 路径…...

阳江房产网站/关键词优化排名软件

一. 前言 本文将分析内存的性能指标、测试方法、压测工具以及内存常见问题的优化套路。 二. Buffer和Cache 通过free或者top命令我们可以发现其将内存分为了buffer和cache等部分。Buffer 和 Cache 的设计目的&#xff0c;是为了提升系统的 I/O 性能。它们利用内存&#xff0c;充…...

自适应网站cms/sem竞价培训班

DMitry&#xff08;Deepmagic Information Gathering Tool&#xff09;是一个一体化的信息收集工具。它可以用来收集以下信息&#xff1a; 根据IP&#xff08;或域名&#xff09;来查询目标主机的Whois信息在Netcraft.com的网站上挖掘主机信息查找目标域中用的子域查找目标域的…...

wordpress小说插件/在线生成个人网站

文章目录Metasploit 简介诞生与发展技术架构辅助模块渗透攻击模块攻击载荷模块空指令模块编码器模块后渗透攻击模块免杀模块为什么使用Metasploit&#xff1f;情报搜集阶段威胁建模阶段漏洞分析阶段后渗透攻击阶段报告生成阶段Metasploit 的使用启动MSF情报搜集网站敏感目录扫描…...

政府网站建设研讨会主持词/网站推广的技术有哪些

1. XMLHttpRequest 是 AJAX 的基础 所以首先要创建 XMLHttpRequest xmlhttpnew XMLHttpRequest(); 因考虑有一些浏览器兼容性问题 不支持 XMLHttpRequest 所以这样创建 var xmlhttp; if (window.XMLHttpRequest){// code for IE7, Firefox, Chrome, Opera, Safarixmlhttp…...

网站管理员权限设置权限设置/企业宣传片文案

选择医院 网上查资料&#xff0c;在北京最牛的眼科医院就是同仁医院了医院地址&#xff1a;北京市东城区东交民巷1号 选择医生 查资料我了解到&#xff0c;虽然是仪器来主导手术&#xff0c;但是手术切削的参数、制定的方案以及手术过程中的人为操作都需要经验丰富的医生。所…...

福州网站设计费用/鄂州seo

PYPI 国内源 搬砖自http://www.cnblogs.com/sunnydou/p/5801760.html 阿里云 http://mirrors.aliyun.com/pypi/simple/中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simpl…...