如何使用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
相关产品推荐
相关产品推荐

