Sign inSign up

xeden3/pdfbookmarkmaker

By xeden3

Updated 4 months ago

Image
0

157

xeden3/pdfbookmarkmaker repository overview

PdfBookmarkMaker

根据 Markdown 标题结构自动为 PDF 添加书签的 Docker 工具。

功能特性

  • 自动解析 Markdown 文件的标题层级(# 到 ####)
  • 智能匹配 PDF 中的标题位置(多级匹配策略)
  • 支持中英文混合文本处理
  • 自动处理中英文/数字间的空格
  • 支持中文 Unicode 变体字统一(200+ 种变体汉字)
  • 可选生成标题页(支持 HTML 样式)
  • 批量处理目录下所有 PDF 文件
  • 层级书签结构维护

目录结构

PdfBookmarkMakerDocker/
├── make_bookmarks.py    # 核心 Python 脚本
├── Dockerfile           # Docker 镜像配置
├── entrypoint.sh        # Docker 入口脚本
└── README.md            # 项目文档

快速开始

方式一:直接拉取镜像(推荐)

如果不想自行构建,可以直接从 Docker Hub 拉取预构建的镜像:

# 拉取最新版本
docker pull xeden3/pdfbookmarkmaker:v1.0

然后直接运行(无需构建):

docker run --rm \
  -v ./:/input \
  -v ./output:/output \
  xeden3/pdfbookmarkmaker:v1.0
3. 运行方式二:自行构建镜像

如果需要自定义或修改代码,可以从源码构建:

1. 构建 Docker 镜像
docker build -t xeden3/pdfbookmarkmaker:v1.1 .
2. 准备文件

在当前目录准备以下文件:

当前目录/
├── input/              # 输入目录
│   ├── document.pdf    # PDF 文件
│   └── document.md     # 对应的 Markdown 文件
└── output/             # 输出目录(会自动创建)
3. 运行
docker run --rm \
  -v ./:/input \
  -v ./output:/output \
  xeden3/pdfbookmarkmaker:v1.1

使用示例

基本用法

处理当前目录下所有 PDF 文件:

docker run --rm \
  -v ./:/input \
  -v ./output:/output \
  xeden3/pdfbookmarkmaker:v1.0
添加标题页

使用 -e TITLE 环境变量添加标题页:

docker run --rm \
  -e TITLE="<b>文档标题</b><br/><font size=16 color=grey>副标题</font>" \
  -v ./:/input \
  -v ./output:/output \
  xeden3/pdfbookmarkmaker:v1.1

标题页支持以下 HTML 标签:

  • <b> - 粗体
  • <i> - 斜体
  • <font size=xx> - 字体大小
  • <font color=xxx> - 字体颜色
  • <br/> - 换行
单文件模式

使用环境变量指定单个 MD 和 PDF 文件进行转换:

docker run --rm \
  -e INPUT_MD_FILE="/input/document.md" \
  -e INPUT_PDF_FILE="/input/document.pdf" \
  -e OUTPUT_PDF_FILE="/output/result.pdf" \
  -e TITLE="<b>文档标题ABC</b><br/><font size=16 color=grey>副标题</font>" \
  -v ./:/input \
  -v ./output:/output \
  xeden3/pdfbookmarkmaker:v1.0

参数说明:

  • INPUT_MD_FILE - MD 文件路径(必需)
  • INPUT_PDF_FILE - PDF 文件路径(必需)
  • OUTPUT_PDF_FILE - 输出 PDF 路径(可选,默认在输出目录生成 {原文件名}_bookmarked.pdf
  • TITLE - 标题页文本(可选)

Markdown 文件格式

工具会自动识别以下格式的标题:

# 一级标题
## 二级标题
### 三级标题
#### 四级标题
示例

假设 document.md 内容如下:

# 第一章 概述

这是第一章的内容...

## 1.1 背景介绍

本节介绍背景...

### 1.1.1 研究现状

本节讨论研究现状...

生成的书签将保持原有层级结构。

环境变量

变量名说明示例
INPUT_DIR输入目录路径/input(默认)
OUTPUT_DIR输出目录路径/output(默认)
TITLE标题页文本(支持 HTML)<b>标题</b>

算法说明

标题匹配策略

工具使用 4 级匹配策略查找 PDF 中的标题位置:

  1. 精确匹配 - 在正文页查找完整标题文本
  2. 全文回退 - 在整个文档中查找完整标题文本
  3. 关键词匹配(前10字符) - 如果完整匹配失败,使用前10个字符作为关键词
  4. 关键词匹配(前6字符) - 如果仍未匹配,使用前6个字符作为关键词
文本规范化

工具自动处理以下文本差异:

  • 中英文/数字之间的多余空格
  • 中文 Unicode 变体字(如「⼩」转换为「小」)
  • Markdown 标记(***、Emoji 等)

输出示例

运行成功后会显示处理进度:

========================================
  PdfBookmarkMaker Docker
========================================

处理: document
  PDF: /input/document.pdf
  MD:  /input/document.md
  OUT: /output/document_bookmarked.pdf
[1/5] 解析 MD 标题: document.md
  找到 15 个标题
[2/5] 在 PDF 中定位页码: document.pdf
  成功匹配 14/15 个标题
[3/5] 构建输出 PDF
[4/5] 添加书签(层级结构)
  L1 P1: 第一章 概述
  L2 P3: 1.1 背景介绍
  L3 P5: 1.1.1 研究现状
  ...
[5/5] 输出: /output/document_bookmarked.pdf
  完成

========================================
完成: 处理 1 个文件
输出目录: /output
========================================

依赖项

Docker 镜像
  • Python 3.11-slim
  • fonts-wqy-zenhei(文泉驿正黑字体)
  • fonts-wqy-microhei(文泉驿微米黑字体)
  • pypdf
  • reportlab
直接运行
  • Python 3.8+
  • pypdf
  • reportlab

已知问题

  • 部分 PDF 使用特殊字体可能导致匹配失败
  • 假设 PDF 前2页为目录页,会跳过该区域进行匹配

许可证

MIT License

Tag summary

Content type

Image

Digest

sha256:e24ec19dd

Size

73.8 MB

Last updated

4 months ago

docker pull xeden3/pdfbookmarkmaker:v1.0