给 pdf 电子书加目录 (PyMuPDF)

之前帖子 完全用 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")
5赞

补充一个 C++/MuPDF 写的目录提取器

HandyOutliner 也不错的