批量自动化生成PDF目录标签
所需软件:
1. FreePic2Pdf(网上很容易找到)
2. python3
3. 天若OCR
搜狗OCR配置:https://tianruoocr.cn/interface/Txt_sougou.html
免费版调用的是百度的OCR,对于这种目录的识别效果不好,经过尝试发现只有搜狗的效果是最好的,所以如果有需要还是购买专业版,然后配置搜狗的OCR
实现方法:
1. 提取书签内容文本

许多英文书籍PDF的文字是可以直接复制粘贴的,这种情况比较好处理,直接复制出来,暂时保存到文本中。
如果为扫描版PDF,则可以用上面提供的天若OCR进行识别,然后提取文字内容,识别率挺高,不算太麻烦。
最后得到目录内容:

如果是用OCR软件识别的内容,有时候会有一些多余的符号,影响下面python脚本的运行,最常见的是:
1)目录出现换行,导致该行最后一个字符不是数字,脚本无法正确运行,会报错;
2)行末的数字前出现一些多余符号,也会影响脚本运行,一个个手动修改太麻烦,可以在VScode里用vim批量操作。如:


上面输入的替换命令为:
%s/…/ /g
用vim里:模式下的替换命令,上面表示把…全部替换成空格。注意VScode里的vim插件可以在替换命令里粘贴内容,但是我在terminal的vim里似乎不行,有些字符奇怪字符有时候不知道怎么打,可以直接粘贴过去。
%s/(待替换内容)/(替换内容)/g

2. 在同一工作目录下运行如下python脚本
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
'''
@Author: Yin Weijie
@Date: 2018.5.25
@Description:
替换页码
@Revised Date: 2019.3.7
@Description:
在次级目录前加tab
''' fin = open("aa.txt", "r")
fout = open("bb.txt", "w") for each_line in fin:
list = each_line.split()
for i in range(len(list) - 1): #倒数第一个元素是数字,先不放
if (list[i] == '.'):
continue
# 这里章数默认不超过两位数
if ((len(list[i]) > 1 and list[i][1] == '.') or (len(list[i]) > 2 and list[i][2] == '.')):
fout.write('\t')
fout.write(list[i])
fout.write(' ')
# print(list[i])
fout.write('\t')
num = int(list[-1]) + 0 #单独处理倒数第一个数字
fout.write(str(num)) fout.write("\n") fin.close()
fout.close()

得到文件bb.txt的内容:

这里实际上就是做一个文本替换,为后面FreePic2Pdf使用作准备。因为FreePic2Pdf只能识别固定格式的书签内容,主要有如下几方面需要修改:
1)页码是PDF中的绝对页码,通常需要加减一个差值,但是这个PDF的排版比较特殊,书中的页码内容和PDF绝对页码内容一致,否则上面python代码中
num = int(list[-1]) + 0 #单独处理倒数第一个数字
这一行加的数字应该是PDF绝对页码和书籍页码的差值。
2)页码数字和前面的文字之间应该是\tab,而不是空格。
3)每行行首也可以加\tab,表示次级目录。也可以加多个\tab增加更多目录层级,这里只做了一个次级目录。
3. 用FreePic2Pdf批量插入标签



会在该PDF文件所在目录生成一个新的目录,包含如下文件:

打开上面的txt文件,把之前生成的bb.txt中的内容贴进去,保存。然后再回到FreePic2Pdf软件:

经过上面操作,就能成功添加标签了。

批量自动化生成PDF目录标签的更多相关文章
- doc文档生成带目录的pdf文件方法
准备软件: 福昕PDF阅读器 下载地址:http://rj.baidu.com/soft/detail/12882.html?ald 安装福昕PDF阅读器,会自动安装pdf打印机. 准备好设置好各级标 ...
- 生成有目录的pdf
生成有目录的pdf 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://jingyan.baidu.com/article/ff411625c2153512e48237a ...
- php利用mpdf生成pdf并保存到目录
下载mpdf7.0两种方法 (1). github地址:https://github.com/mpdf/mpdf (2). composer require mpdf/mpdf <?php er ...
- 谈FME批量自动化数据转换方法
FME作为转换神器,支持几百种格式的互转,实现互操作化.从fme.exe执行方式入手,讨论Command命令式执行模板(.fmw/.fmwt)和脚本(.tcl/.py)实现自动化批量转换. 1.fme ...
- 电子凭证 : Java 生成 Pdf
来源:蛙牛, my.oschina.net/lujianing/blog/894365 如有好文章投稿,请点击 → 这里了解详情 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中 ...
- Itext生成pdf文件
来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...
- Java iText+FreeMarker生成PDF(HTML转PDF)
1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打印.目前常用的解决方案是,把相关数据信息,生成对应的pdf文件返回给用户. ...
- 使用puppeteer生成pdf与截图
之前写过一篇 vue cli2 使用 wkhtmltopdf 踩坑指南,由于wkhtmltopdf对vue的支持并不友好,而且不支持css3,经过调研最终选择puppeteer,坑少,比较靠谱. 一. ...
- html 生成pdf
HTML生成PDF(c#) 最近因为工作需要,小小的研究了一下HTML生成PDF的方法,这方面的内容很多,但要么是不尽如人意的方法,要么就是那种收费的类库!为了广大.neter的福利,把自己的一点小小 ...
随机推荐
- LWIP内存管理
LWIP是一种TCP/IP协议栈,与嵌入式操作系统一样也提供了内存管理. 内存池里面有多个同样大小的内存,不同类型的内存池其里面的内存大小不一样.
- Spark 0.9.1和Shark 0.9.1分布式安装指南
目录 目录 1 1. 约定 1 2. 安装Scala 1 2.1. 下载 2 2.2. 安装 2 2.3. 设置环境变量 2 3. 安装Spark 2 3.1. 部署 2 3.2. 下载 3 3.3. ...
- RegularExpression
目录 文章背景 目录 概述 基本概念 目的 特点 符号 实例 说明 参考文章 版本记录 layout: default title: RegularExpression category: [Tech ...
- 编写高质量代码改善C#程序的157个建议——建议152:最少,甚至是不要注释
建议152:最少,甚至是不要注释 以往,我们在代码中不写上几行注释,就会被认为是钟不负责任的态度.现在,这种观点正在改变.试想,如果我们所有的命名全部采用有意义的单词或词组,注释还有多少存在的价值. ...
- JavaScript学习总结——转
JavaScript学习总结(一)——JavaScript基础 JavaScript学习总结(二)——逻辑Not运算符详解 JavaScript学习总结(三)——逻辑And运算符详解 JavaScri ...
- Android--iOS抓取崩溃日志
android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...
- logback 配置详解——logger、root
目录 1.根节点包含的属性 2.根节点的子节点 2.1.设置上下文名称: 2.2.设置loger.root 正文 回到顶部 1.根节点<configuration>包含的属性 scan: ...
- Java内存模型(转载)
本文章节: 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很 ...
- 使用 JAVA 中的动态代理实现数据库连接池
数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...
- XJOI3602 邓哲也的矩阵(优先队列优化DP)
题目描述: 有一个 n×m的矩阵,现在准备对矩阵进行k次操作,每次操作可以二选一 1: 选择一行,给这一行的每一个数减去p,这种操作会得到的快乐值等于操作之前这一行的和 2: 选择一列,给这一列的每一 ...