You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python给带内部超链接的PDF添加页码并保留超链接?

给带内部超链接的PDF加页码且保留链接的解决方法

问题根源

你当前用PyPDF2生成临时页码PDF再合并的方式,会弄丢原PDF的内部超链接——因为PyPDF2的merge_page操作没法完整保留原页面的交互注释元素(超链接就属于这类)。

可行方案:用PyMuPDF直接添加页码

PyMuPDF(别名fitz)对PDF的内容和交互元素兼容性更好,能直接在原页面上画页码,完全不破坏原有超链接。

先装依赖

pip install pymupdf

完整代码

import fitz  # PyMuPDF

def add_page_numbers(pdf_path, output_path=None, start_page=1, page_num_format="{page}", bottom_margin=13, font_size=8):
    # 不指定输出路径就覆盖原文件
    if not output_path:
        output_path = pdf_path
    
    # 打开目标PDF
    doc = fitz.open(pdf_path)
    total_pages = len(doc)
    
    for page_idx in range(total_pages):
        page = doc[page_idx]
        # 计算当前显示的页码(支持自定义起始页)
        current_page = page_idx + start_page
        # 生成要显示的页码文本,支持带总页数的格式
        num_text = page_num_format.format(page=current_page, total=total_pages)
        
        # 获取页面尺寸,计算页码位置:居中,距离底部指定毫米数(转成PDF的点单位,1mm≈2.83465点)
        page_rect = page.rect
        x_pos = page_rect.width / 2
        y_pos = page_rect.height - bottom_margin * 2.83465
        
        # 在页面上插入页码文本
        page.insert_text(
            (x_pos, y_pos),
            num_text,
            fontsize=font_size,
            fontname="helv",  # 对应Arial字体
            align=fitz.TEXT_ALIGN_CENTER,
            color=(0, 0, 0)  # 黑色字体
        )
    
    # 保存修改后的PDF
    doc.save(output_path)
    doc.close()

# 使用示例
if __name__ == "__main__":
    # 仅显示单页码
    add_page_numbers("你的输入文件.pdf", "加完页码的输出文件.pdf")
    # 显示"第X页/共Y页"格式的页码
    # add_page_numbers("你的输入文件.pdf", "加完页码的输出文件.pdf", page_num_format="第{page}页/共{total}页")

代码说明

  • 直接操作原PDF页面,在内容层添加页码,完全保留原页面的所有元素(包括内部超链接)。
  • 支持自定义页码格式、起始页码、底部边距和字体大小,灵活适配不同需求。
  • 不需要生成临时PDF,流程更简单高效。

原代码丢链接的原因

你用inputPage.merge_page(page)合并原页面和页码页面时,PyPDF2的合并逻辑优先处理页面内容,原页面的交互注释(超链接属于这类)会被忽略或覆盖,最终导致链接丢失。而PyMuPDF的操作是在原页面内容上叠加文本,不会影响页面的注释和交互元素。

内容的提问来源于stack exchange,提问作者Yaoming Liu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:43:11