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

