背景
昨天收到的新需求,一份文件从其他部门发起,进行一些文字填写后盖章,再到我们部门,我们接收到的是pdf文件,所以需要在pdf文件中进行修改,插入当日日期等文字。但有要求字体必须和原文档字体相同。
问题代码
开始时通过fontfile传本地文件夹中的指定字体包,但是无论怎么修改最终在pdf中插入的文字格式都是PyMuPDF的默认Helvetica字体。
1 | inserter = SmartDateInserterV6(fontfile="./fonts/fangsongGB2312.ttf", fontsize=16) |
1 | def _insert_before(self, page, span, text, offset_x, offset_y): |

如上图所示
根本原因
page.insert_text() 在没有显式 fontname 参数时会把字体名默认为 “Helv” / “Helvetica”。
“Helv” 属于 PDF 的 Base‑14 保留字体名。只要传入的 fontname 是保留名,PyMuPDF 就 忽略 fontfile / fontbuffer 参数,直接调用内置 Helvetica,所以看到的始终是 Helvetica,而不是自己的仿宋字体。
解决办法
解决办法一:在 insert_text 时同时指定 自定义 fontname
1 | page.insert_text( |
只要 fontname 不是保留名,PyMuPDF 就会把 fontfile 嵌入 PDF,并真正使用你的仿宋字体。
解决办法二:先把字体注册到页面,再写入文本
1 | import fitz |
我使用方法一,最终效果如图