半自动化给PDF加书签、目录-Python实现-可双击执行-上篇
本帖最后由 ZDavy 于 2022-12-3 12:58 编辑半自动化给PDF加书签、目录-Python实现-可双击执行-上篇
2022年11月22日更新 v0.60
下载链接:https://github.com/Davy-Zhou/pdf_add_bookmark_semi/releases/download/v0.60/pdf_add_bookmark_semi.v0.60.zip
如果觉得好用请Star:https://github.com/Davy-Zhou/pdf_add_bookmark_semi
针对页偏移无法识别时,增加页偏移输入选项,无需重开程序
针对多个PDF要加书签情况,完成一个PDF加书签后,无需重开,回车即可给下一个PDF加书签
书签格式化库规则更新https://camo.githubusercontent.com/14aa042fa46d60c486076296fa2ed6795a775230dd80e2b374d11edc458e3c42/68747470733a2f2f73362e6a70672e636d2f323032322f30382f31392f5036664658692e676966
新更新:新增自动化获取书签和识别PDF页偏移功能,v0.51
https://s6.jpg.cm/2022/08/15/PlVOxf.png
链接:https://github.com/Davy-Zhou/pdf_add_bookmark_semi/releases/tag/v0.51
https://davy.lanzoub.com/b011viwih
密码:9hl7
本工具用途,可用于给没有书签的PDF加书签,主要应用于扫描版PDF,工具主要实现是格式化书签和加书签,
书签获取需要配合其它的软件,后期会考虑尽量在获取书签时自动化,页偏移部分也可自动化,格式化规则库
也会按大家的需求更新,当然也可自已加。完整的博客截图放在最后面了,图片大多了,真传不过来。
https://s1.ax1x.com/2022/07/31/vFelw9.png
工具界面
https://s1.ax1x.com/2022/07/29/vipDr6.png
加了书签的示例
https://s1.ax1x.com/2022/07/23/jXtLt0.png
先前加书签的使用效果:https://www.52pojie.cn/thread-1665120-1-1.html
后面的部分,转成PDF放到网盘链接里面了
我把整个PDF转成图片了,看一下最后的图片,包含全部内容
如果访问不了,github也传了一份: https://github.com/Davy-Zhou/pdf_add_bookmark_semi
完整博客截图,github上也传了代码
# format_bookmark.py
import subprocess
import re
import sys
#import os
from yaml import safe_load
from chardet import detect
# example
# input: python duxiu_regex.py C语言大学实用教程第4版.txt 17 12
# 3个参数 书签内容文件名 正文页偏移 目录页码
def format_bookmark():
config_path=sys.argv
txt_filename=sys.argv
page_offset_number=sys.argv
if len(sys.argv)==4 :
directory_number=sys.argv
# print('打开config.yaml','\n')
# input('调试\n')
with open(config_path+'\\Config\\config.yaml','r',encoding='utf-8') as f:
# print(config_path+'\\Config\\config.yaml'+'\n')
# input('调试\n')
config=safe_load(f)
# 检测编码GB18030、utf-8
with open(txt_filename,'rb') as f:
data = f.read()
file_encoding = detect(data)['encoding']
with open(str(txt_filename), 'r', encoding=file_encoding, errors = 'ignore') as f:
str_list = f.read()
# 书签格式化
for i in range(len(config['rules'])) :
for j in range(len(config['rules']['rule'])):
regex_search=config['rules']['rule']['regex_search']
regex_repalce=config['rules']['rule']['regex_repalce']
if config['rules']['rule']['loaded'] and regex_search!=None and regex_repalce!=None:
regex_compiled = re.compile(regex_search, re.M)
str_list_re = regex_compiled.sub(regex_repalce, str_list)
str_list = str_list_re
# 加页偏移,后面有页偏移是动态变量加不进yaml
regex_page_offset = re.compile(r'(\d+)$', re.M)
str_list = regex_page_offset.sub(r'\1\t+'+str(page_offset_number),str_list)
# 路径保留空格
filename=str(txt_filename).split('\\')[-1]
path_name=str(txt_filename).split(filename)
# 文件名去空格?
add_bookmark_filename = path_name+filename.replace(' ', '').split(
'.txt')+r"(Bookmark)"+"."+filename.replace(' ', '').split('.')[-1]
with open(add_bookmark_filename, 'w+', encoding='utf-8-sig') as fw:
if len(sys.argv) == 4:
if config['first_letter_lower']:
fw.write('目录\t'+str(directory_number)+'\n'+str_list.lower())
else:
fw.write('目录\t'+str(directory_number)+'\n'+str_list)
elif len(sys.argv)==3:
if config['first_letter_lower']:
fw.write(str_list.lower())
else:
fw.write(str_list)
# 初次格式化完书签,再次使用Notepad3编辑修正
print("\n书签部分格式化完成,请在打开的编辑器修正书签文件,并\033[0;31;40m修正完后关闭编辑器!\033[0m\n")
if config['enable_editor']:
editor_path=(config['editor_path'] if ':'in config['editor_path'] else config_path+config['editor_path'])
subprocess.run()
if __name__ == "__main__":
format_bookmark()
#pdf_add_bookmark_semi.py
import sys
import format_bookmark as fbk
from pikepdf import Pdf, OutlineItem
from colorama import init
import os
def pike_add_bookmark():
txt_filename=sys.argv
pdf_name = str(txt_filename).split('.txt')+"."+"pdf"
filename=str(txt_filename).split('\\')[-1]
path_name=str(txt_filename).split(filename)
bookmark_filename = path_name+filename.replace(' ', '').split(
'.txt')+r"(Bookmark)"+"."+filename.replace(' ', '').split('.')[-1]
with Pdf.open(pdf_name,allow_overwriting_input=True) as pdf:
with pdf.open_outline() as outline:
outline.root.clear() # 清空原PDF书签
with open(bookmark_filename, 'r', encoding='utf-8-sig') as fb:
for line in fb.readlines():
txt_line = line.split('\t')
offset=''
if len(txt_line)>1:
offset = ((int(txt_line[-2]) + int(txt_line[-1]))
if txt_line[-2].isdigit() elseint(txt_line[-1]))-1
# 一级书签
# Page counts are zero-based
if txt_line != '':
L1_item = OutlineItem(txt_line, offset)
outline.root.append(L1_item)
# 二级书签
elif txt_line != '':
L2_item = OutlineItem(txt_line, offset)
L1_item.children.append(L2_item)
# 三级书签
elif txt_line != '':
L3_item = OutlineItem(txt_line, offset)
L2_item.children.append(L3_item)
# 四级书签
elif txt_line != '':
L4_item = OutlineItem(txt_line, offset)
L3_item.children.append(L4_item)
pdf.save(pdf_name)
if __name__ == "__main__":
# 方便双击使用
init()
if len(sys.argv)==1:
print("\n请按格式输入:\033[0;32;40m书签内容文件名 正文页偏移 目录页码(参数可选)\033[0m\n")
print("使用示例:\033[0;32;40m\"C语言大学实用教程第4版.txt\" 10 7 \033[0m\n\n")
params =input("请输入: ").split('\"')
# print(params,'\n')
# input('调试\n')
py_dirname, py_name = os.path.split(os.path.abspath(sys.argv))
sys.argv.clear()
sys.argv.extend()
sys.argv.extend(])
sys.argv.extend(params[-1].split())
# print(sys.argv,'\n')
# input('调试\n')
else:
py_dirname, py_name = os.path.split(os.path.abspath(sys.argv))
sys.argv=py_dirname
filename=str(sys.argv).split('\\')[-1].replace('txt','pdf')
# print(filename,'\n')
# input('调试\n')
if len(sys.argv)<3 :
print("\n错误:参数不足\n使用示例:\"C语言大学实用教程第4版.txt\" 17 12\n或者:\"C语言大学实用教程第4版.txt\" 17\n")
sys.exit()
# print('进入format_bookmark','\n')
# input('调试\n')
fbk.format_bookmark()
print("是否给《\033[0;32;40m"+filename+"\033[0m》加书签(Y/N)?\n")
is_add_Bookmark=input()
if is_add_Bookmark.lower() != 'y':
print("\n仅完成书签部分格式化!\n")
print("\033[0;32;40m按Enter键退出!\033[0m\n")
input()
sys.exit()
pike_add_bookmark()
print("\n\033[0;32;40m"+filename+"\033[0m 加书签完成!\n\n")
print("\033[0;32;40m按Enter键退出!\033[0m\n")
input()
https://s6.jpg.cm/2022/07/31/PQVUbf.png
https://s6.jpg.cm/2022/07/31/PQVb4U.png
jokerswift 发表于 2022-8-1 15:57
楼主提个建议哈,一个是offset能不能自定义,有的上下册的pdf是分开的,下册的目录上的页数不是从1页开始的 ...
清空原PDF书签,这个功能已经加到贴子的代码里面了,就一行代码
outline.root.clear()
,pdf_add_bookmark_semi.py那个文件第17行,我暂时不会提到github里面,整体的架构可能要改改,最开始拓展性没考虑好,添加这一行代码,里面很多东西都要受到影响,可能要两三天吧,如果你需要,自己加进去吧。
https://imagelol.com/content/images/users/IyquH/bkg_1659330540.png Rocky10 发表于 2022-8-6 21:05
https://u.xueshu86.com/10075587.html
这个商家已经抓取了全部的书签,楼主研究下,是否可实现全自动化。
我看了下那个链接,书签只有部分显示,要全部显示,需要购买才行;抓包看了下,那个返回的书签应该也只返回了部分,完整的书签还在服务端,不付费拿不到。另外是超星的那个书签接口,我技术太菜了,分析不出来,后面我试一下用程序模拟点击的方法,把书签获取那部分尽量自动化了{:1_893:} 为什么叫半自动化a 支持支持 扫描生成的PDF怕是不能实现吧
技术贴一定要顶 学习。。。 感谢楼主分享 必须支持,谢谢大佬的分享。。。 技术贴一定要顶 sam喵喵 发表于 2022-7-31 00:32
为什么叫半自动化a
仔细看1.3节使用限制,书签获取,暂时只能手工,书签格式化,在规则库没丰富之前,有部分格式得自己调