You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python PyMuPDF调用PDF内置字体插入文本并解决报错?

使用PyMuPDF(fitz)调用PDF内置字体插入文本的解决方案

问题原因

PDF中显示的AHRFAF+Merriweather-Bold这类名称是嵌入字体的内部子集别名,并非字体的实际名称或可直接调用的标识。直接将其传给insert_text的fontname参数会报错,因为fitz无法通过这个别名找到可用的字体文件数据。

解决步骤

1. 提取目标字体的二进制数据

从PDF中提取对应字体的二进制流,需要先通过get_page_fonts获取字体ID,再用extract_font提取数据:

import fitz

doc = fitz.open('input.pdf')
page = doc[0]

# 获取页面所有字体信息
page_fonts = doc.get_page_fonts(0)

# 定位目标字体
target_font_info = None
for font in page_fonts:
    # font[3]是字体的内部别名
    if font[3] == 'AHRFAF+Merriweather-Bold':
        target_font_info = font
        break

# 提取字体二进制数据(extract_font返回的第四个元素是字体流)
if target_font_info:
    font_data = doc.extract_font(target_font_info[0])[3]

2. 用提取的字体插入文本

可以直接通过内存中的字体数据加载字体对象,无需写入磁盘:

color = (0, 0, 0)  # 设置文本颜色为黑色

# 从内存加载字体
custom_font = fitz.Font(fontdata=font_data)

# 插入文本,使用加载好的字体对象
page.insert_text((50, 127), "SINGH", font=custom_font, fontsize=36, color=color)

# 保存修改后的PDF
doc.save('output.pdf')
doc.close()

注意事项

  • 如果PDF嵌入的是子集字体(仅包含文档已使用的字符),插入的新字符若不在子集范围内,可能会显示为空白或乱码,这种情况需要额外安装完整字体文件替代。
  • 避免直接使用fontname参数调用PDF内部别名,fitz仅识别系统已安装字体名称或通过fitz.Font加载的字体对象。

内容的提问来源于stack exchange,提问作者shivjeet bhullar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 02:52:29