Programmatically generate SVG (vector) images, animations, and interactive Jupyter widgets
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