【PdgCntEditor】利用PDF目录书签编辑软件PdgCntEditor为PDF型图书快速添加书签的方法

news2025/7/26 7:57:33

一、给PDF加书签的两种情况

1.1 文字版PDF添加书签的理想情形

假设我们弄到了一本PDF,这个PDF如果是由Word或WPS转化而来,其中的标题也就代表了目录,我们可以用acrobat PDF中的AutuBookmark插件实现自动识别标题为目录的方法来添加书签。

这是完美的一种情况,因为即使PDF最初确实是从Word或WPS转化而来,也有可能识别不出来。因为你得到的这个版本的PDF,可能已经经过了很多次的压缩、格式转换、特殊处理,导致某些标题/目录层级信息丢失。

另一个方面,网上很多PDF都是扫描版本的,特别是中文图书;并且并不是所有人都喜欢用acrobat PDF软件(有些人喜欢用WPS PDF、福昕PDF、万兴PDF等等)。

1.2 本文适用的条件——扫描版PDF图书

如果你的PDF中没有目录,或者不属于图书的范畴,那么就不属于本文适用的范围。

二、情形的划分

  • 最理想的情况A:在网购平台、数字图书售卖网站或者类似“豆瓣”这种图书推荐网站上,找得到图书的目录+页码信息,就可以直接利用相关目录文字进行后续处理;这种应该是最为常见的情况。
  • 不那么理想的情况B:在图书中有已识别成文字的目录,由于该图书已经太过古老或冷门,在网上找不到相关网页对该图书的目录进行介绍;可以直接在PDF中复制目录文字,有些地方可能识别不准需要修改,但总算少去了自己OCR的这一步。
  • 特不理想的情况C:PDF是扫描得到的,并且目录那几页也没有经过OCR技术扫描成“可搜索PDF”;这时候就需要自己OCR了,对于小白来说不太友好。
  • 最不理想的情况D:PDF中没有目录那几页,或者目录那几页不能直接复制、特别模糊、水印特别重,导致你OCR获取文本的选项也不那么顺利。
  • 特殊情况E:在超星图书数据库中的PDF,都有相应的SS号,如果你知道如何查询图书的SS号,利用【书签获取小工具_用SS号获取书签2015.05.05_晴天软件】你可以直接用SS号搜索到图书的书签文本。

三、对情况A的处理

3.1 获取书签文本信息

如上所述:

在网购平台、数字图书售卖网站或者类似“豆瓣”这种图书推荐网站上,找得到图书的目录+页码信息,就可以直接利用相关目录文字进行后续处理;这种应该是最为常见的情况。

但是后来,我实际去做的时候,发现有些网站中只提供目录不提供页码,比如豆瓣、京东。
在这里插入图片描述
相比之下,淘宝就比较良心,大部分的目录都有页码。这样有一个好处就是你知道这一小节究竟写了多少页,避免有些作者草草了事花一两页写完明明很复杂的一个专题,你还不知道的情况。
在这里插入图片描述
于是我们借助淘宝获得了图书的书签信息。

3.2 将书签文本粘贴进PdgCntEditor进行处理

将上述文本粘贴进PdgCntEditor软件,我们可以发现页码前基本都是空格。
而PdgCntEditor软件的格式要求是页码前是一个缩进才能识别成功,因此我们需要将空格转化成缩进。
在这里插入图片描述

这时候我们就需要用到正则表达式的功能。
在这里插入图片描述
在正则表达式中我们输入【 ([0-9]+)$】,注意最前面有一个手动空格(因为PdgCntEditor不支持诸如/s、/t、/p等通配符);其中()表示部分替换分组,[0-9]表示任意数字,+表示一个或多个数字,$表示匹配句尾。
在替换为输入框中是【 $1】,注意最前面有一个手动缩进;其中$1表示部分替换第1个分组的内容保留。
在这里插入图片描述
为了避免出错,我们可以点击如上图所示的「测试」按钮,先对正则表达式进行验证。

单击「替换」,空格即变成了缩进,此时此刻你已经可以将书签文本应用到PDF中去了,只是没有分级而已。
在这里插入图片描述
如果你想要继续分级,那么你接着往下看!

首先对二级目录的前面加一个缩进。

