字体#
v1.16.18中的新功能
该类代表了在MuPDF中定义的字体(fz_font_s结构)。它是新类 TextWriter 和新 Page.write_text() 的必要部分。目前,它与方法 Page.insert_text() 或 Page.insert_textbox() 中字体的使用没有关联。
Font对象还包含有用的一般信息,例如字体的边界框、定义的字形数量、字形名称或单个字形的边界框。
方法 / 属性 |
简短描述 |
|---|---|
字符的宽度 |
|
字形矩形 |
|
从字形名称获取unicode |
|
返回unicode的glyph ID |
|
计算字符串长度 |
|
字符串的字符宽度元组 |
|
获取unicode的字形名称 |
|
支持的 Unicode 数组 |
|
字体上升高度 |
|
字体下行线 |
|
字体矩形 |
|
字体的二进制图像的副本 |
|
字体属性的集合 |
|
支持的字形数量 |
|
字体名称 |
|
|
|
|
|
|
|
|
类 API
- class Font#
- __init__(self, fontname=None, fontfile=None,
- fontbuffer=None, script=0, language=None, ordering=-1, is_bold=0,
- is_italic=0, is_serif=0)
字体构造函数。大量参数用于定位最符合要求的字体。并非所有参数都是必需的 - 请参阅下面的伪代码,解释参数如何被评估的逻辑。
- Parameters:
fontname (str) –
PDF 基础 14 字体 或 CJK 字体名称之一。还可以选择少数其他名称(注意正确拼写): “Arial”,“Times”,“Times Roman”。
(在 v1.17.5 中更改)
如果您安装了 pymupdf-fonts,还可以使用新的“保留”字体名称,这些名称在
fitz_fonts和下面的表格中列出。fontfile (str) – 您系统中某处字体文件的文件名 [1].
fontbuffer (bytes,bytearray,io.BytesIO) – 一个加载到内存中的字体文件 [1].
script (in) – UCDN 脚本的编号。目前在 PyMuPDF 中支持的数字为 24,以及 32 到 35。
语言 (str) – 值之一 “zh-Hant” (繁体中文), “zh-Hans” (简体中文), “ja” (日语) 和 “ko” (韩语)。否则,子集 1, 2, 3 和 5 的所有 ISO 639 代码也都是可能的,但目前仅供文档参考。
排序 (int) – CJK字体的替代选择器之一。
is_bold (bool) – 查找粗体字体。
is_italic (bool) – 查找斜体字。
is_serif (bool) – 查找有衬线的字体。
- Returns:
如果成功,则返回一个 MuPDF 字体。这是确定合适字体的总体检查顺序:
参数
操作
fontfile?
从文件创建字体,如果失败则抛出异常。
fontbuffer?
从缓冲区创建字体,如果失败则抛出异常。
ordering>=0
创建通用字体,始终成功。
fontname?
创建一个 Base-14 字体,通用字体,或由 pymupdf-fonts 提供的字体。见下表。
注意
使用通常的保留名称“helv”、“tiro”等,您将创建预期名称“Helvetica”、“Times-Roman”等字体。 但是,与
Page.insert_font()等函数相比,一个字体文件将始终嵌入到您的PDF中,
支持希腊字母和西里尔字母,而无需使用编码参数。
使用 ordering >= 0,或字体名称 “cjk”, “china-t”, “china-s”, “japan” 或 “korea” 将 始终创建相同的 “通用” 字体 “Droid Sans Fallback Regular”。该字体支持 所有中文、日文、韩文和拉丁字符,包括希腊文和西里尔文。这是一种无衬线字体。
实际上,您几乎不需要其他无衬线字体,除了“Droid Sans Fallback Regular”。但是这个字体文件相对较大,会使您的PDF文件大小增加约1.65 MB(压缩后)。如果您不需要CJK支持,可以继续使用“helv”、“tiro”等指定的字体,这样压缩后大约只有35 KB。
如果你知道你有中日韩和拉丁文本的混合,考虑只使用
Font("cjk"),因为这支持所有内容,并且显著(最多提高三倍)加快执行速度:MuPDF将始终在这个单一字体中找到任何字符,而无需检查备选字体。但是如果你使用其他字体,你仍然可以自动写入CJK字符:MuPDF会检测到这种情况,并默默地回退到通用字体(当然,这也会嵌入到你的PDF中)。
(在 v1.17.5 中新增加) 可选地,如果您安装了 pymupdf-fonts,将会有一些新的“保留”字体名称代码可用,
pip install pymupdf-fonts。 “Fira Mono” 是一款等宽无衬线字体集,而 FiraGO 是另一种不带衬线的“通用”字体集,支持所有拉丁字母(包括西里尔字母和希腊字母)以及泰语、阿拉伯语、希伯来语和天城文 - 但不支持任何 CJK 语言。 FiraGO 字体的大小仅为“Droid Sans Fallback”大小的四分之一(压缩后 400 KB 对比 1.65 MB) - 并且 它提供粗体、斜体和粗斜体的字重 - 而通用字体则不提供这些。“Space Mono” 是来自 Google Fonts 的另一种不错且小巧的等宽字体,支持拉丁扩展字符,并提供所有四种重要的字体粗细。
下表将字体名称代码映射到相应的字体。有关该软件包的当前内容,请参阅其文档:
代码
字体名称
新版本
评论
figo
FiraGO 常规
v1.0.0
比Helvetica更窄
图表
FiraGO 粗体
v1.0.0
figit
FiraGO 斜体
v1.0.0
figbi
FiraGO 粗体斜体
v1.0.0
fimo
Fira Mono Regular
v1.0.0
fimbo
Fira Mono Bold
v1.0.0
spacemo
空间单体常规
v1.0.1
spacembo
空间单体粗体
v1.0.1
空间发射
空间单声道斜体
v1.0.1
spacembi
空间单体粗斜体
v1.0.1
数学
Noto Sans Math Regular
v1.0.2
数学符号
音乐
Noto Music Regular
v1.0.2
音乐符号
符号1
Noto Sans Symbols Regular
v1.0.2
“symb”的替代品
符号2
Noto Sans Symbols2 常规
版本1.0.2
扩展符号集
notos
Noto Sans Regular
v1.0.3
Helvetica的替代品
不通知
Noto Sans Italic
v1.0.3
notosbo
Noto Sans Bold
v1.0.3
notosbi
Noto Sans BoldItalic
v1.0.3
- has_glyph(chr, language=None, script=0, fallback=False)#
检查字体中是否存在unicode chr 或者(可选)某些后备字体。可用于检查输出中是否会出现任何“豆腐”符号。
- Parameters:
chr (int) – 字符的unicode (即 ord())。
语言 (str) – 语言 – 当前未使用。
脚本 (整数) – UCDN 脚本编号。
回退 (布尔值) – (在 v1.17.5 新增) 在回退字体中执行扩展搜索或限制为当前字体(默认)。
- Returns:
(在1.17.7中更改) 字形编号。零表示未找到字形。
- valid_codepoints()#
在v1.17.5中的新功能
返回该字体支持的Unicode数组。
- Returns:
一个 array.array [2] 的长度至多为
Font.glyph_count。也就是说,这个数组中每个项目的 chr() 在字体中都有一个字形而不使用回退。这是支持的字形的示例显示:>>> import pymupdf >>> font = pymupdf.Font("math") >>> vuc = font.valid_codepoints() >>> for i in vuc: print("%04X %s (%s)" % (i, chr(i), font.unicode_to_glyph_name(i))) 0000 000D (CR) 0020 (space) 0021 ! (exclam) 0022 " (quotedbl) 0023 # (numbersign) 0024 $ (dollar) 0025 % (percent) ... 00AC ¬ (logicalnot) 00B1 ± (plusminus) ... 21D0 ⇐ (arrowdblleft) 21D1 ⇑ (arrowdblup) 21D2 ⇒ (arrowdblright) 21D3 ⇓ (arrowdbldown) 21D4 ⇔ (arrowdblboth) ... 221E ∞ (infinity) ...
注意
此方法仅对具有 CMAP(字符映射,charmap,
/ToUnicodePDF 键)的字体返回有意义的数据。否则,此数组的长度将为 1,并仅包含零。
- glyph_advance(chr, language=None, script=0, wmode=0)#
计算字符的字形(视觉表现)的“宽度”。
- Parameters:
chr (int) – 字符的unicode编号。使用 ord(),而不是字符本身。再说一次,即使某个字符不被该字体支持,这通常也应该正常工作,因为必要时会检查后备字体。
wmode (int) – 写入模式,0 = 水平,1 = 垂直。
其他参数目前未在使用。
- Returns:
一个浮动值,表示字形的宽度相对于 fontsize 1。
- glyph_name_to_unicode(name)#
返回给定字形名称的unicode值。如果您想输出例如某个符号,请与
chr()一起使用。- Parameters:
name (str) – 字形的名称。
- Returns:
未知名称的unicode整数,或 65533 = 0xFFFD。示例:
font.glyph_name_to_unicode("Sigma") = 931,font.glyph_name_to_unicode("sigma") = 963。有关字形名称及其unicode编号的列表,请参阅 Adobe Glyph List 出版物。示例:>>> font = pymupdf.Font("helv") >>> font.has_glyph(font.glyph_name_to_unicode("infinity")) True
- glyph_bbox(chr, language=None, script=0)#
与
fontsize1. 相关的字形矩形。- Parameters:
chr (int) – 字符的 ord()。
- Returns:
a 矩形.
- unicode_to_glyph_name(ch)#
显示角色字形的名称。
- Parameters:
ch (int) – 字符的unicode编号。使用 ord(),而不是字符本身。
- Returns:
一个表示字形名称的字符串。例如
font.glyph_name(ord("#")) = "numbersign"。对于无效代码,返回“.notfound”。注意
(在v1.18.0中更改) 此方法和
Font.glyph_name_to_unicode()不再依赖于字体,而是从 Adobe Glyph List 获取信息。还可以作为pymupdf.unicode_to_glyph_name()和相应的pymupdf.glyph_name_to_unicode()使用。
- text_length(text, fontsize=11)#
计算unicode字符串的长度(以点为单位)。
注意
对于仅限于Base-14字体,存在与
get_text_length()的功能重叠。- Parameters:
文本 (str) – 一个文本字符串,UTF-8 编码。
fontsize (float) – 字体大小
fontsize。
- Return type:
浮点数
- Returns:
在PDF中存储时字符串的长度(单位为点)。如果字符不在字体中,将会自动查找备用字体。
注意
此方法最初是在Python中实现的,基于调用
Font.glyph_advance()。出于性能考虑,它已在v1.18.14中重写为C语言。要计算单个字符的宽度,现在可以使用以下任一种方式而不影响性能:font.glyph_advance(ord("Ä")) * fontsizefont.text_length("Ä", fontsize=fontsize)
对于多字符字符串,该方法相比于之前的实现具有巨大的性能优势:对每个字符约需0.5微秒,而对第二个及后续字符仅需12.5纳秒。
- char_lengths(text, fontsize=11)#
v1.18.14版的新功能
一个unicode字符串中字符长度的序列,以点为单位。
- Parameters:
文本 (str) – 一个文本字符串,UTF-8 编码。
fontsize (float) – 字体大小
fontsize。
- Return type:
元组
- Returns:
当字符串的字符以点为单位存储在PDF中时的长度。它像
Font.text_length()被分解为单个字符一样工作。这是一种高速方法,例如在TextWriter.fill_textbox()中使用。以下是正确的(允许舍入误差):font.text_length(text) == sum(font.char_lengths(text)).>>> font = pymupdf.Font("helv") >>> text = "PyMuPDF" >>> font.text_length(text) 50.115999937057495 >>> pymupdf.get_text_length(text, fontname="helv") 50.115999937057495 >>> sum(font.char_lengths(text)) 50.115999937057495 >>> pprint(font.char_lengths(text)) (7.336999952793121, # P 5.5, # y 9.163000047206879, # M 6.115999937057495, # u 7.336999952793121, # P 7.942000031471252, # D 6.721000015735626) # F
- buffer#
v1.17.6中的新内容
二进制字体文件内容的副本。
- Return type:
字节
- flags#
一个包含各种字体属性的字典,每个属性都表示为布尔值。Helvetica的示例:
>>> pprint(font.flags) {'bold': 0, 'fake-bold': 0, 'fake-italic': 0, 'invalid-bbox': 0, 'italic': 0, 'mono': 0, 'opentype': 0, 'serif': 1, 'stretch': 0, 'substitute': 0}
- Return type:
字典
- name#
- Return type:
字符串
字体的名称。可以是“”或“(null)”。
- glyph_count#
- Return type:
整型
字体中定义的字形数量。
- ascender#
v1.18.0 新功能
字体的升部值,详见 here。请注意,与严格定义存在差异:我们的值包括了基线以上的所有内容——不仅仅是大写“A”和小写“a”之间的高度差。
- Return type:
浮点数
- descender#
v1.18.0 新功能
字体的下降值,详见这里。该值始终为负,是一些字形在基线以下下降的部分,例如“g”或“y”。因此,值
ascender - descender是每个字体字形能够容纳的总高度。对于大多数字体而言,这都是正确的——当然,总有例外,尤其是对于书法字体等。- Return type:
浮点数
- is_bold#
- is_italic#
- is_monospaced#
- is_serif#
一些具有明显含义的属性。反映了
Font.flags字典的一些值。- Return type:
布尔值
脚注