目录提取,删除,添加

news/2024/12/27 18:13:10/文章来源:https://www.cnblogs.com/redufa/p/18523634

目录
  • 提取目录
  • 删除目录
  • 制作目录
  • 效果图

目前有两个问题,一般的目录文本格式有问题,需要用正则化方式,生成比较好的目录文件,比如csv格式,txt格式

另外,生成的目录,层级只有一级

提取目录


import fitz  # PyMuPDF
import pandas as pd# 打开PDF文件
pdf_path = '力学概论.pdf'  # 请确保替换为正确的文件路径
document = fitz.open(pdf_path)# 初始化一个列表来存储目录信息
toc_list = []# 提取目录信息的函数
def extract_toc(toc, level=0):for item in toc:# 确保目录项至少包含标题if len(item) > 1 and item[1]:title = item[1]# 检查标题的首字符if title[0].isdigit():title_level = 2else:title_level = 1# 确保页码是数字类型page = item[2] if len(item) > 2 and isinstance(item[2], int) else Noneif page is not None:# 添加条目到列表toc_list.append({'Title': title,'Page': page,'Level': level + title_level})# 如果有子条目,递归提取if len(item) > 3 and item[3]:  # 子条目在索引3extract_toc(item[3], level)# 获取PDF的目录
toc = document.get_toc(simple=False)# 提取目录信息
extract_toc(toc)# 关闭PDF文件
document.close()# 将列表转换为DataFrame
toc_df = pd.DataFrame(toc_list)# 将DataFrame输出到CSV文件
toc_df.to_csv('output.csv', index=False, encoding='utf-8')

删除目录

import PyPDF2def remove_bookmarks(input_pdf_path, output_pdf_path):# 打开原始的PDF文件with open(input_pdf_path, 'rb') as file:reader = PyPDF2.PdfFileReader(file)writer = PyPDF2.PdfFileWriter()# 将每一页复制到新的PDF文件中,不包括书签for page_num in range(reader.numPages):page = reader.getPage(page_num)writer.addPage(page)# 将没有书签的PDF写入新文件with open(output_pdf_path, 'wb') as output_file:writer.write(output_file)# 使用函数删除书签
remove_bookmarks('力学概论.pdf', '力学概论-无目录.pdf')
print("Book marks removed successfully.")

制作目录

import pypdf# 输入和输出文件名
input_pdf_filename = '力学概论-无目录.pdf'
output_pdf_filename = 'file_with_toc.pdf'
csv_filename = 'output.csv'# 创建一个PdfWriter实例
writer = pypdf.PdfWriter()# 读取原始PDF文件
with open(input_pdf_filename, "rb") as input_pdf:reader = pypdf.PdfReader(input_pdf)writer.append_pages_from_reader(reader)# 读取CSV文件并创建书签
bookmarks = []  # 用于维护书签层级结构
toc_entries = []  # 用于存储书签信息# 读取CSV文件内容
with open(csv_filename, 'r', encoding='GBK') as csv_file:next(csv_file)  # 忽略第一行for line in csv_file:title, page_number,hierarchy= line.strip().split(',')page_number = int(page_number)-1# 根据父子层级关系确定层级数值level = hierarchy.count('.') + 1toc_entries.append((level, page_number, title))# 按CSV文件中的顺序,一行行添加书签并确保层级正确
for entry in toc_entries:level, page_number, title = entry# 根据层级确定父书签parent_bookmark = Noneif level > 1:# 从当前层级的上一层级开始查找父书签for i in range(level - 1, 0, -1):try:parent_bookmark = next(b for b in bookmarks if b.level == i)breakexcept StopIteration:continueelse:parent_bookmark = None# 添加书签bookmark = writer.add_outline_item(title=title, page_number=page_number, parent=parent_bookmark)bookmark.level = levelbookmarks.append(bookmark)  # 添加到书签列表# 写入新的PDF文件
with open(output_pdf_filename, "wb") as output_pdf:writer.write(output_pdf)# 完成后关闭
writer.close()

效果图

原书目录

image

删除目录后的图没放

添加目录:

image

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

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

相关文章

2023 国际大学生程序设计竞赛亚洲区域赛(济南站)(SMU Autumn 2024 Team Round 2)

2023 国际大学生程序设计竞赛亚洲区域赛(济南站)(SMU Autumn 2024 Team Round 2) I. Strange Sorting 思路代码查看代码 #include #define ll __int128 #define int long long #define double long double #define PII pair using namespace std; const int N = 2E5 + 3; …

