使用Python抽取PDF页面生成新文件时如何移除其中的锚点链接与超链接
Python抽取PDF页面并删除所有锚点/超链接的实现方案
你当前使用的tmp_page['/Annots'].clear()方法存在两个局限性:
- 未做字段存在性校验,页面没有注释时会触发KeyError
- 只能清除注释类超链接,无法处理嵌入内容流的链接、文档级目录锚点、页面级跳转目标
方案1:基于PyPDF2的完善实现
适配你当前使用的PyPDF2库,优化后代码如下:
from PyPDF2 import PdfReader, PdfWriter from PyPDF2.generic import NameObject # 读取源PDF reader = PdfReader("你的源文件路径.pdf") writer = PdfWriter() # 配置需要抽取的页码,从0开始计数,示例抽取第1、3、5页 extract_page_indexes = [0, 2, 4] for page_num in extract_page_indexes: page = reader.pages[page_num] # 清除页面注释类链接 if "/Annots" in page: page[NameObject("/Annots")].clear() # 清除页面绑定的锚点跳转目标 if "/Dest" in page: del page[NameObject("/Dest")] writer.add_page(page) # 清除文档级别的目录、全局锚点配置 writer._root_object.pop("/Outlines", None) writer._root_object.pop("/Names", None) # 输出新PDF with open("生成的无链接文件.pdf", "wb") as f: writer.write(f)
注意:该方案对格式特殊、链接嵌入内容流的PDF兼容性一般,残留链接可使用第二种方案处理
方案2:基于PyMuPDF的高兼容实现
使用PyMuPDF(又称fitz)库可以彻底清除所有类型的链接,兼容性更强,处理更稳定。
首先安装依赖:pip install pymupdf
实现代码:
import fitz # 打开源PDF source_doc = fitz.open("你的源文件路径.pdf") # 新建空PDF存放抽取结果 new_doc = fitz.open() # 配置需要抽取的页码,从0开始计数,示例抽取第1、3、5页 extract_page_indexes = [0, 2, 4] for page_idx in extract_page_indexes: new_doc.insert_pdf(source_doc, from_page=page_idx, to_page=page_idx) # 清除所有页面的链接与注释 for page in new_doc: # 删除页面所有跳转链接 for link in page.get_links(): page.delete_link(link) # 可选:删除页面所有注释内容 for annot in page.annots(): page.delete_annot(annot) # 清除文档级目录锚点 new_doc.del_toc() # 保存优化后的PDF,garbage参数会清理无用残留数据 new_doc.save("生成的无链接文件.pdf", garbage=4, deflate=True) new_doc.close() source_doc.close()
内容的提问来源于stack exchange,提问作者Бекзод Абдураимов
相关产品推荐
相关产品推荐

