我正在尝试计算各种字符串的高度/宽度(给定字体和大小)。我在试着跟踪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,但是遇到了比'import freetype‘更深入的问题-我认为由于windows上freetype的问题,它似乎找不到合适的dll。在github repo上有很多关于它的问题,但是还没有找到我的问题的解决方案。无论什么解决方案:任何帮助都是非常感谢的。
发布于 2018-02-15 08:25:23
这确实是一个python 2 to 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适用于Python2中的文本和二进制数据,因此上面的代码也适用于Python2。Python3区分文本和二进制数据。所以'rb'是必要的。matplotlib中的示例可能需要更新或注释。
https://stackoverflow.com/questions/48793711
复制相似问题