如何用Python解析PDF文档中的内部GoTo链接?
解析PDF内部GoTo超链接的方法
你之前用的PyPDF2、PdfPlumber之所以没成功,不是因为它们是OCR(其实它们不是),而是这类库对PDF内部链接的解析支持有限,尤其是复杂结构的文档。试试用PyMuPDF(别名fitz),它直接操作PDF的底层结构,能可靠提取GoTo类型的内部链接。
步骤1:用PyMuPDF提取内部链接
下面是直接能用的代码:
import fitz # 先通过pip安装:pip install pymupdf def get_internal_goto_links(pdf_path): doc = fitz.open(pdf_path) goto_links = [] # 遍历PDF每一页 for page_idx in range(len(doc)): page = doc[page_idx] # 获取当前页所有链接 links = page.get_links() for link in links: # 筛选GoTo类型的内部跳转链接 if link["kind"] == fitz.LINK_GOTO: # 整理关键信息:源页码、链接文本、目标页码(转成从1开始的计数) source_page = page_idx + 1 link_text = page.get_text(clip=link["from"]).strip() target_page = link["page"] + 1 goto_links.append({ "source_page": source_page, "link_text": link_text, "target_page": target_page }) doc.close() return goto_links # 调用示例 pdf_links = get_internal_goto_links("你的文档.pdf") for link in pdf_links: print(f"第{link['source_page']}页的「{link['link_text']}」 → 第{link['target_page']}页")
步骤2:基于链接构建知识图谱
提取到跳转关系后,用networkx可以快速构建有向图(知识图谱的基础),节点代表文档的小节/页码,边代表跳转关系:
import networkx as nx # 通过pip安装:pip install networkx def build_knowledge_graph(links): graph = nx.DiGraph() for link in links: # 用页码作为节点标识,也可以换成小节标题(如果能提取到的话) source_node = f"页面{link['source_page']}" target_node = f"页面{link['target_page']}" # 添加带标签的边(标签为链接文本) graph.add_edge(source_node, target_node, link_text=link["link_text"]) return graph # 调用示例 kg = build_knowledge_graph(pdf_links) print("知识图谱节点:", list(kg.nodes())) print("知识图谱跳转关系:", list(kg.edges(data=True)))
如果需要更细粒度的节点(比如按小节标题),可以在提取链接的同时,用PyMuPDF提取页面的标题文本,替换节点标识即可。
内容的提问来源于stack exchange,提问作者Shivam Goswami
相关产品推荐
相关产品推荐

