草庐IT

半自动化给PDF加书签-Python实现-可双击执行-上篇

Davy 2023-04-15 原文

目录

半自动化给PDF加书签-Python实现-上篇

使用介绍

Githubhttps://github.com/Davy-Zhou/pdf_add_bookmark_semi

一、PDF加书签介绍

1.1 不那么漂亮的话

  1. 本工具只进行书签部分格式化和加书签操作书签获取需要配合其它工具
  2. 最终书签效果因人而异,程序只能格式化最常见的层级,毕竟是半自动的
  3. 最好了解一定正则和列操作,不了解的话可能要多手工重复一些操作
  4. 相比现有工具,书签获取自动化,可自动识别部分PDF页偏移✨
  5. 反反复复改了一星期,差不多能用了,虽然代码依然很烂

1.2 PDF加书签难点

1.2.1 书签获取

一般需要加书签的,大多是扫描版书籍,而市面上绝大多数扫描版书籍均出自超星公司(读秀和全国图书参考联盟都是他家的),为了方便学术检索,超星有对目录进行提取,如下图。

​ 额,然后有人分析出了超星书签的接口,做成了书签获取工具,如下图,通过它能获取大多数书的书签

但检索一本书的书签,需要知道书在超星的内部编号,上图书签获取工具填的就是那个编号

  • SSID( Super Star ID,超星英文简写)

    书签接口是超星开发的,其中检索每本书的书签不是通过ISBN或书名,而是其内部定义的编号SSID,这个SSID可以油猴脚本获取,推荐文献互助小帮手这个脚本,读秀和全国图书参考联盟都可以获取SSID,但在装油猴脚本前需要装油猴插件

    装好的油猴插件、油猴脚本

如果书签工具也没有那本书的书签,怎么办?

推荐阅读,上面的内容主要参考这三篇文章

1.2.2 书签格式化

最初获取的书签结构化程度,很大程度决定了后期格式化用的时间。根据经验,书签格式化有三个小点,书签层级每级书签样式页码偏移

  • 书签层级

    ​ 以《人工智能在信用债投资领域的应用 Python语言实践》(SSID: 14545152)这本书为例,见下图,这是从书签获取小工具2015.05.05【晴天软件】获得的初步整理的书签。另外规定对于书签的层级一律以Tab来区分,一级书签前面没有Tab,二级书签前面有1个Tab,三级书签则有2个Tab

    ​ 从中可以看出,除对一级书签(即按章开头的那个第*章),其它书签均格式化为二级书签,其中标注的第6行和第31行应分别为三级书签和一级书签,如下图为修正好的书签

  • 每级书签样式

    ​ 还是以同一本书为例看书签样式问题,注意第4行,第2章 机器学习,标号与标题中间有两个空格;第6行,2.1.1有监督机器学习,标号与标题中间则没有空格;第11行,第3章 基于TensorFlow用Keras做深度学习,里面的英文单词是应该首字母大写还是按原样输出,后面的附录那节同第一个问题。

    这个按照每个人的审美不同,具体怎么弄,得看你们自己的选择

    ​ 个人的审美是,标号与标题之间只留一个空格,英文单词全部统一成小写,虽然按原样输出就挺不错的,但加了这么多PDF的书签,最终还是选择统一单词的风格,结果如下图

  • 页码偏移

    ​ 超星的书签应该也是从目录这部分OCR提取的,见下图,但其中的页码和实际的页码有偏移(因为目录里面的页码是从正文开始算的,而实际的书签引用页码必须是从第一开始的绝对页码),第二章在目录里是页码是6,而实际绝对页码是16,二者相差10,加书签时必须补上这个页码,见第二张图。

    ​ 所有正文之后的页码必须+10进行修正,如下图

1.3 工具使用限制

​ 在最开始已经介绍,本工具只能进行书签部分格式化,还有一部分是需要手工操作的,特别是对于从非书签获取小工具2015.05.05【晴天软件】获得的书签,程序处理会有很大问题,,,

  • 书签获取小工具2015.05.05【晴天软件】获取书签

    ​ 如下图红框,书签层级是通过数字标号来定位的,但如下图框中,书签部分前面没有标号,所以没办法分层级。最后的处理办法是对所有不能通过其特定标识分层级的,全部默认分到二级书签。之后就得自己去修正正确的层级。

  • 从其它处获得的书签

    ​ 如下图,一些新书是没有录入库的,只能从其它地方拿书签了。

    ​ 下面是从京东商城的商品界面,可以看到目录,

    ​ 复制到TXT文档里面,可以发现其中标签与页码之间有点符号,另外还有空行,如果需要用这个书签的话,这个需要把里面的点符号还有空行删了,这个需要用到正则表达式进行替换,不过注意别把书签的数字标号之间的点删除了。

    ​ 试着把这个txt格式化一下,如图,箭头所指的点没删除,后面有时间再优化这个问题了

