8000 Give a better error message on missing PostScript fonts · matplotlib/matplotlib@4fcc0e7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4fcc0e7

Browse files
committed
Give a better error message on missing PostScript fonts
For #4167; does not fix the problem, as it would need supporting a whole different kind of font, but gives a more useful error message.
1 parent 433b899 commit 4fcc0e7

File tree

4 files changed

+68
-1
lines changed

4 files changed

+68
-1
lines changed

lib/matplotlib/backends/backend_pdf.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,6 +1876,12 @@ def draw_tex(self, gc, x, y, s, prop, angle, ismath='TeX!', mtext=None):
18761876
pdfname = self.file.fontName(dvifont.texname)
18771877
if dvifont.texname not in self.file.dviFontInfo:
18781878
psfont = self.tex_font_mapping(dvifont.texname)
1879+
if psfont.filename is None:
1880+
self.file.broken = True
1881+
raise ValueError(
1882+
("No usable font file found for %s (%s). "
1883+
"The font may lack a Type-1 version.")
1884+
% (psfont.psname, dvifont.texname))
18791885
self.file.dviFontInfo[dvifont.texname] = Bunch(
18801886
fontfile=psfont.filename,
18811887
basefont=psfont.psname,

lib/matplotlib/tests/test_backend_pdf.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,21 @@
77

88
import io
99
import os
10+
import tempfile
11+
12+
try:
13+
from unittest.mock import patch
14+
except ImportError:
15+
from mock import patch
16+
from nose.tools import raises
1017

1118
import numpy as np
12-
from matplotlib import cm, rcParams
19+
from matplotlib import checkdep_tex, cm, rcParams
1320
from matplotlib.backends.backend_pdf import PdfPages
1421
from matplotlib import pyplot as plt
1522
from matplotlib.testing.decorators import (image_comparison, knownfailureif,
1623
cleanup)
24+
from matplotlib import dviread
1725

1826
if 'TRAVIS' not in os.environ:
1927
@image_comparison(baseline_images=['pdf_use14corefonts'],
@@ -29,6 +37,10 @@ def test_use14corefonts():
2937
and containing some French characters and the euro symbol:
3038
"Merci pépé pour les 10 €"'''
3139

40+
needs_tex = knownfailureif(
41+
not checkdep_tex(),
42+
"This test needs a TeX installation")
43+
3244

3345
@cleanup
3446
def test_type42():
@@ -132,3 +144,19 @@ def test_grayscale_alpha():
132144
ax.imshow(dd, interpolation='none', cmap='gray_r')
133145
ax.set_xticks([])
134146
ax.set_yticks([])
147+
148+
149+
@cleanup
150+
@needs_tex
151+
@raises(ValueError)
152+
@patch('matplotlib.dviread.PsfontsMap.__getitem__')
153+
def test_missing_psfont(mock):
154+
"""An error is raised if a TeX font lacks a Type-1 equivalent"""
155+
psfont = dviread.PsFont(texname='texfont', psname='Some Font',
156+
effects=None, encoding=None, filename=None)
157+
mock.configure_mock(return_value=psfont)
158+
rcParams['text.usetex'] = True
159+
fig, ax = plt.subplots()
160+
ax.text(0.5, 0.5, 'hello')
161+
with tempfile.TemporaryFile() as tmpfile:
162+
fig.savefig(tmpfile, format='pdf')

lib/matplotlib/tests/test_backend_svg.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,22 @@
55

66
import numpy as np
77
from io import BytesIO
8+
import os
9+
import tempfile
810
import xml.parsers.expat
911

12+
try:
13+
from unittest.mock import patch
14+
except ImportError:
15+
from mock import patch
16+
from nose.tools import raises
17+
1018
import matplotlib.pyplot as plt
1119
from matplotlib.testing.decorators import cleanup
1220
from matplotlib.testing.decorators import image_comparison, knownfailureif
1321
import matplotlib
22+
from matplotlib import dviread
23+
1424

1525
needs_tex = knownfailureif(
1626
not matplotlib.checkdep_tex(),
@@ -183,6 +193,23 @@ def test_determinism_tex():
183193
_test_determinism('determinism_tex.svg', usetex=True)
184194

185195

196+
@cleanup
197+
@needs_tex
198+
@raises(ValueError)
199+
@patch('matplotlib.dviread.PsfontsMap.__getitem__')
200+
def test_missing_psfont(mock):
201+
"""An error is raised if a TeX font lacks a Type-1 equivalent"""
202+
from matplotlib import rc
203+
psfont = dviread.PsFont(texname='texfont', psname='Some Font',
204+
effects=None, encoding=None, filename=None)
205+
mock.configure_mock(return_value=psfont)
206+
rc('text', usetex=True)
207+
fig, ax = plt.subplots()
208+
ax.text(0.5, 0.5, 'hello')
209+
with tempfile.NamedTemporaryFile(suffix='.svg') as tmpfile:
210+
fig.savefig(tmpfile.name)
211+
212+
186213
if __name__ == '__main__':
187214
import nose
188215
nose.runmodule(argv=['-s', '--with-doctest'], exit=False)

lib/matplotlib/textpath.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,12 @@ def get_glyphs_tex(self, prop, s, glyph_map=None,
335335
font_bunch = self.tex_font_map[dvifont.texname]
336336

337337
if font_and_encoding is None:
338+
if font_bunch.filename is None:
339+
raise ValueError(
340+
("No usable font file found for %s (%s). "
341+
"The font may lack a Type-1 version.")
342+
% (font_bunch.psname, dvifont.texname))
343+
338344
font = get_font(font_bunch.filename)
339345

340346
for charmap_name, charmap_code in [("ADOBE_CUSTOM",

0 commit comments

Comments
 (0)
0