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

如何使用PyMuPDF提取不含子集前缀的字体名称?

解决PyMuPDF Page.get_fonts()返回字体含子集前缀的问题

当使用PyMuPDF的Page.get_fonts()提取PDF中的字体名称时,会遇到返回结果带XEAAAC+这类子集前缀的情况。虽然调用fitz.TOOLS.set_subset_fontnames(False)能让get_text()返回的字体名称正常,但该设置对get_fonts()无效,需要手动处理来获取纯净的字体名。

解决思路

子集前缀的格式固定为6位字母数字字符加+,可以通过字符串分割或正则表达式提取+后面的真实字体名称。

代码实现

import fitz
import re

# 清理字体名称,移除子集前缀
def clean_font_name(font_name):
    # 方法1:通过split分割(简单直接)
    if '+' in font_name:
        return font_name.split('+')[-1]
    # 方法2:正则匹配更严格的前缀格式(可选)
    # pattern = re.compile(r'^[A-Z0-9]{6}\+(.*)$')
    # match_result = pattern.match(font_name)
    # return match_result.group(1) if match_result else font_name
    return font_name

file_path = "sample.pdf"
pdf_document = fitz.open(file_path)

for page in pdf_document:
    # 获取原始字体信息
    raw_fonts = page.get_page_fonts(full=True)
    # 清理每个字体的名称
    cleaned_fonts = []
    for font_tuple in raw_fonts:
        # 转换为列表修改名称(元组不可变)
        font_list = list(font_tuple)
        font_list[3] = clean_font_name(font_list[3])
        cleaned_fonts.append(tuple(font_list))
    
    print(cleaned_fonts)

处理后输出示例

[
  (140, 'ttf', 'TrueType', 'Arial Bold', 'F3', 'WinAnsiEncoding', 0), 
  (138, 'ttf', 'TrueType', 'Times New Roman', 'F2', 'WinAnsiEncoding', 0),
  (137, 'ttf', 'TrueType', 'Arial', 'F1', 'WinAnsiEncoding', 0)
]

内容的提问来源于stack exchange,提问作者Sanika Girase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:43:15