二、使用方式

2.1 工具介绍

  1. 工具结构

    #目录树
    .
    ├── Config 
    │   └── config.yaml  #配置文件
    ├── Notepad3
    │   ├── Notepad3.exe  #协同工具-文本编辑器
    │   ├── Notepad3.ini
    │   └── lng
    │       ├── np3lng.dll
    │       └── zh-CN
    │           └── np3lng.dll.mui
    ├── format_bookmark.py  #代码-格式化书签
    ├── pdf_add_bookmark_semi.exe #代码-打包的exe
    ├── pdf_add_bookmark_semi.py  #代码-加书签
    └── 书签获取小工具2015.05.05【晴天软件】.exe  #协同工具-书签获取工具
    

    主要是三部分:代码(format_bookmark.pypdf_add_bookmark_semi.pypdf_add_bookmark_semi.exe)、配置文件(Config/config.yaml)、以及协同工具(Notepad3/Notepad3.exe书签获取小工具2015.05.05【晴天软件】.exe

    • 代码

      一个用来格式化书签format_bookmark.py,另一个用来加书签pdf_add_bookmark_semi.py,最终打包成pdf_add_bookmark_semi.exe,具体分析见第三节

      主要实现功能

      1. 可加4级书签
      2. 书签格式化规则可自己配置
    • 配置文件

      Config/config.yaml,里面用于配置编辑器的启用、使用哪个编辑器、首字母是否小写、以及最重要的书签格式化规则,具体的看配置文件吧

    • 协同工具

      协同工具一个是文本编辑器Notepad3也就是上图所示的软件,另一个是书签获取小工具2015.05.05【晴天软件】.exe),第一节也介绍了,不过这个软件会报毒,加了VMP的壳,这软件我也不知道是谁写的,,,应该没毒吧,15年开发的,很多人也用了很久了。如果被杀软杀了,记得加信任区。

2.2 半个图形化界面---可双击执行

  1. SS号

    ​ 上面有介绍通过油猴脚本获取的方式,这里再介绍一个网站:http://115.159.153.83:19777/index.html
    在上面直接搜索书名,可获得ss号。

  2. 书签获取

    务必保存到要加书签的pdf的那个文件夹,另外txt文件名要与pdf相同

  3. 加书签

    双击pdf_add_bookmark_semi.exe,会弹出控制台界面

    用法,上面也提了,要输入书签文件名(txt那个文件)、正文页偏移以及目录页码(这个参数可选)

    直接将txt书签文件拖到控制台界面,然后填好页偏移10

    书签和页偏移之间要留空格

    回车,会进行初步格式化,然后弹出书签编辑页面,之后进行修正

    附录那要改成一级书签,并去掉多余空格,书签规定看1.2.2书签格式化那节

    按上图改完之后,记得关闭编辑器,然后到了加书签界面,输入y是加,n是不加书签

    输入y,回车加书签(记得加书签的时候,pdf不能被其它应用使用)

    按回车,退出,一切OK

  4. 加书签的程序也能发送到桌面,创建快捷方式,直接双击

2.3 命令行

和上面一样的,只是前面多了执行的解释器和py文件,另外注意安装Python模块pikepdf、colorama

python pdf_add_bookmark_semi.py "C:\Users\acer\Desktop\Notes\安全\Blog\test\人工智
能在信用债投资领域的应用 Python语言实践.txt" 10

三、代码实现

下次吧,写文档也累了

Github链接:https://github.com/Davy-Zhou/pdf_add_bookmark_semi

四、TODO

有关半自动化给PDF加书签-Python实现-可双击执行-上篇的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby-on-rails - Prawn PDF : I need to generate nested tables - 2

    我需要一个表,其中行实际上是2行表,一个嵌套表是..我怎样才能在Prawn中做到这一点?也许我需要延期..但哪一个? 最佳答案 现在支持子表:Prawn::Document.generate("subtable.pdf")do|pdf|subtable=pdf.make_table([["sub"],["table"]])pdf.table([[subtable,"original"]])end 关于ruby-on-rails-PrawnPDF:Ineedtogeneratenested

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