1
2import io
3import warnings
4from .missing import MissingModule
5
6
7try:
8 import cairosvg
9except OSError as e:
10 msg = (
11 'Failed to import CairoSVG. '
12 'drawSvg will be unable to output PNG or other raster image formats. '
13 'See https://github.com/cduck/drawSvg#prerequisites for more details.\n'
14 'Original OSError: {}'.format(e)
15 )
16 cairosvg = MissingModule(msg)
17 warnings.warn(msg, RuntimeWarning)
18except ImportError as e:
19 msg = (
20 'CairoSVG will need to be installed to rasterize images: Install with `pip3 install cairosvg`\n'
21 'Original ImportError: {}'.format(e)
22 )
23 cairosvg = MissingModule(msg)
24 warnings.warn(msg, RuntimeWarning)
25
26
27class Raster:
28 def __init__(self, pngData=None, pngFile=None):
29 self.pngData = pngData
30 self.pngFile = pngFile
31 def savePng(self, fname):
32 with open(fname, 'wb') as f:
33 f.write(self.pngData)
34 @staticmethod
35 def fromSvg(svgData):
36 pngData = cairosvg.svg2png(bytestring=svgData)
37 return Raster(pngData)
38 @staticmethod
39 def fromSvgToFile(svgData, outFile):
40 cairosvg.svg2png(bytestring=svgData, write_to=outFile)
41 return Raster(None, pngFile=outFile)
42 def _repr_png_(self):
43 if self.pngData:
44 return self.pngData
45 elif self.pngFile:
46 try:
47 with open(self.pngFile, 'rb') as f:
48 return f.read()
49 except TypeError:
50 pass
51 try:
52 self.pngFile.seek(0)
53 return self.pngFile.read()
54 except io.UnsupportedOperation:
55 pass
56