我试图计算各种字符串的高度/宽度(给定字体和大小)。我试图关注this example。我写了以下内容:
from matplotlib import rcParams
import os.path
afm_fname = os.path.join(rcParams['datapath'], 'fonts', 'afm', 'ptmr8a.afm')
from matplotlib.afm import AFM
with open(afm_fname) as fh:
afm = AFM(fh)
但是我收到以下错误:
Traceback (most recent call last):
File "<pyshell#15>", line 2, in <module>
afm = AFM(fh)
File "C:\Python\lib\site-packages\matplotlib\afm.py", line 337, in __init__
parse_afm(fh)
File "C:\Python\lib\site-packages\matplotlib\afm.py", line 323, in parse_afm
_sanity_check(fh)
File "C:\Python\lib\site-packages\matplotlib\afm.py", line 102, in _sanity_check
if not line.startswith(b'StartFontMetrics'):
TypeError: startswith first arg must be str or a tuple of str, not bytes
非常感谢任何帮助。注意,我不需要使用matplotlib,所以如果有更好的方法在python中获取这些数字,我会对其他选项开放(如果重要的话,文本最终会在SVG中使用)。
我也尝试过使用freetype-py,但是在进口freetype&#39;之后遇到了麻烦。 - 我认为由于Windows上的freetype问题,它似乎无法找到合适的dll。 github repo上有各种各样的问题,但是我们无法找到问题的解决方案。无论什么解决方案:非常感谢任何帮助。
答案 0 :(得分:3)
这确实是一个python 2到3问题(https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data),其代码中带有AFM
硬编码二进制字符串。一种解决方案是明确地以二进制模式打开afm_fname
,如果可以的话。
from matplotlib import rcParams
import os.path
afm_fname = os.path.join(rcParams['datapath'],
'fonts', 'afm', 'ptmr8a.afm')
from matplotlib.afm import AFM
with open(afm_fname, 'rb') as fh:
afm = AFM(fh)
afm.string_width_height('What the heck?')
# (6220.0, 694)
字符串方法startswith
适用于python 2中的文本和二进制数据。因此上面的代码也适用于python 2。 Python 3区分文本和二进制数据。所以'rb'
是必要的。 matplotlib
中的示例可能需要更新或备注。