getOutlines()检索文档中存在的文本大纲,返回的对象是一个嵌套的列表
举个例子 ,加入你的pdf文档的目录如下图所示
那么使用getOutlines()读取出来的嵌套列表为
{
'/Title'
:
'第1章 绪论'
,
'/Page'
:
IndirectObject
(
16
,
0
)
,
'/Type'
:
'/Fit'
}
,
[
{
'/Title'
:
'1.1模块与接口'
,
'/Page'
:
IndirectObject
(
16
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'1.2 工具和软件'
,
'/Page'
:
IndirectObject
(
18
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'1.3树语言的数据结构'
,
'/Page'
:
IndirectObject
(
18
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'程序设计:直线式程序解释器'
,
'/Page'
:
IndirectObject
(
22
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'推荐阅读'
,
'/Page'
:
IndirectObject
(
23
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'习题'
,
'/Page'
:
IndirectObject
(
24
,
0
)
,
'/Type'
:
'/Fit'
}
]
,
{
'/Title'
:
'第2章 词法分析'
,
'/Page'
:
IndirectObject
(
25
,
0
)
,
'/Type'
:
'/Fit'
}
,
[
{
'/Title'
:
'2.1词法单词'
,
'/Page'
:
IndirectObject
(
25
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'2.2正则表达式'
,
'/Page'
:
IndirectObject
(
26
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'2.3有限自动机'
,
'/Page'
:
IndirectObject
(
28
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'2.4非确定有限自动机'
,
'/Page'
:
IndirectObject
(
30
,
0
)
,
'/Type'
:
'/Fit'
}
,
[
{
'/Title'
:
'2.4.1将正则表达式转换为NFA'
,
'/Page'
:
IndirectObject
(
31
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'2.4.2将NFA转换为DFA'
,
'/Page'
:
IndirectObject
(
33
,
0
)
,
'/Type'
:
'/Fit'
}
]
,
{
'/Title'
:
'2.5 Lex:词法分析器的生成器'
,
'/Page'
:
IndirectObject
(
35
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'程序设计:词法分析'
,
'/Page'
:
IndirectObject
(
37
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'推荐阅读'
,
'/Page'
:
IndirectObject
(
38
,
0
)
,
'/Type'
:
'/Fit'
}
,
{
'/Title'
:
'习题'
,
'/Page'
:
IndirectObject
(
38
,
0
)
,
'/Type'
:
'/Fit'
}
]
总结一下就是书签是一级目录时, 其在列表中是一个字典;二级目录是在列表中再嵌套一个列表;三级目录是在二级目录的列表中再嵌套一个列表,以此类推。
我们的目的是读出所有字典中的‘/Title’键所对应的值,可以使用递归函数实现该功能。当列表中的值不是列表变量而是字典变量时,取出字典中‘/Title’键所对应的值,存储起来
from PyPDF2 import PdfFileReader as pdf_read
#每个书签的索引格式
#{'/Title': '书签名', '/Page': '指向的目标页数', '/Type': '类型'}
directory_str = ''
def bookmark_listhandler(list):
global directory_str
for message in list:
if isinstance(message, dict):
directory_str += message['/Title'] + '\n'
# print(message['/Title'])
else:
bookmark_listhandler(message)
with open('现代编译原理.pdf', 'rb') as f:
pdf = pdf_read(f)
#检索文档中存在的文本大纲,返回的对象是一个嵌套的列表
text_outline_list = pdf.getOutlines()
bookmark_listhandler(text_outline_list)
with open('现代编译原理目录.txt', 'w', encoding='utf-8') as f:
f.write(directory_str)
python 从PDF文件中读取书签/目录一级目录二级目录三级目录使用python3 , 需导入PyPDF2模块from PyPDF2 import PdfFileReader as pdf_read#每个书签的索引格式#{'/Title': '书签名', '/Page': 指向的目标页数, '/Type': '类型'}directory_str = ''def bookmark_listhandler(list): global directory_str fo
java -jar PdfToc.jar -i "file.pdf" ["toc.txt"]
获取 ToC 并在 toc.txt 中打印:
java -jar PdfToc.jar -i "file.pdf" "toc.txt"
获取 ToC 并在标准输出中打印:
java -jar PdfToc.jar -i "file.pdf"
输出格式:
页码级标题
'''PageNumber''' - pdf 文件的页面。 第一个页面文件是 1(不是 0)。
'''level''' - 标题级别。 0 - 是根级别,1 - 下一级,...
对于pdf文件的相关操作,PyPDF2文档中具有许多功能,阅读完本文后相信你会对pdf的操作变得非常自信!!
https://pythonhosted.org/PyPDF2/
该网址是PyPDF2英文文档的链接,本人从中提取了相应数据,并制作成表格方便比较和分析。
一、准备工作
1.安装PyPDF2
本文采用在pycharm中安装,左上角File---Settings---找到Project---Python interpreter---点击+
---输入pypdf2(大小写均可)---点击in
理论知识:http://stackoverflow.com/questions/4643489/how-do-i-retrieve-a-page-number-or-page-reference-for-an-outline-destination-in
原理就是:通过CGPDFDocumentGetCatalog方法可以获取pdf的元信息,这是一个类似Dictionary的结构,而目录信息
拿到一个没有目录的pdf,因为实在太不爽……所以想有没有办法自动化的方法可以生成目录QUQ,查了查果然acrobat有js的api可以提供,但是写完之后发现只能在acrobat上面能索引QUQ,其他的阅读器都不能用索引……只能看见目录……真真不爽!!(*  ̄︿ ̄)
先说下思路吧……挺傻的……一般当当这样卖书的地方都有书的目录和页码,这个很好找的嘛。然后copy到txt里,先用python把它变成
用python实现ppt(或pptx)文件转pdf文件
用python实现合并多个pdf文件为一个文件
用python实现对txt目录文件排版的改变(未完成)
用python实现多个txt目录文件的合并(未完成)
二、具体功能实现
文件夹结构框图
function1:为PDF文件添加书签
所需python库:pyPDF2(自己安装)、os、tkinter
# import
from PyPDF2 import PdfFileReader
有时候我们用的一些pdf资料是没有目录的,这样找寻我们想到的东西比较麻烦。本篇文章就为大家带来python来生成pdf目录书签的方法。
首先,我们需要下载一个软件FreePic2Pdf,利用它我们可以将我们的pdf文件导入书签
工具下载:https://www.jb51.net/softs/57870.html
然后,我们需要获取原始版本的目录,这个可以到京东上找到书籍,查看目录,把其中的目录复制到一个txt文件中即可,或者有些pdf允许复制,也可以直接把目录复制下来。
复制之后假设存到aa.txt文件中:
接下来的,就是利用python读取txt来实现目录生成:
代码还是比较简单的,