def test2(self): "Test two strings in transformed group in drawing." path = outputfile("test_renderSVG_simple_test2.svg") d = Drawing(200, 100) g = Group() g.add(String(0, 0, "foo")) g.add(String(100, 0, "bar")) g.scale(1.5, 1.2) g.translate(50, 0) d.add(g) renderSVG.drawToFile(d, path) if not HAVE_XML_PARSER: warnIgnoredRestofTest() return svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group g = dg.getElementsByTagName('g')[0] # custom group textChildren = g.getElementsByTagName('text') # text nodes t0 = string.strip(textChildren[0].childNodes[0].nodeValue) t1 = string.strip(textChildren[1].childNodes[0].nodeValue) assert t0 == 'foo' assert t1 == 'bar'
def test2(self): "Test two strings in transformed group in drawing." path = outputfile("test_renderSVG_simple_test2.svg") d = Drawing(200, 100) g = Group() g.add(String(0, 0, "foo")) g.add(String(100, 0, "bar")) g.scale(1.5, 1.2) g.translate(50, 0) d.add(g) renderSVG.drawToFile(d, path) if not HAVE_XML_PARSER: warnIgnoredRestofTest() return svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group g = dg.getElementsByTagName('g')[0] # custom group textChildren = g.getElementsByTagName('text') # text nodes t0 = textChildren[0].childNodes[0].nodeValue.strip() t1 = textChildren[1].childNodes[0].nodeValue.strip() assert t0 == 'foo' assert t1 == 'bar'
def test0(self): "Test two strings in drawing." path = outputfile("axestest0.svg") from reportlab.graphics.charts.axes import XCategoryAxis d = XCategoryAxis().demo() renderSVG.drawToFile(d, path)
def test3(self): from reportlab.lib.units import cm from reportlab.lib import colors width=300 height=60 #Create fairly simple drawing object, drawing=Drawing(width, height) p=ArcPath(strokeColor=colors.darkgreen, fillColor=colors.green, hrefURL="http://en.wikipedia.org/wiki/Vector_path", hrefTitle="This big letter C is actually a closed vector path.", strokewidth=0) p.addArc(1*cm, 1*cm, 0.8*cm, 20, 340, moveTo=True) p.addArc(1*cm, 1*cm, 0.9*cm, 20, 340, reverse=True) p.closePath() drawing.add(p) drawing.add(Rect(2.25*cm, 0.1*cm, 1.5*cm, 0.8*cm, rx=0.25*cm, ry=0.25*cm, hrefURL="http://en.wikipedia.org/wiki/Rounded_rectangle", hrefTitle="Rounded Rectangle", strokeColor=colors.red, fillColor=colors.yellow)) drawing.add(String(1*cm, 1*cm, "Hello World!", hrefURL="http://en.wikipedia.org/wiki/Hello_world", hrefTitle="Why 'Hello World'?", fillColor=colors.darkgreen)) drawing.add(Rect(4.5*cm, 0.5*cm, 5*cm, 1*cm, hrefURL="http://en.wikipedia.org/wiki/Rectangle", hrefTitle="Wikipedia page on rectangles", strokeColor=colors.blue, fillColor=colors.red)) drawing.add(Ellipse(7*cm, 1*cm, 2*cm, 0.95*cm, hrefURL="http://en.wikipedia.org/wiki/Ellipse", strokeColor=colors.black, fillColor=colors.yellow)) drawing.add(Circle(7*cm, 1*cm, 0.9*cm, hrefURL="http://en.wikipedia.org/wiki/Circle", strokeColor=colors.black, fillColor=colors.brown)) drawing.add(Ellipse(7*cm, 1*cm, 0.5*cm, 0.9*cm, hrefTitle="Tooltip with no link?", strokeColor=colors.black, fillColor=colors.black)) drawing.add(Polygon([4.5*cm, 1.25*cm, 5*cm, 0.1*cm, 4*cm, 0.1*cm], hrefURL="http://en.wikipedia.org/wiki/Polygon", hrefTitle="This triangle is a simple polygon.", strokeColor=colors.darkgreen, fillColor=colors.green)) renderSVG.drawToFile(drawing, outputfile("test_renderSVG_simple_test3.svg"))
def guardar_a_svg(self, nombrearchivo = None): """ Dibuja el código de barras en SVG. Devuelve el nombre del archivo. """ if not nombrearchivo: import time, os from tempfile import gettempdir nombrearchivo = os.path.join(gettempdir(), "barcode39_%s.svg" % ('_'.join(map(str, time.localtime()[:6])))) from reportlab.graphics.shapes import Drawing from reportlab.lib.units import cm tamcanvas = (self.width + 2, self.height + 10 + 0.4 * cm) dw = Drawing(width = tamcanvas[0], height = tamcanvas[1]) self.drawOnDW(dw, 1, tamcanvas[1] - 5 - self.height) from reportlab.graphics import renderSVG renderSVG.drawToFile(dw, nombrearchivo, "SVG") nombrearchivo = self.__corregir_stroke_linecap(nombrearchivo) return nombrearchivo
def test0(self): "Test two strings in drawing." path = outputfile("test_renderSVG_simple_test0.svg") d = Drawing(200, 100) d.add(String(0, 0, "foo")) d.add(String(100, 0, "bar")) renderSVG.drawToFile(d, path) svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group textChildren = dg.getElementsByTagName('text') # text nodes t0 = textChildren[0].childNodes[0].nodeValue.strip() t1 = textChildren[1].childNodes[0].nodeValue.strip() assert t0 == 'foo' assert t1 == 'bar'
def test4(self): "Test character encoding." path = outputfile("test_renderSVG_simple_test4.svg") specialChar = u'\u2019' d = Drawing(200, 100) d.add(String(0, 0, "foo" + specialChar)) d.add(String(100, 0, "bar")) renderSVG.drawToFile(d, path) svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group textChildren = dg.getElementsByTagName('text') # text nodes t0 = textChildren[0].childNodes[0].nodeValue.strip() t1 = textChildren[1].childNodes[0].nodeValue.strip() assert t0 == 'foo' + specialChar, "%s should equal %s" % ( ascii(t0), ascii('foo' + specialChar)) assert t1 == 'bar'
def render_svg(drawing, opts, outbuf=None): if opts.pagesize in name2size: pagesize = name2size[opts.pagesize] else: pagesize = opts.pagesize or letter border = opts.border or 1*cm landscape = opts.landscape or False pgwidth, pgheight = pagesize if not landscape \ else (pagesize[1], pagesize[0]) #print "drawing width, height:", drawing.width/inch, drawing.height/inch if drawing.width > pgwidth - 2*border: scalefact = (pgwidth - 2*border)/float(drawing.width) drawing.scale(scalefact, scalefact) else: scalefact = 1.0 #border *= scalefact dwidth = drawing.width*scalefact dheight = drawing.height*scalefact buf = StringIO() renderSVG.drawToFile(drawing, buf) return buf.getvalue()
def render_svg(drawing, opts, outbuf=None): if opts.pagesize in name2size: pagesize = name2size[opts.pagesize] else: pagesize = opts.pagesize or letter border = opts.border or 1 * cm landscape = opts.landscape or False pgwidth, pgheight = pagesize if not landscape \ else (pagesize[1], pagesize[0]) #print "drawing width, height:", drawing.width/inch, drawing.height/inch if drawing.width > pgwidth - 2 * border: scalefact = (pgwidth - 2 * border) / float(drawing.width) drawing.scale(scalefact, scalefact) else: scalefact = 1.0 #border *= scalefact dwidth = drawing.width * scalefact dheight = drawing.height * scalefact buf = StringIO() renderSVG.drawToFile(drawing, buf) return buf.getvalue()
def test0(self): "Test two strings in drawing." path = outputfile("test_renderSVG_simple_test0.svg") d = Drawing(200, 100) d.add(String(0, 0, "foo")) d.add(String(100, 0, "bar")) renderSVG.drawToFile(d, path) if not HAVE_XML_PARSER: warnIgnoredRestofTest() return svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group textChildren = dg.getElementsByTagName('text') # text nodes t0 = (textChildren[0].childNodes[0].nodeValue).strip() t1 = (textChildren[1].childNodes[0].nodeValue).strip() assert t0 == 'foo' assert t1 == 'bar'
def test4(self): "Test character encoding." path = outputfile("test_renderSVG_simple_test4.svg") specialChar = u'\u2019' d = Drawing(200, 100) d.add(String(0, 0, "foo"+specialChar)) d.add(String(100, 0, "bar")) renderSVG.drawToFile(d, path) if not HAVE_XML_PARSER: warnIgnoredRestofTest() return svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group textChildren = dg.getElementsByTagName('text') # text nodes t0 = textChildren[0].childNodes[0].nodeValue.strip() t1 = textChildren[1].childNodes[0].nodeValue.strip() assert t0 == 'foo'+specialChar, "%s should equal %s" % (ascii(t0),ascii('foo'+specialChar)) assert t1 == 'bar'
def test4(self): "Test character encoding." path = outputfile("test_renderSVG_simple_test4.svg") specialChar = u'\u2019' d = Drawing(200, 100) d.add(String(0, 0, "foo"+specialChar)) d.add(String(100, 0, "bar")) renderSVG.drawToFile(d, path) if not HAVE_XML_PARSER: warnIgnoredRestofTest() return svg = load(path) fg = svg.getElementsByTagName('g')[0] # flipping group dg = fg.getElementsByTagName('g')[0] # diagram group textChildren = dg.getElementsByTagName('text') # text nodes t0 = string.strip(textChildren[0].childNodes[0].nodeValue) t1 = string.strip(textChildren[1].childNodes[0].nodeValue) assert t0 == 'foo'+specialChar assert t1 == 'bar'
def test2(self): "Generate PDF and SVG documents of third sample drawing." d = self.makeDrawing2() renderPDF.drawToFile(d, outputfile('test_widgets_grids2.pdf')) renderSVG.drawToFile(d, outputfile('test_widgets_grids2.svg'))
def test1(self): "Generate PDF and SVG documents of second sample drawing." d = self.makeDrawing1() renderPDF.drawToFile(d, outputfile('test_widgets_grids1.pdf')) renderSVG.drawToFile(d, outputfile('test_widgets_grids1.svg'))
def test0(self): "Generate PDF and SVG documents of first sample drawing." d = self.makeDrawing0() renderPDF.drawToFile(d, outputfile('test_widgets_grids0.pdf')) renderSVG.drawToFile(d, outputfile('test_widgets_grids0.svg'))
def generate(self, value, stream=None, format='eps', includeText=None, textSize=14, dpi=300, lineWidth = 1.2, lineHeight = 36): """ Generates the requested bar code either via a stream or as the requested object type. @param value: The string to convert to a barcode @param stream: Optional argument of file name as a string, or any open file style object. @param format: The format in which the output should be generated. Valid file formats include pdf, eps, svg and will require the stream argument be provided. Valid object formats include rldrawing (ReportLab Drawing object will be returned, No stream argument is required). @param includeText: Boolean. If true then human readable text will be printed centered under the barcode. @param textSize: The point size of the human readable text. @param dpi: The dots per inch at which the bitmap should be generated. @return: None or a format dependent object. Valid return values:: eps : None pdf : None svg : None rl : ReportLab Drawing @rtype: misc """ assert (format in ('rl','pil') or stream is not None) d = self._generateDrawing(value, includeText, textSize, dpi) # # Process formats that return value instead of write to a file # if format == 'rl': return d # # A stream is required for the remaining formats # if not hasattr(stream, 'write'): closeFile = True stream = open(stream,'w') else: closeFile = False if format == 'pdf': from reportlab.graphics import renderPDF renderPDF.drawToFile(d, stream, 'GNUe') elif format == 'eps': from reportlab.graphics import renderPS renderPS.drawToFile(d, stream) elif format == 'svg': from reportlab.graphics import renderSVG renderSVG.drawToFile(d, stream) ## elif format in ('png','tiff'): ## from reportlab.graphics import renderPM ## renderPM.drawToFile(d, stream,format.upper(), dpi=dpi) ## elif format in ('pil',): ## from reportlab.graphics import renderPM ## return renderPM.drawToPIL(d, dpi=dpi) # # This code *should* be replaced with calls to renderPM # but that appears broken in the .debs # ## ## Raster-based output using PIL ## elif format in ('png','tiff','ppm','xbm'): code = value ## lineWidth = int(lineWidth * dpi/72+.5) # 300dpi lineHeight = int(lineHeight * dpi/72+.5) # 300dpi # Special case for PostNet lineHeight2 = int(lineHeight * .45+.5) # Create a new monochrome image with a white backgint image = Image.new('1',(int(len(code)*lineWidth+.5), int(lineHeight+.5)), 1) draw = ImageDraw.Draw(image) offs = 0 for ch in code: if ch == '1': draw.rectangle((offs,0,offs+lineWidth-1,lineHeight), outline=0, fill=0) # Special case for PostNet elif ch == '2': draw.rectangle((offs,0,offs+lineWidth-1,lineHeight2), outline=0, fill=0) offs += lineWidth image.save(stream, format) if closeFile: stream.close()
class Drawing(Group, Flowable): """Outermost container; the thing a renderer works on. This has no properties except a height, width and list of contents.""" _saveModes = ( 'pdf', 'ps', 'eps', 'gif', 'png', 'jpg', 'jpeg', 'pct', 'pict', 'tiff', 'tif', 'py', 'bmp', 'svg', 'tiffp', 'tiffl', 'tiff1', ) _xtraAttrMap = AttrMap( width=AttrMapValue(isNumber, desc="Drawing width in points."), height=AttrMapValue(isNumber, desc="Drawing height in points."), canv=AttrMapValue(None), background=AttrMapValue(isValidChildOrNone, desc="Background widget for the drawing"), hAlign=AttrMapValue( OneOf("LEFT", "RIGHT", "CENTER", "CENTRE"), desc="Horizontal alignment within parent document"), vAlign=AttrMapValue(OneOf("TOP", "BOTTOM", "CENTER", "CENTRE"), desc="Vertical alignment within parent document"), #AR temporary hack to track back up. #fontName = AttrMapValue(isStringOrNone), renderScale=AttrMapValue(isNumber, desc="Global scaling for rendering"), ) _attrMap = AttrMap(BASE=Group) _attrMap.update(_xtraAttrMap) def __init__(self, width=400, height=200, *nodes, **keywords): self.background = None apply(Group.__init__, (self, ) + nodes, keywords) self.width = width self.height = height self.hAlign = 'LEFT' self.vAlign = 'BOTTOM' self.renderScale = 1.0 def _renderPy(self): I = { 'reportlab.graphics.shapes': ['_DrawingEditorMixin', 'Drawing', 'Group'] } G = _renderGroupPy(self._explode(), 'self', I) n = 'ExplodedDrawing_' + self.__class__.__name__ s = '#Autogenerated by ReportLab guiedit do not edit\n' for m, o in I.items(): s = s + 'from %s import %s\n' % ( m, string.replace(str(o)[1:-1], "'", "")) s = s + '\nclass %s(_DrawingEditorMixin,Drawing):\n' % n s = s + '\tdef __init__(self,width=%s,height=%s,*args,**kw):\n' % ( self.width, self.height) s = s + '\t\tapply(Drawing.__init__,(self,width,height)+args,kw)\n' s = s + G s = s + '\n\nif __name__=="__main__": #NORUNTESTS\n\t%s().save(formats=[\'pdf\'],outDir=\'.\',fnRoot=None)\n' % n return s def draw(self, showBoundary=_unset_): """This is used by the Platypus framework to let the document draw itself in a story. It is specific to PDF and should not be used directly.""" import renderPDF renderPDF.draw(self, self.canv, 0, 0, showBoundary=showBoundary) def wrap(self, availWidth, availHeight): width = self.width height = self.height renderScale = self.renderScale if renderScale != 1.0: width *= renderScale height *= renderScale return width, height def expandUserNodes(self): """Return a new drawing which only contains primitive shapes.""" obj = Group.expandUserNodes(self) obj.width = self.width obj.height = self.height return obj def copy(self): """Returns a copy""" return self._copy(self.__class__(self.width, self.height)) def asGroup(self, *args, **kw): return self._copy(apply(Group, args, kw)) def save(self, formats=None, verbose=None, fnRoot=None, outDir=None, title='', **kw): """Saves copies of self in desired location and formats. Multiple formats can be supported in one call the extra keywords can be of the form _renderPM_dpi=96 (which passes dpi=96 to renderPM) """ from reportlab import rl_config ext = '' if not fnRoot: fnRoot = getattr(self, 'fileNamePattern', (self.__class__.__name__ + '%03d')) chartId = getattr(self, 'chartId', 0) if callable(fnRoot): fnRoot = fnRoot(chartId) else: try: fnRoot = fnRoot % getattr(self, 'chartId', 0) except TypeError, err: #the exact error message changed from 2.2 to 2.3 so we need to #check a substring if str(err).find('not all arguments converted') < 0: raise if os.path.isabs(fnRoot): outDir, fnRoot = os.path.split(fnRoot) else: outDir = outDir or getattr(self, 'outDir', '.') outDir = outDir.rstrip().rstrip(os.sep) if not outDir: outDir = '.' if not os.path.isabs(outDir): outDir = os.path.join( getattr(self, '_override_CWD', os.path.dirname(sys.argv[0])), outDir) if not os.path.isdir(outDir): os.makedirs(outDir) fnroot = os.path.normpath(os.path.join(outDir, fnRoot)) plotMode = os.path.splitext(fnroot) if string.lower(plotMode[1][1:]) in self._saveModes: fnroot = plotMode[0] plotMode = map(str.lower, formats or getattr(self, 'formats', ['pdf'])) verbose = (verbose is not None and (verbose, ) or (getattr(self, 'verbose', verbose), ))[0] _saved = logger.warnOnce.enabled, logger.infoOnce.enabled logger.warnOnce.enabled = logger.infoOnce.enabled = verbose if 'pdf' in plotMode: from reportlab.graphics import renderPDF filename = fnroot + '.pdf' if verbose: print "generating PDF file %s" % filename renderPDF.drawToFile(self, filename, title, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPDF_', **kw)) ext = ext + '/.pdf' if sys.platform == 'mac': import macfs, macostools macfs.FSSpec(filename).SetCreatorType("CARO", "PDF ") macostools.touched(filename) for bmFmt in ('gif', 'png', 'tif', 'jpg', 'tiff', 'pct', 'pict', 'bmp', 'tiffp', 'tiffl', 'tiff1'): if bmFmt in plotMode: from reportlab.graphics import renderPM filename = '%s.%s' % (fnroot, bmFmt) if verbose: print "generating %s file %s" % (bmFmt, filename) renderPM.drawToFile(self, filename, fmt=bmFmt, showBoundary=getattr( self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPM_', **kw)) ext = ext + '/.' + bmFmt if 'eps' in plotMode: try: from rlextra.graphics import renderPS_SEP as renderPS except ImportError: from reportlab.graphics import renderPS filename = fnroot + '.eps' if verbose: print "generating EPS file %s" % filename renderPS.drawToFile(self, filename, title=fnroot, dept=getattr(self, 'EPS_info', ['Testing'])[0], company=getattr(self, 'EPS_info', ['', 'ReportLab'])[1], preview=getattr(self, 'preview', rl_config.eps_preview), showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), ttf_embed=getattr(self, 'ttf_embed', rl_config.eps_ttf_embed), **_extraKW(self, '_renderPS_', **kw)) ext = ext + '/.eps' if 'svg' in plotMode: from reportlab.graphics import renderSVG filename = fnroot + '.svg' if verbose: print "generating EPS file %s" % filename renderSVG.drawToFile(self, filename, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderSVG_', **kw)) ext = ext + '/.svg' if 'ps' in plotMode: from reportlab.graphics import renderPS filename = fnroot + '.ps' if verbose: print "generating EPS file %s" % filename renderPS.drawToFile(self, filename, showBoundary=getattr(self, 'showBorder', rl_config.showBoundary), **_extraKW(self, '_renderPS_', **kw)) ext = ext + '/.ps' if 'py' in plotMode: filename = fnroot + '.py' if verbose: print "generating py file %s" % filename open(filename, 'w').write(self._renderPy()) ext = ext + '/.py' logger.warnOnce.enabled, logger.infoOnce.enabled = _saved if hasattr(self, 'saveLogger'): self.saveLogger(fnroot, ext) return ext and fnroot + ext[1:] or ''
def drawToFile(bc, filename): """Write barcode to SVG file <filename>.""" renderSVG.drawToFile(barcode.rl.draw_barcode(bc), filename)