OCRmyPDF 中文字体 3 步搞定:隐形乱码立刻显示
2026/9/3 12:29:05 网站建设 项目流程

OCRmyPDF 中文字体 3 步搞定:隐形乱码立刻显示

【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF

一份中文扫描件丢进 OCRmyPDF,出来的 PDF 搜「合同」搜不到,鼠标一高亮,文字层整片空白,日志里一行 warning 盯着你:No installed font has glyphs for the detected 'chi_sim' text。别急着调--pdf-renderer,也别怀疑 Tesseract——90% 的中文乱码是系统里压根没装对应的 Noto 字体,文字层被塞进了隐形兜底字体。

字体注入:按词挑字体的机制

先说机制。字体注入(把 OCR 识别出的文字"贴"回 PDF 图层)在 OCRmyPDF 里是按词为单位干的。MultiFontManager(src/ocrmypdf/font/multi_font_manager.py,这个文件负责给每个词挑字体)里的select_font_for_word()把挑字体想成按词点菜:先翻语言映射表(chi_sim → NotoSansSC),没有就沿一条字体链挨个问谁有这些字,再不行就扫系统里所有 Noto 字体,最后才兜底到无字形字体 Occulta——src/ocrmypdf/data/Occulta.ttf,一个覆盖全 BMP 但每个字都不画轮廓的隐形字体,专门保证"搜得到"。而 src/ocrmypdf/font/font_provider.py(内置字体供应商,负责声明到底有哪些字体可用)里写死了内置只带 NotoSans-Regular 和 Occulta 两个字体,阿拉伯、天城文、CJK 全靠系统自己装。所以,要改的不是代码,是你系统里的字体。

动手 3 步

先确认缺哪个字体

跑一遍你出问题的 PDF,打开日志找 warning,它会把缺字形的那个词、Unicode 码位和该装的字体族一次性念给你听。确认这一步的价值在于别瞎装——日志点名 NotoSansSC 你就装简中,点名 NotoSansJP 就装日文,装错族还是空白。

装对字体的 Noto 字体

把日志点名的 Noto 字体装进系统,OCRmyPDF 只认 NotoSans 系,别用微软雅黑之类替代。Linux 走包管理器:

# Debian/Ubuntu;RHEL 系包名带 cjk sudo apt install fonts-noto-cjk fonts-noto

其他平台直接下载 Noto Sans CJK 的 ttf/otf 解压到~/.local/share/fonts(Linux)、~/Library/Fonts(macOS)或C:\Windows\Fonts(Windows),src/ocrmypdf/font/system_font_provider.py(系统字体扫描器,负责在这些目录里递归找 Noto 字体)下次运行会自动发现,不需要任何重启或配置。

10 秒确认字体是否生效

先用代码确认 OCRmyPDF 真的看见了这个字体:

from ocrmypdf.font import MultiFontManager m = MultiFontManager() print(m.has_font('NotoSansSC-Regular'))

返回 True 说明扫描成功。然后重跑ocrmypdf --language chi_sim in.pdf out.pdf,日志里 warning 消失、PDF 里高亮能看见文字,才算修好。

这两个坑我替你踩过了

坑 1:装了简中字体,日文假名还是空白。现象是汉字正常、假名位置空着。底层卡在哪:NotoSansSC 只是区域子集不含假名,而select_font_for_word要求整词字形全覆盖。一行解法:日文文档直接改跑ocrmypdf --language jpn,或单独装 NotoSansJP。

坑 2:日志说"no single installed font covers"。现象:一个词内混了两种文字(比如"API接口"),整个词被丢进隐形层。底层卡在哪:设计上 OCRmyPDF 一个词只绑一种字体。一行解法:这种情况装字体救不了,把它拆成两种文字各占一词的文档重跑,或者接受它可搜索但隐形。

下一步

现在你重跑那份混合语言 PDF,确认日志不再报缺字体——字体发现结果会缓存,新装的字体必须重跑才生效。想搞懂非嵌入字体和 PDF/A 的冲突,翻翻 docs/advanced.md,里面讲得透。

【免费下载链接】OCRmyPDFOCRmyPDF adds an OCR text layer to scanned PDF files, allowing them to be searched项目地址: https://gitcode.com/GitHub_Trending/oc/OCRmyPDF

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询