MyBatis-Plus快速入门:从安装到第一个Demo

本文将带你从零开始,快速入门 MyBatis-Plus。我们将首先介绍如何安装和配置 MyBatis-Plus,然后通过一个简单的示例演示如何使用它进行数据操作。无论你是 MyBatis 的新手还是希望提升开发效率的老手,本文都将为你提供清晰的指导和实用的技巧。一、前言 在现代 Java 应用程序…

docker bulid tag push到自己的docker hub 仓库

-t(或 --tag)参数:用于给构建的镜像指定标签(tag)。标签的格式通常是 [仓库名/][用户名/]镜像名:版本号 -f(或 --file)参数: 指定构建镜像所使用的 Dockerfile 的路径。默认情况下,docker build 会在当前目录下查找名为 Dockerfile 的文件,但通过这个参数可以指定其他…

《使用Gin框架构建分布式应用》阅读笔记:p393-p437

《用Gin框架构建分布式应用》学习第17天,p393-p437总结,总45页。 一、技术总结 1.Prometheus Prometheus放在代码里面使用,还是第一次见。在本人实际的工作中未看到这种用法。 2.Grafana Grafana用于被监控数据的可视化。 3.Telegraf Telegraf用于数据采集。在本人的实际工作…

2024.11.3 鲜花

浅谈 RMQ浅谈 RMQ비밀 인형극 II어느 한적한 마을 골목 안의 허름한 건물在某个僻静村庄胡同的破旧建筑里문을 열고 들어가면 작은 극장이 있죠开门进去便会见到一个小剧场솜씨 좋은 인형사가 연극을 마치고 떠나면一个手艺不错的人偶师演完戏离开的时候인형들은 극장 창고 안에…

2024-2025-1 20241301 《计算机基础与程序设计》第六周学习总结

|这个作业属于哪个课程|<2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)>| |这个作业要求在哪里|<2024-2025-1计算机基础与程序设计第六周作业](https://www.cnblogs.com/rocedu/p/9577842.html#WEEK06)>| |这个作业的…

【UWP】让 UWP 自己托管自己 —— Windows App SDK 篇

众所周知,UWP 使用的窗口模型是 CoreWindow,但是 UWP 本身只是一个应用模型,所以完全可以创建 win32 窗口,那么我们可以不可以创建一个 win32 窗口,然后像 XAML 岛 (XAML Islands) 一样把 XAML 托管上去呢?本篇将讲述如何利用 WAS (Windows App SDK,俗称 WinUI3) 在 UWP…

【算法】记忆化搜索

[!TIP] 一种剪枝算法,优化运算效率,减少冗余计算基本内容入门例子 [P1028 [NOIP2001 普及组] 数的计算]([P1028 NOIP2001 普及组] 数的计算 - 洛谷 | 计算机科学教育新生态)题目要求:输入n,输出一共可以构造多少个数列,要求数列的第 i不能超过第i-1个数的一半 示例:输入6…

『模拟赛』NOIP2024模拟1

『模拟赛记录』NOIP2024模拟1Rank 有点可惜,A. 玩游戏 绝妙贪心题。感觉这种能产生很多假做法且都可 hack 的贪心都是好题。 赛时不知道为什么犯唐没交一开始的暴力贪心。 考虑双指针,设左右指针分别为 \(l,r\)。主要思路是实时维护当前两个指针向两边最近的一个区间和不为正…

2024-2025-1 20241312《计算机基础与程序设计》第6周学习总结

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第六周作业)这个作业的目标 Polya如何解决问题 简单类型与组合类型 复合数据结构 查找与排序算法 算法复杂度 递…

工程师和科学家的高等数学及python实例:2三角函数 II

2 三角函数 II 学完本章内容后,你应该能够 ● 讨论反三角函数的图形 ● 讨论倒数函数的图形 ● 评估正弦、余弦和正切函数的变换 2.1 引言 本章将继续讨论三角函数,研究上一章中涉及的三个三角函数的倒数和反三角函数。本章还将讨论这些函数的变换。 2.2 三角函数的倒数 正弦…

搭建主从DNS服务器实现域名正逆向解析

1.前置工作:关闭防火墙及selinux 2.安装软件:yum install -y bind 3.本文仅搭建本地DNS实现逆向域名解析 1)建议复制逆向解析模板再进行修改 模板路径:/etc/named.rfc1912.zones 2)进入主配置文件并添加逆向配置文件 vim /etc/named.conf 注意:区域名称中IP地址反向书写,…