在正则表达式中我们输入【(^[0-9]+.[0-9]+) 】,注意最后面有一个手动空格,这是匹配二级目录;其中()表示部分替换分组,[0-9]表示任意数字,+表示一个或多个数字,^表示匹配句首。
在替换为输入框中是【 $1】,注意最前面有一个手动缩进;其中$1表示部分替换第1个分组的内容保留。
在这里插入图片描述
而后,在三级目录的前面加两个缩进。
在正则表达式中我们输入【(^[0-9]+.[0-9]+.[0-9]+) 】,注意最后面有一个手动空格,这是匹配三级目录。
在替换为输入框中是【 $1】,注意最前面有两个手动缩进;其中$1表示部分替换第1个分组的内容保留。
在这里插入图片描述
由于这个PDF最多只有三级目录,因此处理到这一步就结束了。小伙伴们如果看到更多级目录,按照二级到三级的转换思路进行递归即可。

第三部分的思路,来自这篇记一次正则表达式实战,给pdf加目录,虽然这篇文章是一篇爬虫文,源头也已经消失在互联网大海中,但是也给我带来了莫大的精神灵感。
而这篇对正则表达式部分替换的介绍也给我知识上的补充,谢谢上述两篇文章的作者!!

四、对情况A的Vim编辑器命令处理分析

其实,最初我是看了pdf生成目录-如何给没有目录的pdf手动添加目录中的通过Vim编辑器中的命令来快速编辑书签文本使其符合PdgCntEditor的格式要求。

  • 三级目录添加两个tab。命令%s/\v^\ze(\d+\.\d+\.)/\t\t/
  • 给二级目录添加一个缩进,命令%s/\v^\ze(\d+\.\d+)/\t/
  • 将目录名和页码中间的字符串替换为 Tab,命令%s/\v(\s\.)+\s/\t/
  • 页码重定位,加上一个偏移量,命令%s/\d\+$/\=submatch(0)+22/
  • 保存,或使用命令:wq保存并退出

但是,我发现(其实作者也提到了)第3步操作失败,由于我对Vim命令还很陌生,所以就没再继续探究了。
不得不说这是一个很棒的方法,因为你只需要依次执行几条命令就可以;相比我上面在第三节介绍的方法,可以节省一半的步骤(只要你对Vim熟悉)。

后面我有时间,会补充和完善一下上面大牛提出的方法。

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

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

相关文章

『Java安全』利用反射调用MimeLauncher.run()触发RCE

文章目录前言MimeLauncherrun()MimeLauncher()反射调用MimeLauncher.run()触发RCE条件PoC完前言 rt.jar内的sun.net.www.MimeLauncher类的run方法调用了exec 据说可以有效绕过某些免杀,下面分析一下调用过程 MimeLauncher run() 首先:调用了this.m.ge…

古人的名与字、号、讳、谥有什么区别

古人复杂的名字 这个世界上想来是不存在没有名字的人,即便真的有人没名字,也会被外人赠予姓名,比如说一些古人典籍里的“无名氏”,就是专门用来形容那些没有名字也不清楚根脚的人,即便是现如今一些作品不知道作者是谁…

信号与线性时不变系统的傅里叶描述

1、复正弦信号和线性时不变系统的频率相应 卷积积分和卷积和傅里叶变换冲激表示信号正弦表示信号输入信号表示为延迟冲激的加权叠加输入信号为复正弦信号的加权叠加输出可以用卷积的形式来表示输出可以用傅里叶的形式来表示 (1)频率响应Frequency response 线性时不变系统对正…

Java中mybatis的Mpper代理开发的详细使用步骤

