如何用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
相关产品推荐
相关产品推荐

