我用 python 写了个命令行 pdf 目录编辑器

628 阅读2分钟

简介

当你辛辛苦苦地从网上搜到了 pdf 资源,准备开始无纸化学习的时候。突然发现搜到的 pdf 竟然没有目录。当需要跳转到其他章节的时候只能凭感觉乱翻。阅读这种没有目录的 pdf 非常影响使用体验。而当你想要手动编辑目录时你会发现,很多 pdf 阅读器是没有目录编辑功能的。即使是手动给 pdf 添加书签也很不方便。

为解决这个问题,我用 python 写了一个基于 pikepdf 的命令行 pdf 目录编辑器。从此只要一条命令就能将目录添加到 pdf 中。有了自己编辑目录的能力之后再去阅读 pdf 无疑会方便很多。

介绍

项目网址: pdf-outline

项目特性:

  • 类型提示友好。
  • 业务代码简单清晰。不用那些会让代码变得像被混淆过似的“高级技巧”。
  • 核心功能维护测试。确保功能可用。
  • 有 Dockefile 和 Makefile 这种 “贼有意思的” 小功能。

使用

  1. 克隆并打开项目目录。在项目路径下创建 data 目录。

  2. 把待处理的 pdf 复制 到 data 目录下并重命名为 "原文件.pdf".

  3. 手动提取 pdf 的目录页内容。处理成下图的格式后保存到 “目录.txt” 中。

  4. 配置工程依赖环境。可以用 docker compose 或 venv 进行环境管理。相关命令都写在 Makefile 中。

  5. 执行 python main.py -o offset 生成结果文件。其中 offset 为目录第 1 页的 pdf 的页号。

    "项目路径/data/结果.pdf" 即为修改后的 pdf 文件。

正则可视化

问题

pikepdf 目前还不支持 m 系列处理器的 mac。但可以通过 docker + vscode 容器开发的形式绕过这个限制。

Q&A

  • 为什么我觉得我的目录文件格式没有错误。但还是会报错?

    目录文件分隔符要求使用制表符。而有的文本编辑器会将 tab 转换为 4 个空格。用文本替换功能替换回来即可。

  • 为什么打开生成的 pdf 后发现目录与实际的页数并不匹配?

    因为存在封面以及目录页。pdf 的第 1 页并不代表目录上的第 1 页。需要手动添加偏移量来修正这个问题。

  • 我如何处理”目录“页的导航?

    目录文件的目录页号支持负数。只要手动算一下页号就行了。

  • 为什么有些 pdf 在电脑上可以显示目录,在平板上却无法显示?

    这多半是因为 pdf 目录的格式错了。可以先将 pdf 目录读取出来。手动修改后再写回原文件中。