目录 前言: 一、全图预览 二、使用步骤 1.pom.xml里面添加依赖包 2.新建统一配置文件(俗称数据库连接文件) 3.新建项目 4.新建映射文件(俗称数据库对应表xml) 5.测试 三、文中的全部代码(去复制可…

MySQL如何保证主备一致?

1. MySQL主备的基本原理 如下图展示的是基本的主备切换流程: 在状态1中,主库是A,备库是B,所以客户端的读写都直接方法节点A。由于节点B是节点A的备库,所以备库B只是将A的更新都同步过来,本地执行&#x…

皕杰报表使用字体和部署后添加字体

Windows系统 1、打开Win10系统的字体安装文件夹,可以双击打开此电脑-->打开C盘-->打开Windows-->打开Fonts;也可先打开计算机,在计算机地址栏上直接拷贝“C:WindowsFonts”路径。回车打开Win10字体文件夹。 2.下载自己需要的字体。…

数组、链表、栈、队列、树

1. 数组(Array) 定义:数组是一种 线性表 数据结构,它用一组 连续的内存空间 存储一组具有 相同类型 的数据。 Java中 基本数据类型数组 的存储格式: int arr[] new int[3]; arr[0] 0; arr[1] 1; arr[2] 2;Java中…

拿去吧你,华为出品《看漫画学Python》零基础自学首选~

目前Python在人工智能、机器学习、大数据、数据分析、网络爬虫等领域广泛应用,是非常适合初学者入门和培养编程兴趣的一门语言。相比较其他主流编程语言而言,有更好的可读性,和满足感,上手相对容易。 但是很多零基础的同学不知道…

【C语言】 函数

函数 在计算机科学中,子程序 ,一个大型程序中的某部分代码, 由一个或多个语句块组 成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细…

元组啊,不就是不可变的列表吗?

B站|公众号:啥都会一点的研究生 相关阅读 整理了几个100%会踩的Python细节坑,提前防止脑血栓 整理了十个100%提高效率的Python编程技巧,更上一层楼 Python-列表,从基础到进阶用法大总结,进来查漏补缺 Python-元组&…

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理 不久前看到SAP Community里面有这样一个问题,可能比较老了,但个人觉得比较新奇,就去做了下面一个测试。 首先通过事务代码“CMOD”对增强“MB_CF001”(更新物料凭证时的客户功能出…

《从零开始:机器学习的数学原理和算法实践》chap6

《从零开始:机器学习的数学原理和算法实践》chap6 学习笔记 文章目录6.1 凸函数6.2 梯度下降引入梯度是什么为啥梯度是上升最快的方向捏梯度下降与参数求解梯度下降过程演示6.3 代码实践 梯度下降一元函数的梯度下降多元函数的梯度下降6.1 凸函数 凸集 何为凸集 凸集…

c# 多线程

案例1 单线程与多线程对比 单线程会卡主线程,此时会将ui界面给卡住。而多线程开启以后就好了 不会卡住主线程,且运行速度快,相当于多个同时运动。 单线程按钮 private void singlethread_Click(object sender, EventArgs e){for

Kafka多生产者消费者自动配置

背景 项目中不同的业务可能会使用多个kafka,按默认的Kafka配置,最多是支持消费者和生产者使用不同的Kafka,如果两个生产者使用不同的Kafka则需要自定义配置,生成对应的bean。 解决方案 多生产者,多消费者&#xff0…

PowerDesigner 设置

PowerDesigner 设置前言推荐PowerDesigner 设置简单设置sql反向生成物理模型物理模型创建索引最后前言 以下内容源自自己 仅供学习交流使用 推荐 第11章 数据库的设计规范【2.索引及调优篇】【MySQL高级】 powerdesign 通过sql反向生成ER模型 PowerDesiner 15 在物理模型中…

Python测试框架之unittest和pytest 的区别

一、Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、…

FFN -> GLU -> GAU

1 GLU GLU的起源是2016年由Yann N. Dauphin在 论文:Language Modeling with Gated Convolutional Networks 在语言模型的建模方法上相比于循环神经网络更具有竞争力,提出了一种简单的线性门控单元来堆叠卷积层从而使得文本中的token可以并行化处理来获得上下文的语义…

HTTP响应详解

目录 一.状态码 小结(记住) 二.认识响应正文(body) 三.如何构造http请求 一.状态码 是一个数字,这个数字描述了当前这次请求的状态(成功,失败,失败的原因) http的状态…

Typora基础篇

Markdown基础 标题 #标题名字(#号的个数代表标题的级数) 文件-偏好设置-Markdown里面如果勾选了严格模式,那#与标题名称之间就需要加上一个空格一级标题用1个# 二级标题用2个# 三级标题用3个# 四级标题用4个# 五级标题用5个# ####### …

262-视口,布局视口,视觉视口,移动端适配,less语法,比哪里,DPR,RRI,less的弊端,运算,嵌套,混合,继承,混入,运算,

262-CSS中的单位 ◼ 前面编写的CSS中,我们经常会使用px来表示一个长度(大小),比如font-size设置为18px,width设置为100px。 ◼ px是一个长度(length)单位,事实上CSS中还有非常多的长度单位。 ◼ 整体可以分成两类:  绝对长度单位(Absolute length units);  相…