PyMuPDF插入文字时本地字体配置无效仍使用默认字体问题
笔记哥 /
04-16 /
44点赞 /
0评论 /
552阅读
## 背景
昨天收到的新需求,一份文件从其他部门发起,进行一些文字填写后盖章,再到我们部门,我们接收到的是pdf文件,所以需要在pdf文件中进行修改,插入当日日期等文字。但有要求字体必须和原文档字体相同。
## 问题代码
开始时通过fontfile传本地文件夹中的指定字体包,但是无论怎么修改最终在pdf中插入的文字格式都是PyMuPDF的默认Helvetica字体。
```csharp
inserter = SmartDateInserterV6(fontfile="./fonts/fangsongGB2312.ttf", fontsize=16)
```
```csharp
def _insert_before(self, page, span, text, offset_x, offset_y):
x, y = span["bbox"][:2]
rgb = int_to_rgb_tuple(span.get("color", 0))
page.insert_text(
(x - offset_x, y + offset_y),
text,
fontfile=self.fontfile,
fontsize=self.fontsize,
color=rgb
)
```

如上图所示
## 根本原因
page.insert\_text() 在没有显式 fontname 参数时会把字体名默认为 "Helv" / "Helvetica"。
“Helv” 属于 PDF 的 Base‑14 保留字体名。只要传入的 fontname 是保留名,PyMuPDF 就 忽略 fontfile / fontbuffer 参数,直接调用内置 Helvetica,所以看到的始终是 Helvetica,而不是自己的仿宋字体。
## 解决办法
解决办法一:在 insert\_text 时同时指定 自定义 fontname
```csharp
page.insert_text(
(x - offset_x, y + offset_y),
text,
fontfile=self.fontfile,
fontsize=self.fontsize,
color=rgb,
fontname="FangSongGB" # 避免 Helv
)
```
只要 fontname 不是保留名,PyMuPDF 就会把 fontfile 嵌入 PDF,并真正使用你的仿宋字体。
解决办法二:先把字体注册到页面,再写入文本
```csharp
import fitz
doc = fitz.open()
page = doc.new_page()
font_path = "./fonts/fangsongGB2312.ttf"
# 1️⃣ 先把字体嵌入并得到 xref
xref = page.insert_font(fontname="FangSongGB", fontfile=font_path)
# 2️⃣ 写文本时只需要给出 fontname
page.insert_text(
(100, 100),
"测试 2025 年",
fontname = "FangSongGB",
fontsize = 20
)
doc.save("test_font.pdf")
doc.close()
```
我使用方法一,最终效果如图

本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2317
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利