阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。
这篇先解决哪一个问题
默认字体列表与 full=True 返回的元组长度不同。下面按前六项读取,再检查 extract_font 返回的字体字节是否为空。Base14 字体引用不等于字体程序已嵌入;子集字体也不应被一概判为错误。
自包含的合成示例
依赖见导入列表。代码在内存中构造输入;运行记录单独提供,不代表对所有真实文件的保证。
import pymupdf
with pymupdf.open() as doc:
page = doc.new_page()
page.insert_text((72, 72), "Font sample", fontname="helv")
fonts = doc.get_page_fonts(0, full=True)
assert fonts
report = []
for item in fonts:
xref, ext, kind, basefont, name, encoding = item[:6]
extracted_name, extracted_ext, extracted_type, data = doc.extract_font(xref)
report.append({"name": basefont, "font_program_present": bool(data),
"xref": xref, "encoding": encoding})
assert report[0]["name"] == "Helvetica"
assert report[0]["font_program_present"] is False
assert report[0]["xref"] > 0
拿到一份待翻译的 PDF,最危险的直觉反应是直接全局替换为思源黑体或 Arial。这种操作往往在交付时才暴露问题:原文中的数学符号变成方块、表格数字等宽对齐失效、或者因为嵌入了受限字体导致译文无法在某些阅读器打开。在启动任何文本提取或排版重构之前,必须先对文档进行字体盘点。这不是为了做法律合规审计,而是为了确认技术上的可编辑性与渲染稳定性。
get_page_fonts()
是 PyMuPDF 提供的底层探针,它能告诉你每一页实际引用了哪些字体资源、是否完整嵌入、以及编码类型,这些信息决定了后续翻译流程是该走 OCR、直接替换还是人工重排。
合成测试:内存构建与断言验证
为了满足隔离运行要求并验证上述修正后的逻辑,我们构建了一个完全自包含的测试用例。该脚本不依赖外部文件,而是在内存中使用 PyMuPDF 动态创建一个包含标准字体的 PDF,随后立即对其进行盘点分析。这种方式既保证了示例的可复现性,又避免了版权与隐私风险。请注意,由于我们无法在不引入外部字体文件的情况下在内存中构造“损坏”或“非嵌入”的合成字体对象,本测试聚焦于验证正常嵌入字体的解析准确性以及函数对无效页码的防御性处理。这符合工程实践中“先保证正向路径正确,再单独测试异常分支”的原则。
验收标准与人工审查边界
代码输出的“安全”或“警告”只是技术信号,不能直接等同于翻译可行性。下表总结了从技术检测到生产决策的映射关系,明确了自动化工具的局限性与人工介入的触发点。此表格区分了“代码演示”与“端到端效果”。脚本能准确报告嵌入状态,但无法判断该字体在翻译目标语言中是否有对应字形,也无法评估许可证是否允许修改嵌入。这些决策必须结合项目上下文由人做出。
参考与下一步
PyMuPDF Document.get_page_fonts 官方文档: https://pymupdf.readthedocs.io/en/latest/document.html#Document.get_page_fonts
PyMuPDF 主页与下载: https://pymupdf.io
具体异常的处理决定
观察
应做什么
不应推断
字体程序为空
记录未提取到嵌入程序
Base14 引用不等于嵌入
子集字体
保留字体标识
不直接判定损坏
列表为空
确认页面内容
可能是图像或其他绘制路径
将这份检查清单用于文档翻译
先把页面顺序、来源位置与文本完整性检查清楚,再把同一份脱敏样本交给翻译流程。译后仍要检查标题、正文和图注是否正确对应,不能只看文字是否通顺。
OmniDoc(产品入口)
提供多格式文档翻译入口,官网介绍了 OCR、术语表与双语对照功能。对希望直接从文件开始处理的团队,这是一条值得用实际样本评估的路径。请使用有权上传的脱敏文件,并用本篇的检查项复核结果;这里不声称 OmniDoc 使用了本文的开源库或内部算法,也不以示例代替产品性能测试。
- 1 -
更新于 2026-10-08