PDF 解析

封面、罗马数字和正文第一页:别把 PDF 页码弄混

页码标签规则使用 firstpagenum,而不是 start。封面只有前缀时,回读的规则字典可能省略 style;更有意义的验收是检查各物理页 get_label 的结果。显示标签不是唯一页面身份。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 这篇先解决哪一个问题 页码标签规则使用 firstpagenum,而不是 start。封面只有前缀时,回读的规则字典可能省略 style;更有意义的验收是检查各物理页 get_label 的结果。显示标签不是唯一页面身份。 自包含的合成示例 依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。 import pymupdf with pymupdf.open() as source: for _ in range(4): source.new_page() source.set_page_labels([ {"startpage": 0, "prefix": "Cover", "style": "", "firstpagenum": 1}, {"startpage": 1, "prefix": "", "style": "r", "firstpagenum": 1}, {"startpage": 3, "prefix": "", "style": "D", "firstpagenum": 1}, ]) raw = source.tobytes() with pymupdf.open(stream=raw, filetype="pdf") as doc: assert [page.get_label() for page in doc] == ["Cover", "i", "ii", "1"] assert len(doc.get_page_labels()) == 3 assert doc.get_page_labels()[0].get("style", "") == "" assert doc.page_count == 4 合成示例:构建带标签的测试PDF并验证边界 此代码在隔离环境中已执行通过。若你的环境断言失败,请检查PyMuPDF版本或确认是否误用了 firstpagenum 等废弃字段。 验收标准与人工审查阈值 此表仅适用于结构化PDF的代码级验收。端到端效果还需结合渲染验证:某些阅读器会忽略非法标签规则,导致显示与程序解析结果不一致。此时应以PDF规范为准,而非阅读器行为。 参考资料与下一步 PyMuPDF Document.get_page_labels(): https://pymupdf.readthedocs.io/en/latest/document.html#Document.get_page_labels PDF 1.7 Specification, Section 8.3.1 (Page Labels): https://opensource.adobe.com/dc-acrobat-sdk-docs/pdflsdk/PDFReference1.7.pdf 具体异常的处理决定 观察 应做什么 不应推断 封面前缀 读取 get_label 不要索引可能缺失的 style 重复标签 同时保存物理页索引 显示标签不当主键 混合编号 逐页对照标签 不要把罗马数字当物理页号 将这份检查清单用于文档翻译 先把页面顺序、来源位置与文本完整性检查清楚,再把同一份脱敏样本交给翻译流程。译后仍要检查标题、正文和图注是否正确对应,不能只看文字是否通顺。 OmniDoc(产品入口) 提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。 - 1 -
更新于 2026-10-08