PDF目录生成

5 阅读1分钟

步骤

  1. 复制目录页内容,直接丢给ai
  2. 复制下面脚本,丢给ai,让生成新的脚本
# 1. 修改这个偏移量(印刷页 → PDF实际页码)
PAGE_OFFSET = 14
# 2. 修改这个目录列表(层级, 标题, 印刷页码)
ENTRIES: list[tuple[int, str, int]] = [
    (0, "第1章 …", 2),
    (1, "1.1 …", 4),
    # ...
]

# 下方代码通用,无需修改
def toc_page_to_index(toc_page: int, page_count: int) -> int:
    one_based = toc_page + PAGE_OFFSET
    idx = one_based - 1
    return max(0, min(idx, page_count - 1))

reader = PdfReader("in.pdf")
writer = PdfWriter()
for page in reader.pages:
    writer.add_page(page)

stack: list[tuple[int, object]] = []
for level, title, toc_page in ENTRIES:
    page_index = toc_page_to_index(toc_page, len(reader.pages))
    while stack and stack[-1][0] >= level:
        stack.pop()
    parent = stack[-1][1] if stack else None
    ref = writer.add_outline_item(title, page_index, parent=parent)
    stack.append((level, ref))

with open("out.pdf", "wb") as f:
    writer.write(f)
  1. 执行脚本
> py scripts/add_react_design_pdf_bookmarks.py "XXXX.pdf"  
  
输入(不修改此文件): XXXX.pdf  
输出(请打开此文件看书签): XXXX_bookmarked.pdf  
  
处理中…  
[完成] 已写入 164 条书签。  
页码规则: PDF 页码(1-based) = 印刷页 + 14;当前 PDF 总页数 368。  
  
提示: 阅读器里请打开上面的「输出」文件;原文件没有书签。

  1. chrome打开pdf,逐个点击目录跳转,对照是否正常