之前帖子 完全用 Linux 工作 之 给 pdf 电子书加目录 里面的脚本有一点问题: pdftk 早年是 perl 写的直接解析 pdf,功能有限,后来用 java 改写的版本底层用的是上古时代的 itext ,功能同样有限,暴露出来的功能就更少了。通过 pdftk 操作 pdf 的上限直接就到头了。
于是用 mupdf 改写了一下,这下可能性就无穷高了。
依赖是 pip install PyMuPDF
. 只需要一个命令 toc.py ./[a.pdf] < [toc.txt]
。
输入文件 [toc.txt] 还有相关的资料参考之前的帖子。
#!/usr/bin/env python3
import fitz, sys
if __name__ == '__main__':
doc = fitz.Document(sys.argv[1])
offset=int(input())
# set pages before offset to roman number and
# set pages after the offset to demical numbers
fitz.utils.set_page_labels(doc,
[{'startpage': 0, 'prefix': '', 'style': 'r', 'firstpagenum': 1},
{'startpage': offset, 'prefix': '', 'style': 'D', 'firstpagenum': 1}])
line = ""
toc=[]
while True:
try:
line = input()
if not line.strip():
break
except EOFError:
break
# calculate tab numbers and plus one
level = len(line) - len(line.lstrip()) + 1
title = " ".join(line.split()[0:-1])
page = int(line.split()[-1])
toc.append([level,title,page+offset])
fitz.utils.set_toc(doc,toc,collapse=0)
doc.save("output.pdf")