def __init__(self, localcontext, out, node, doc, images={}, path='.', title=None): self.localcontext = localcontext self.images= images self.path = path self.title = title if not node.get('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: ps = map(lambda x:x.strip(), node.get('pageSize').replace(')', '').replace('(', '').split(',')) pageSize = ( utils.unit_get(ps[0]),utils.unit_get(ps[1]) ) self.doc_tmpl = TinyDocTemplate(out, pagesize=pageSize, **utils.attr_get(node, ['leftMargin','rightMargin','topMargin','bottomMargin'], {'allowSplitting':'int','showBoundary':'bool','title':'str','author':'str'})) self.page_templates = [] self.styles = doc.styles self.doc = doc pts = node.findall('pageTemplate') for pt in pts: frames = [] for frame_el in pt.findall('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, ['x1','y1', 'width','height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding'], {'id':'str', 'showBoundary':'bool'})) ) if utils.attr_get(frame_el, ['last']): frame.lastFrame = True frames.append( frame ) try : gr = pt.findall('pageGraphics')\ or pt[1].findall('pageGraphics') except Exception: # FIXME: be even more specific, perhaps? gr='' if len(gr): drw = _rml_draw(self.localcontext,gr[0], self.doc, images=images, path=self.path, title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) else: drw = _rml_draw(self.localcontext,node,self.doc,title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames,onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) self.doc_tmpl.addPageTemplates(self.page_templates)
def _path(self, node): self.path = self.canvas.beginPath() self.path.moveTo(**utils.attr_get(node, ['x', 'y'])) for n in node.childNodes: if n.nodeType == node.ELEMENT_NODE: if n.localName == 'moveto': vals = utils.text_get(n).split() self.path.moveTo(utils.unit_get(vals[0]), utils.unit_get(vals[1])) elif n.localName == 'curvesto': vals = utils.text_get(n).split() while len(vals) > 5: pos = [] while len(pos) < 6: pos.append(utils.unit_get(vals.pop(0))) self.path.curveTo(*pos) elif (n.nodeType == node.TEXT_NODE): data = n.data.split( ) # Not sure if I must merge all TEXT_NODE ? while len(data) > 1: x = utils.unit_get(data.pop(0)) y = utils.unit_get(data.pop(0)) self.path.lineTo(x, y) if (not node.hasAttribute('close')) or utils.bool_get( node.getAttribute('close')): self.path.close() self.canvas.drawPath( self.path, **utils.attr_get(node, [], { 'fill': 'bool', 'stroke': 'bool' }))
def __init__(self, out, node, doc): if not node.hasAttribute('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: ps = map(lambda x:x.strip(), node.getAttribute('pageSize').replace(')', '').replace('(', '').split(',')) pageSize = ( utils.unit_get(ps[0]),utils.unit_get(ps[1]) ) cm = reportlab.lib.units.cm self.doc_tmpl = platypus.BaseDocTemplate(out, pagesize=pageSize, **utils.attr_get(node, ['leftMargin','rightMargin','topMargin','bottomMargin'], {'allowSplitting':'int','showBoundary':'bool','title':'str','author':'str'})) self.page_templates = [] self.styles = doc.styles self.doc_tmpl.styles = doc.styles # hack self.doc = doc pts = node.getElementsByTagName('pageTemplate') for pt in pts: frames = [] for frame_el in pt.getElementsByTagName('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, ['x1','y1', 'width','height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding'], {'id':'text', 'showBoundary':'bool'})) ) frames.append( frame ) gr = pt.getElementsByTagName('pageGraphics') if len(gr): drw = _rml_draw(gr[0]) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) else: self.page_templates.append( platypus.PageTemplate(frames=frames, **utils.attr_get(pt, [], {'id':'str'}) )) self.doc_tmpl.addPageTemplates(self.page_templates)
def _path(self, node): self.path = self.canvas.beginPath() self.path.moveTo(**utils.attr_get(node, ['x', 'y'])) for n in utils._child_get(node, self): if not n.text: if n.tag == 'moveto': vals = utils.text_get(n).split() self.path.moveTo(utils.unit_get(vals[0]), utils.unit_get(vals[1])) elif n.tag == 'curvesto': vals = utils.text_get(n).split() while len(vals) > 5: pos = [] while len(pos) < 6: pos.append(utils.unit_get(vals.pop(0))) self.path.curveTo(*pos) elif n.text: data = n.text.split( ) # Not sure if I must merge all TEXT_NODE ? while len(data) > 1: x = utils.unit_get(data.pop(0)) y = utils.unit_get(data.pop(0)) self.path.lineTo(x, y) if (not node.get('close')) or utils.bool_get(node.get('close')): self.path.close() self.canvas.drawPath( self.path, **utils.attr_get(node, [], { 'fill': 'bool', 'stroke': 'bool' }))
def _rect(self, node): if node.hasAttribute("round"): self.canvas.roundRect( radius=utils.unit_get(node.getAttribute("round")), **utils.attr_get(node, ["x", "y", "width", "height"], {"fill": "bool", "stroke": "bool"}) ) else: self.canvas.rect(**utils.attr_get(node, ["x", "y", "width", "height"], {"fill": "bool", "stroke": "bool"}))
def _flowable(self, node): # FIXME: speedup if node.localName=='para': style = self.styles.para_style_get(node) # ERROR return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.localName=='name': self.styles.names[ node.getAttribute('id')] = node.getAttribute('value') return None elif node.localName=='xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int','frags':'int'}))) elif node.localName=='pre': style = self.styles.para_style_get(node) return platypus.Preformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int'}))) elif node.localName=='illustration': return self._illustration(node) elif node.localName=='blockTable': return self._table(node) elif node.localName=='title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.localName=='h1': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading1'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.localName=='h2': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading2'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.localName=='h3': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading3'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.localName=='image': return platypus.Image(node.getAttribute('file'), mask=(250,255,250,255,250,255), **(utils.attr_get(node, ['width','height']))) elif node.localName=='spacer': if node.hasAttribute('width'): width = utils.unit_get(node.getAttribute('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.getAttribute('length')) return platypus.Spacer(width=width, height=length) elif node.localName=='pageBreak': return platypus.PageBreak() elif node.localName=='condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.localName=='setNextTemplate': return platypus.NextPageTemplate(str(node.getAttribute('name'))) elif node.localName=='nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif barcode_codes and node.localName=='barCodeFlowable': code = barcode_codes.get(node.getAttribute('code'), Code128) return code( self._textual(node), **utils.attr_get(node, ['barWidth', 'barHeight'], {'fontName': 'str', 'humanReadable': 'bool'})) else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (node.localName,)) return None
def __init__(self, out, node, doc): if not node.hasAttribute("pageSize"): pageSize = (utils.unit_get("21cm"), utils.unit_get("29.7cm")) else: ps = map(lambda x: x.strip(), node.getAttribute("pageSize").replace(")", "").replace("(", "").split(",")) pageSize = (utils.unit_get(ps[0]), utils.unit_get(ps[1])) cm = reportlab.lib.units.cm self.doc_tmpl = platypus.BaseDocTemplate( out, pagesize=pageSize, **utils.attr_get( node, ["leftMargin", "rightMargin", "topMargin", "bottomMargin"], {"allowSplitting": "int", "showBoundary": "bool", "title": "str", "author": "str"}, ) ) self.page_templates = [] self.styles = doc.styles self.doc = doc pts = node.getElementsByTagName("pageTemplate") for pt in pts: frames = [] for frame_el in pt.getElementsByTagName("frame"): frame = platypus.Frame( **( utils.attr_get( frame_el, [ "x1", "y1", "width", "height", "leftPadding", "rightPadding", "bottomPadding", "topPadding", ], {"id": "text", "showBoundary": "bool"}, ) ) ) frames.append(frame) gr = pt.getElementsByTagName("pageGraphics") if len(gr): drw = _rml_draw(gr[0], self.doc) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {"id": "str"})) ) else: self.page_templates.append( platypus.PageTemplate(frames=frames, **utils.attr_get(pt, [], {"id": "str"})) ) self.doc_tmpl.addPageTemplates(self.page_templates)
def _flowable(self, node, extra_style=None): if node.tag == 'para': style = self.styles.para_style_get(node) if extra_style: style.__dict__.update(extra_style) result = [] for i in self._textual(node).split('\n'): result.append( platypus.Paragraph( i, style, **(utils.attr_get(node, [], {'bulletText': 'str'})))) return result elif node.tag == 'barCode': try: from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code39 from reportlab.graphics.barcode import code93 from reportlab.graphics.barcode import common from reportlab.graphics.barcode import fourstate from reportlab.graphics.barcode import usps except Exception, e: return None args = utils.attr_get( node, [], { 'ratio': 'float', 'xdim': 'unit', 'height': 'unit', 'checksum': 'int', 'quiet': 'int', 'width': 'unit', 'stop': 'bool', 'bearers': 'int', 'barWidth': 'float', 'barHeight': 'float' }) codes = { 'codabar': lambda x: common.Codabar(x, **args), 'code11': lambda x: common.Code11(x, **args), 'code128': lambda x: code128.Code128(x, **args), 'standard39': lambda x: code39.Standard39(x, **args), 'standard93': lambda x: code93.Standard93(x, **args), 'i2of5': lambda x: common.I2of5(x, **args), 'extended39': lambda x: code39.Extended39(x, **args), 'extended93': lambda x: code93.Extended93(x, **args), 'msi': lambda x: common.MSI(x, **args), 'fim': lambda x: usps.FIM(x, **args), 'postnet': lambda x: usps.POSTNET(x, **args), } code = 'code128' if node.get('code'): code = node.get('code').lower() return codes[code](self._textual(node))
def __init__(self, out, node, doc): if not node.hasAttribute('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: ps = map( lambda x: x.strip(), node.getAttribute('pageSize').replace(')', '').replace( '(', '').split(',')) pageSize = (utils.unit_get(ps[0]), utils.unit_get(ps[1])) cm = reportlab.lib.units.cm self.doc_tmpl = platypus.BaseDocTemplate( out, pagesize=pageSize, **utils.attr_get( node, ['leftMargin', 'rightMargin', 'topMargin', 'bottomMargin'], { 'allowSplitting': 'int', 'showBoundary': 'bool', 'title': 'str', 'author': 'str' })) self.page_templates = [] self.styles = doc.styles self.doc = doc pts = node.getElementsByTagName('pageTemplate') for pt in pts: frames = [] for frame_el in pt.getElementsByTagName('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, [ 'x1', 'y1', 'width', 'height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding' ], { 'id': 'text', 'showBoundary': 'bool' }))) frames.append(frame) gr = pt.getElementsByTagName('pageGraphics') if len(gr): drw = _rml_draw(gr[0], self.doc) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get( pt, [], {'id': 'str'}))) else: self.page_templates.append( platypus.PageTemplate(frames=frames, **utils.attr_get( pt, [], {'id': 'str'}))) self.doc_tmpl.addPageTemplates(self.page_templates)
def _rect(self, node): if node.hasAttribute('round'): self.canvas.roundRect( radius=utils.unit_get(node.getAttribute('round')), **utils.attr_get(node, ['x', 'y', 'width', 'height'], { 'fill': 'bool', 'stroke': 'bool' })) else: self.canvas.rect( **utils.attr_get(node, ['x', 'y', 'width', 'height'], { 'fill': 'bool', 'stroke': 'bool' }))
def _ellipse(self, node): x1 = utils.unit_get(node.get('x')) x2 = utils.unit_get(node.get('width')) y1 = utils.unit_get(node.get('y')) y2 = utils.unit_get(node.get('height')) self.canvas.ellipse(x1,y1,x2,y2, **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
def _table(self, node): length = 0 colwidths = None rowheights = None data = [] for tr in _child_get(node,'tr'): data2 = [] for td in _child_get(tr, 'td'): flow = [] for n in td.childNodes: if n.nodeType==node.ELEMENT_NODE: flow.append( self._flowable(n) ) if not len(flow): flow = self._textual(td) data2.append( flow ) if len(data2)>length: length=len(data2) for ab in data: while len(ab)<length: ab.append('') while len(data2)<length: data2.append('') data.append( data2 ) if node.hasAttribute('colWidths'): assert length == len(node.getAttribute('colWidths').split(',')) colwidths = [utils.unit_get(f.strip()) for f in node.getAttribute('colWidths').split(',')] if node.hasAttribute('rowHeights'): rowheights = [utils.unit_get(f.strip()) for f in node.getAttribute('rowHeights').split(',')] table = platypus.Table(data = data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'] ,{'repeatRows':'int','repeatCols':'int'}))) if node.hasAttribute('style'): table.setStyle(self.styles.table_styles[node.getAttribute('style')]) return table
def _ellipse(self, node): x1 = utils.unit_get(node.get("x")) x2 = utils.unit_get(node.get("width")) y1 = utils.unit_get(node.get("y")) y2 = utils.unit_get(node.get("height")) self.canvas.ellipse(x1, y1, x2, y2, **utils.attr_get(node, [], {"fill": "bool", "stroke": "bool"}))
def _circle(self, node): self.canvas.circle( x_cen=utils.unit_get(node.getAttribute("x")), y_cen=utils.unit_get(node.getAttribute("y")), r=utils.unit_get(node.getAttribute("radius")), **utils.attr_get(node, [], {"fill": "bool", "stroke": "bool"}) )
def __init__(self, localcontext, out, node, doc, images=None, path='.', title=None, page_limit=None): if localcontext is None: localcontext={'internal_header':True} self.localcontext = localcontext if images is None: self.images = {} else: self.images = images self.path = path self.title = title self.page_limit = page_limit if not node.get('pageSize'): pageSize = (utils.unit_get('21cm'), utils.unit_get('29.7cm')) else: ps = map(lambda x:x.strip(), node.get('pageSize').replace(')', '').replace('(', '').split(',')) pageSize = ( utils.unit_get(ps[0]),utils.unit_get(ps[1]) ) self.doc_tmpl = TinyDocTemplate(out, pagesize=pageSize, **utils.attr_get(node, ['leftMargin','rightMargin','topMargin','bottomMargin'], {'allowSplitting':'int','showBoundary':'bool','rotation':'int','title':'str','author':'str'})) if self.page_limit is not None: self.doc_tmpl.set_page_limit(self.page_limit) self.page_templates = [] self.styles = doc.styles self.doc = doc self.image=[] pts = node.findall('pageTemplate') for pt in pts: frames = [] for frame_el in pt.findall('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, ['x1','y1', 'width','height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding'], {'id':'str', 'showBoundary':'bool'})) ) if utils.attr_get(frame_el, ['last']): frame.lastFrame = True frames.append( frame ) try : gr = pt.findall('pageGraphics')\ or pt[1].findall('pageGraphics') except Exception: # FIXME: be even more specific, perhaps? gr='' if len(gr): # self.image=[ n for n in utils._child_get(gr[0], self) if n.tag=='image' or not self.localcontext] drw = _rml_draw(self.localcontext,gr[0], self.doc, images=images, path=self.path, title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) else: drw = _rml_draw(self.localcontext,node,self.doc,title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames,onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) self.doc_tmpl.addPageTemplates(self.page_templates)
def __init__(self, localcontext, out, node, doc, images=None, path='.', title=None): if images is None: images = {} if not localcontext: localcontext={'internal_header':True} self.localcontext = localcontext self.images= images self.path = path self.title = title pagesize_map = {'a4': A4, 'us_letter': letter } pageSize = A4 if self.localcontext.get('company'): pageSize = pagesize_map.get(self.localcontext.get('company').paper_format, A4) if node.get('pageSize'): ps = map(lambda x:x.strip(), node.get('pageSize').replace(')', '').replace('(', '').split(',')) pageSize = ( utils.unit_get(ps[0]),utils.unit_get(ps[1]) ) self.doc_tmpl = TinyDocTemplate(out, pagesize=pageSize, **utils.attr_get(node, ['leftMargin','rightMargin','topMargin','bottomMargin'], {'allowSplitting':'int','showBoundary':'bool','rotation':'int','title':'str','author':'str'})) self.page_templates = [] self.styles = doc.styles self.doc = doc self.image=[] pts = node.findall('pageTemplate') for pt in pts: frames = [] for frame_el in pt.findall('frame'): frame = platypus.Frame( **(utils.attr_get(frame_el, ['x1','y1', 'width','height', 'leftPadding', 'rightPadding', 'bottomPadding', 'topPadding'], {'id':'str', 'showBoundary':'bool'})) ) if utils.attr_get(frame_el, ['last']): frame.lastFrame = True frames.append( frame ) try : gr = pt.findall('pageGraphics')\ or pt[1].findall('pageGraphics') except Exception: # FIXME: be even more specific, perhaps? gr='' if len(gr): # self.image=[ n for n in utils._child_get(gr[0], self) if n.tag=='image' or not self.localcontext] drw = _rml_draw(self.localcontext,gr[0], self.doc, images=images, path=self.path, title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames, onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) else: drw = _rml_draw(self.localcontext,node,self.doc,title=self.title) self.page_templates.append( platypus.PageTemplate(frames=frames,onPage=drw.render, **utils.attr_get(pt, [], {'id':'str'}) )) self.doc_tmpl.addPageTemplates(self.page_templates)
def _circle(self, node): self.canvas.circle(x_cen=utils.unit_get(node.getAttribute('x')), y_cen=utils.unit_get(node.getAttribute('y')), r=utils.unit_get(node.getAttribute('radius')), **utils.attr_get(node, [], { 'fill': 'bool', 'stroke': 'bool' }))
def _drawString(self, node): v = utils.attr_get(node, ['x','y']) text=self._textual(node, **v) text = utils.xml2str(text) try: self.canvas.drawString(text=text, **v) except TypeError: _logger.error("Bad RML: <drawString> tag requires attributes 'x' and 'y'!") raise
def _drawString(self, node): v = utils.attr_get(node, ['x','y']) text=self._textual(node, **v) text = utils.xml2str(text) try: self.canvas.drawString(text=text, **v) except TypeError as e: _logger.error("Bad RML: <drawString> tag requires attributes 'x' and 'y'!") raise e
def _place(self, node): flows = _rml_flowable(self.doc).render(node) infos = utils.attr_get(node, ['x','y','width','height']) infos['y']+=infos['height'] for flow in flows: w,h = flow.wrap(infos['width'], infos['height']) if w<=infos['width'] and h<=infos['height']: infos['y']-=h flow.drawOn(self.canvas,infos['x'],infos['y']) infos['height']-=h else: raise ValueError, "Not enough space"
def _place(self, node): flows = _rml_flowable(self.doc, self.localcontext, images=self.images, path=self.path, title=self.title).render(node) infos = utils.attr_get(node, ['x','y','width','height']) infos['y']+=infos['height'] for flow in flows: w,h = flow.wrap(infos['width'], infos['height']) if w<=infos['width'] and h<=infos['height']: infos['y']-=h flow.drawOn(self.canvas,infos['x'],infos['y']) infos['height']-=h else: raise ValueError, "Not enough space"
def _place(self, node): flows = _rml_flowable(self.doc).render(node) infos = utils.attr_get(node, ["x", "y", "width", "height"]) infos["y"] += infos["height"] for flow in flows: w, h = flow.wrap(infos["width"], infos["height"]) if w <= infos["width"] and h <= infos["height"]: infos["y"] -= h flow.drawOn(self.canvas, infos["x"], infos["y"]) infos["height"] -= h else: raise ValueError, "Not enough space"
def _place(self, node): flows = _rml_flowable(self.doc, self.localcontext, images=self.images, path=self.path, title=self.title, canvas=self.canvas).render(node) infos = utils.attr_get(node, ['x','y','width','height']) infos['y']+=infos['height'] for flow in flows: w,h = flow.wrap(infos['width'], infos['height']) if w<=infos['width'] and h<=infos['height']: infos['y']-=h flow.drawOn(self.canvas,infos['x'],infos['y']) infos['height']-=h else: raise ValueError("Not enough space")
def _flowable(self, node, extra_style=None): if node.tag=='para': style = self.styles.para_style_get(node) if extra_style: style.__dict__.update(extra_style) result = [] for i in self._textual(node).split('\n'): result.append(platypus.Paragraph(i, style, **(utils.attr_get(node, [], {'bulletText':'str'})))) return result elif node.tag=='barCode': try: from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code39 from reportlab.graphics.barcode import code93 from reportlab.graphics.barcode import common from reportlab.graphics.barcode import fourstate from reportlab.graphics.barcode import usps except Exception, e: return None args = utils.attr_get(node, [], {'ratio':'float','xdim':'unit','height':'unit','checksum':'int','quiet':'int','width':'unit','stop':'bool','bearers':'int','barWidth':'float','barHeight':'float'}) codes = { 'codabar': lambda x: common.Codabar(x, **args), 'code11': lambda x: common.Code11(x, **args), 'code128': lambda x: code128.Code128(x, **args), 'standard39': lambda x: code39.Standard39(x, **args), 'standard93': lambda x: code93.Standard93(x, **args), 'i2of5': lambda x: common.I2of5(x, **args), 'extended39': lambda x: code39.Extended39(x, **args), 'extended93': lambda x: code93.Extended93(x, **args), 'msi': lambda x: common.MSI(x, **args), 'fim': lambda x: usps.FIM(x, **args), 'postnet': lambda x: usps.POSTNET(x, **args), } code = 'code128' if node.get('code'): code = node.get('code').lower() return codes[code](self._textual(node))
def _place(self, node): flows = _rml_flowable( self.doc, self.localcontext, images=self.images, path=self.path, title=self.title, canvas=self.canvas ).render(node) infos = utils.attr_get(node, ["x", "y", "width", "height"]) infos["y"] += infos["height"] for flow in flows: w, h = flow.wrap(infos["width"], infos["height"]) if w <= infos["width"] and h <= infos["height"]: infos["y"] -= h flow.drawOn(self.canvas, infos["x"], infos["y"]) infos["height"] -= h else: raise ValueError("Not enough space")
def _path(self, node): self.path = self.canvas.beginPath() self.path.moveTo(**utils.attr_get(node, ["x", "y"])) for n in node.childNodes: if n.nodeType == node.ELEMENT_NODE: if n.localName == "moveto": vals = utils.text_get(n).split() self.path.moveTo(utils.unit_get(vals[0]), utils.unit_get(vals[1])) elif n.localName == "curvesto": vals = utils.text_get(n).split() while len(vals) > 5: pos = [] while len(pos) < 6: pos.append(utils.unit_get(vals.pop(0))) self.path.curveTo(*pos) elif n.nodeType == node.TEXT_NODE: data = n.data.split() # Not sure if I must merge all TEXT_NODE ? while len(data) > 1: x = utils.unit_get(data.pop(0)) y = utils.unit_get(data.pop(0)) self.path.lineTo(x, y) if (not node.hasAttribute("close")) or utils.bool_get(node.getAttribute("close")): self.path.close() self.canvas.drawPath(self.path, **utils.attr_get(node, [], {"fill": "bool", "stroke": "bool"}))
def _path(self, node): self.path = self.canvas.beginPath() self.path.moveTo(**utils.attr_get(node, ['x','y'])) for n in utils._child_get(node, self): if not n.text : if n.tag=='moveto': vals = utils.text_get(n).split() self.path.moveTo(utils.unit_get(vals[0]), utils.unit_get(vals[1])) elif n.tag=='curvesto': vals = utils.text_get(n).split() while len(vals)>5: pos=[] while len(pos)<6: pos.append(utils.unit_get(vals.pop(0))) self.path.curveTo(*pos) elif n.text: data = n.text.split() # Not sure if I must merge all TEXT_NODE ? while len(data)>1: x = utils.unit_get(data.pop(0)) y = utils.unit_get(data.pop(0)) self.path.lineTo(x,y) if (not node.get('close')) or utils.bool_get(node.get('close')): self.path.close() self.canvas.drawPath(self.path, **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
def _table(self, node): length = 0 colwidths = None rowheights = None data = [] for tr in _child_get(node, 'tr'): data2 = [] for td in _child_get(tr, 'td'): flow = [] for n in td.childNodes: if n.nodeType == node.ELEMENT_NODE: flow.append(self._flowable(n)) if not len(flow): flow = self._textual(td) data2.append(flow) if len(data2) > length: length = len(data2) for ab in data: while len(ab) < length: ab.append('') while len(data2) < length: data2.append('') data.append(data2) if node.hasAttribute('colWidths'): assert length == len(node.getAttribute('colWidths').split(',')) colwidths = [ utils.unit_get(f.strip()) for f in node.getAttribute('colWidths').split(',') ] if node.hasAttribute('rowHeights'): rowheights = [ utils.unit_get(f.strip()) for f in node.getAttribute('rowHeights').split(',') ] table = platypus.Table(data=data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'], { 'repeatRows': 'int', 'repeatCols': 'int' }))) if node.hasAttribute('style'): table.setStyle( self.styles.table_styles[node.getAttribute('style')]) return table
def _box_style_get(self, node): class BoxStyle(reportlab.lib.styles.PropertySet): pass return BoxStyle(node.getAttribute('name'), **utils.attr_get(node, ( 'boxWidth', 'boxHeight', 'boxGap', 'lineWidth', 'fontSize', 'labelFontSize', ), { 'parent': 'str', 'alias': 'str', 'fontName': 'str', 'labelFontName': 'str', 'textColor': 'str', 'boxStrokeColor': 'str', 'boxFillColor': 'str', 'labelTextColor': 'str', }))
def _table(self, node): length = 0 colwidths = None rowheights = None data = [] for tr in _child_get(node, "tr"): data2 = [] for td in _child_get(tr, "td"): flow = [] for n in td.childNodes: if n.nodeType == node.ELEMENT_NODE: flow.append(self._flowable(n)) if not len(flow): flow = self._textual(td) data2.append(flow) if len(data2) > length: length = len(data2) for ab in data: while len(ab) < length: ab.append("") while len(data2) < length: data2.append("") data.append(data2) if node.hasAttribute("colWidths"): assert length == len(node.getAttribute("colWidths").split(",")) colwidths = [utils.unit_get(f.strip()) for f in node.getAttribute("colWidths").split(",")] if node.hasAttribute("rowHeights"): rowheights = [utils.unit_get(f.strip()) for f in node.getAttribute("rowHeights").split(",")] table = platypus.Table( data=data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ["splitByRow"], {"repeatRows": "int", "repeatCols": "int"})) ) if node.hasAttribute("style"): table.setStyle(self.styles.table_styles[node.getAttribute("style")]) return table
def _drawRightString(self, node): v = utils.attr_get(node, ['x','y']) text=self._textual(node, **v) text = utils.xml2str(text) self.canvas.drawRightString(text=text, **v)
def _drawRightString(self, node): self.canvas.drawRightString(text=self._textual(node), **utils.attr_get(node, ['x', 'y']))
def _letterBoxes(self, node): # 1. get args (args.update(style)) attrs = utils.attr_get(node, ( 'x', 'y', 'boxWidth', 'boxHeight', 'boxGap', 'lineWidth', 'fontSize', 'labelFontSize', 'labelOffsetX', 'labelOffsetY', ), { 'style': 'str', 'count': 'int', 'boxStrokeColor': 'str', 'boxFillColor': 'str', 'textColor': 'str', 'fontName': 'str', 'label': 'str', 'labelTextColor': 'str', 'labelFontName': 'str', }) # 2. apply style (hack) if ('style' in attrs): args = copy.deepcopy(self.styles.box_styles[attrs['style']].__dict__) args.update(attrs) else: args = attrs # 3. draw: # rect (x, y, width, height, stroke:bool, fill=bool) + setFillColor(color) + setStrokeColor(color) + setLineWidth(lineWidth) # drawString: x, y + setFont(name, size)|setFontSize()|canvas._fontsize + setFillColor(textColor) # self.canvas.saveState() if ('lineWidth' in args): self.canvas.setLineWidth(args['lineWidth']) if (('fontSize' in args) and not ('fontName' in args)): self.canvas.setFontSize(args['fontSize']) elif ('fontName' in args): self.canvas.setFont(args['fontName'], args.get('fontSize'), self.canvas._fontsize) # hack # 4. calc: boxWidth, boxHeight if not ('boxWidth' in args): args['boxWidth'] = self.canvas.stringWidth('W', self.canvas._fontname, self.canvas._fontsize) if not ('boxHeight' in args): args['boxHeight'] = self.canvas._fontsize + 2 if not ('boxGap' in args): args['boxGap'] = 0 x = args['x'] y = args['y'] w = args['boxWidth'] h = args['boxHeight'] g = args['boxGap'] dy = (0.5 * h) - (0.25 * self.canvas._fontsize) #text = self._textual(node) text = self._textual(node).decode('utf-8') # 5. let's go for i in xrange(args['count']): x1 = x + i * (w + g) # 5.1. rect self.canvas.saveState() if ('boxFillColor' in args): self.canvas.setFillColor(args['boxFillColor']) if ('boxStrokeColor' in args): self.canvas.setStrokeColor(args['boxStrokeColor']) self.canvas.rect(x = x1, y = y, width = w, height = h, fill = ('boxFillColor' in args)) self.canvas.restoreState() # 5.2. symbol self.canvas.saveState() if ('textColor' in args): self.canvas.setFillColor(args['textColor']) if (i < len(text)): self.canvas.drawCentredString(float(x1 + (float(w) / 2.0)), float(y) + dy, text=text[i]) self.canvas.restoreState() self.canvas.restoreState() # 5.3. label if ('label' in args): self.canvas.saveState() if (('labelFontSize' in args) and not ('labelFontName' in args)): self.canvas.setFontSize(args['labelFontSize']) elif ('labelFontName' in args): self.canvas.setFont(args['labelFontName'], args.get('labelFontSize'), self.canvas._fontsize) # hack if ('labelTextColor' in args): self.canvas.setFillColor(args['labelTextColor']) y += args.get('labelOffsetY', 0) self.canvas.drawString(x = x + args.get('labelOffsetX', 0), y = y + args.get('labelOffsetY', 0), text=args['label']) # TODO: align, default OffsetX self.canvas.restoreState()
def _flowable(self, node, extra_style=None): if node.tag=='pto': return self._pto(node) if node.tag=='para': style = self.styles.para_style_get(node) if extra_style: style.__dict__.update(extra_style) result = [] for i in self._textual(node).split('\n'): result.append(platypus.Paragraph(i, style, **(utils.attr_get(node, [], {'bulletText':'str'})))) return result elif node.tag=='barCode': try: from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code39 from reportlab.graphics.barcode import code93 from reportlab.graphics.barcode import common from reportlab.graphics.barcode import fourstate from reportlab.graphics.barcode import usps from reportlab.graphics.barcode import createBarcodeDrawing except ImportError: self._logger.warning("Cannot use barcode renderers:", exc_info=True) return None args = utils.attr_get(node, [], {'ratio':'float','xdim':'unit','height':'unit','checksum':'int','quiet':'int','width':'unit','stop':'bool','bearers':'int','barWidth':'float','barHeight':'float'}) codes = { 'codabar': lambda x: common.Codabar(x, **args), 'code11': lambda x: common.Code11(x, **args), 'code128': lambda x: code128.Code128(str(x), **args), 'standard39': lambda x: code39.Standard39(str(x), **args), 'standard93': lambda x: code93.Standard93(str(x), **args), 'i2of5': lambda x: common.I2of5(x, **args), 'extended39': lambda x: code39.Extended39(str(x), **args), 'extended93': lambda x: code93.Extended93(str(x), **args), 'msi': lambda x: common.MSI(x, **args), 'fim': lambda x: usps.FIM(x, **args), 'postnet': lambda x: usps.POSTNET(x, **args), 'ean13': lambda x: createBarcodeDrawing('EAN13', value=str(x), **args), 'qrcode': lambda x: createBarcodeDrawing('QR', value=x, **args), } code = 'code128' if node.get('code'): code = node.get('code').lower() return codes[code](self._textual(node)) elif node.tag=='name': self.styles.names[ node.get('id')] = node.get('value') return None elif node.tag=='xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int','frags':'int'}))) elif node.tag=='pre': style = self.styles.para_style_get(node) return platypus.Preformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int'}))) elif node.tag=='illustration': return self._illustration(node) elif node.tag=='blockTable': return self._table(node) elif node.tag=='title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif re.match('^h([1-9]+[0-9]*)$', (node.tag or '')): styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading'+str(node.tag[1:])] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.tag=='image': image_data = False if not node.get('file'): if node.get('name'): if node.get('name') in self.doc.images: self._logger.debug("Image %s read ", node.get('name')) image_data = self.doc.images[node.get('name')].read() else: self._logger.warning("Image %s not defined", node.get('name')) return False else: import base64 if self.localcontext: newtext = utils._process_text(self, node.text or '') node.text = newtext image_data = base64.decodestring(node.text) if not image_data: self._logger.debug("No inline image data") return False image = StringIO(image_data) else: self._logger.debug("Image get from file %s", node.get('file')) image = _open_image(node.get('file'), path=self.doc.path) return platypus.Image(image, mask=(250,255,250,255,250,255), **(utils.attr_get(node, ['width','height']))) elif node.tag=='spacer': if node.get('width'): width = utils.unit_get(node.get('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.get('length')) return platypus.Spacer(width=width, height=length) elif node.tag=='section': return self.render(node) elif node.tag == 'pageNumberReset': return PageReset() elif node.tag in ('pageBreak', 'nextPage'): return platypus.PageBreak() elif node.tag=='condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.tag=='setNextTemplate': return platypus.NextPageTemplate(str(node.get('name'))) elif node.tag=='nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif node.tag == 'setNextFrame': from reportlab.platypus.doctemplate import NextFrameFlowable return NextFrameFlowable(str(node.get('name'))) elif node.tag == 'currentFrame': from reportlab.platypus.doctemplate import CurrentFrameFlowable return CurrentFrameFlowable(str(node.get('name'))) elif node.tag == 'frameEnd': return EndFrameFlowable() elif node.tag == 'hr': width_hr=node.get('width') or '100%' color_hr=node.get('color') or 'black' thickness_hr=node.get('thickness') or 1 lineCap_hr=node.get('lineCap') or 'round' return platypus.flowables.HRFlowable(width=width_hr,color=color.get(color_hr),thickness=float(thickness_hr),lineCap=str(lineCap_hr)) else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (node.tag,)) return None
def _drawRightString(self, node): self.canvas.drawRightString(text=self._textual(node), **utils.attr_get(node, ["x", "y"]))
def _circle(self, node): self.canvas.circle(x_cen=utils.unit_get(node.get('x')), y_cen=utils.unit_get(node.get('y')), r=utils.unit_get(node.get('radius')), **utils.attr_get(node, [], {'fill':'bool','stroke':'bool'}))
def _table(self, node): children = utils._child_get(node,self,'tr') if not children: return None length = 0 colwidths = None rowheights = None data = [] styles = [] posy = 0 for tr in children: paraStyle = None if tr.get('style'): st = copy.deepcopy(self.styles.table_styles[tr.get('style')]) for s in st._cmds: s[1][1] = posy s[2][1] = posy styles.append(st) if tr.get('paraStyle'): paraStyle = self.styles.styles[tr.get('paraStyle')] data2 = [] posx = 0 for td in utils._child_get(tr, self,'td'): if td.get('style'): st = copy.deepcopy(self.styles.table_styles[td.get('style')]) for s in st._cmds: s[1][1] = posy s[2][1] = posy s[1][0] = posx s[2][0] = posx styles.append(st) if td.get('paraStyle'): # TODO: merge styles paraStyle = self.styles.styles[td.get('paraStyle')] posx += 1 flow = [] for n in utils._child_get(td, self): if n.tag == etree.Comment: n.text = '' continue fl = self._flowable(n, extra_style=paraStyle) if isinstance(fl,list): flow += fl else: flow.append( fl ) if not len(flow): flow = self._textual(td) data2.append( flow ) if len(data2)>length: length=len(data2) for ab in data: while len(ab)<length: ab.append('') while len(data2)<length: data2.append('') data.append( data2 ) posy += 1 if node.get('colWidths'): assert length == len(node.get('colWidths').split(',')) colwidths = [utils.unit_get(f.strip()) for f in node.get('colWidths').split(',')] if node.get('rowHeights'): rowheights = [utils.unit_get(f.strip()) for f in node.get('rowHeights').split(',')] if len(rowheights) == 1: rowheights = rowheights[0] table = platypus.LongTable(data = data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'] ,{'repeatRows':'int','repeatCols':'int'}))) if node.get('style'): table.setStyle(self.styles.table_styles[node.get('style')]) for s in styles: table.setStyle(s) return table
def _flowable(self, node, extra_style=None): if node.tag == "pto": return self._pto(node) if node.tag == "para": style = self.styles.para_style_get(node) if extra_style: style.__dict__.update(extra_style) result = [] for i in self._textual(node).split("\n"): result.append(platypus.Paragraph(i, style, **(utils.attr_get(node, [], {"bulletText": "str"})))) return result elif node.tag == "barCode": try: from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code39 from reportlab.graphics.barcode import code93 from reportlab.graphics.barcode import common from reportlab.graphics.barcode import fourstate from reportlab.graphics.barcode import usps from reportlab.graphics.barcode import createBarcodeDrawing except ImportError: _logger.warning("Cannot use barcode renderers:", exc_info=True) return None args = utils.attr_get( node, [], { "ratio": "float", "xdim": "unit", "height": "unit", "checksum": "int", "quiet": "int", "width": "unit", "stop": "bool", "bearers": "int", "barWidth": "float", "barHeight": "float", }, ) codes = { "codabar": lambda x: common.Codabar(x, **args), "code11": lambda x: common.Code11(x, **args), "code128": lambda x: code128.Code128(str(x), **args), "standard39": lambda x: code39.Standard39(str(x), **args), "standard93": lambda x: code93.Standard93(str(x), **args), "i2of5": lambda x: common.I2of5(x, **args), "extended39": lambda x: code39.Extended39(str(x), **args), "extended93": lambda x: code93.Extended93(str(x), **args), "msi": lambda x: common.MSI(x, **args), "fim": lambda x: usps.FIM(x, **args), "postnet": lambda x: usps.POSTNET(x, **args), "ean13": lambda x: createBarcodeDrawing("EAN13", value=str(x), **args), "qrcode": lambda x: createBarcodeDrawing("QR", value=x, **args), } code = "code128" if node.get("code"): code = node.get("code").lower() return codes[code](self._textual(node)) elif node.tag == "name": self.styles.names[node.get("id")] = node.get("value") return None elif node.tag == "xpre": style = self.styles.para_style_get(node) return platypus.XPreformatted( self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str", "dedent": "int", "frags": "int"})) ) elif node.tag == "pre": style = self.styles.para_style_get(node) return platypus.Preformatted( self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str", "dedent": "int"})) ) elif node.tag == "illustration": return self._illustration(node) elif node.tag == "blockTable": return self._table(node) elif node.tag == "title": styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Title"] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif re.match("^h([1-9]+[0-9]*)$", (node.tag or "")): styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Heading" + str(node.tag[1:])] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.tag == "image": image_data = False if not node.get("file"): if node.get("name"): if node.get("name") in self.doc.images: _logger.debug("Image %s read ", node.get("name")) image_data = self.doc.images[node.get("name")].read() else: _logger.warning("Image %s not defined", node.get("name")) return False else: import base64 newtext = node.text if self.localcontext: newtext = utils._process_text(self, node.text or "") image_data = base64.decodestring(newtext) if not image_data: _logger.debug("No inline image data") return False image = StringIO(image_data) else: _logger.debug("Image get from file %s", node.get("file")) image = _open_image(node.get("file"), path=self.doc.path) return platypus.Image( image, mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ["width", "height"])) ) elif node.tag == "spacer": if node.get("width"): width = utils.unit_get(node.get("width")) else: width = utils.unit_get("1cm") length = utils.unit_get(node.get("length")) return platypus.Spacer(width=width, height=length) elif node.tag == "section": return self.render(node) elif node.tag == "pageNumberReset": return PageReset() elif node.tag in ("pageBreak", "nextPage"): return platypus.PageBreak() elif node.tag == "condPageBreak": return platypus.CondPageBreak(**(utils.attr_get(node, ["height"]))) elif node.tag == "setNextTemplate": return platypus.NextPageTemplate(str(node.get("name"))) elif node.tag == "nextFrame": return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif node.tag == "setNextFrame": from reportlab.platypus.doctemplate import NextFrameFlowable return NextFrameFlowable(str(node.get("name"))) elif node.tag == "currentFrame": from reportlab.platypus.doctemplate import CurrentFrameFlowable return CurrentFrameFlowable(str(node.get("name"))) elif node.tag == "frameEnd": return EndFrameFlowable() elif node.tag == "hr": width_hr = node.get("width") or "100%" color_hr = node.get("color") or "black" thickness_hr = node.get("thickness") or 1 lineCap_hr = node.get("lineCap") or "round" return platypus.flowables.HRFlowable( width=width_hr, color=color.get(color_hr), thickness=float(thickness_hr), lineCap=str(lineCap_hr) ) else: sys.stderr.write("Warning: flowable not yet implemented: %s !\n" % (node.tag,)) return None
def _flowable(self, node): if node.localName == "para": style = self.styles.para_style_get(node) return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.localName == "name": self.styles.names[node.getAttribute("id")] = node.getAttribute("value") return None elif node.localName == "xpre": style = self.styles.para_style_get(node) return platypus.XPreformatted( self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str", "dedent": "int", "frags": "int"})) ) elif node.localName == "pre": style = self.styles.para_style_get(node) return platypus.Preformatted( self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str", "dedent": "int"})) ) elif node.localName == "illustration": return self._illustration(node) elif node.localName == "blockTable": return self._table(node) elif node.localName == "title": styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Title"] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.localName == "h1": styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Heading1"] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.localName == "h2": styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Heading2"] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.localName == "h3": styles = reportlab.lib.styles.getSampleStyleSheet() style = styles["Heading3"] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {"bulletText": "str"}))) elif node.localName == "image": return platypus.Image( node.getAttribute("file"), mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ["width", "height"])) ) elif node.localName == "spacer": if node.hasAttribute("width"): width = utils.unit_get(node.getAttribute("width")) else: width = utils.unit_get("1cm") length = utils.unit_get(node.getAttribute("length")) return platypus.Spacer(width=width, height=length) elif node.localName == "pageBreak": return platypus.PageBreak() elif node.localName == "condPageBreak": return platypus.CondPageBreak(**(utils.attr_get(node, ["height"]))) elif node.localName == "setNextTemplate": return platypus.NextPageTemplate(str(node.getAttribute("name"))) elif node.localName == "nextFrame": return platypus.CondPageBreak(1000) # TODO: change the 1000 ! else: sys.stderr.write("Warning: flowable not yet implemented: %s !\n" % (node.localName,)) return None
def _flowable(self, node, extra_style=None): if node.tag=='pto': return self._pto(node) if node.tag=='para': style = self.styles.para_style_get(node) if extra_style: style.__dict__.update(extra_style) result = [] for i in self._textual(node).split('\n'): result.append(platypus.Paragraph(i, style, **(utils.attr_get(node, [], {'bulletText':'str'})))) return result elif node.tag=='barCode': try: from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code39 from reportlab.graphics.barcode import code93 from reportlab.graphics.barcode import common from reportlab.graphics.barcode import fourstate from reportlab.graphics.barcode import usps from reportlab.graphics.barcode import createBarcodeDrawing except ImportError: _logger.warning("Cannot use barcode renderers:", exc_info=True) return None args = utils.attr_get(node, [], {'ratio':'float','xdim':'unit','height':'unit','checksum':'int','quiet':'int','width':'unit','stop':'bool','bearers':'int','barWidth':'float','barHeight':'float'}) codes = { 'codabar': lambda x: common.Codabar(x, **args), 'code11': lambda x: common.Code11(x, **args), 'code128': lambda x: code128.Code128(str(x), **args), 'standard39': lambda x: code39.Standard39(str(x), **args), 'standard93': lambda x: code93.Standard93(str(x), **args), 'i2of5': lambda x: common.I2of5(x, **args), 'extended39': lambda x: code39.Extended39(str(x), **args), 'extended93': lambda x: code93.Extended93(str(x), **args), 'msi': lambda x: common.MSI(x, **args), 'fim': lambda x: usps.FIM(x, **args), 'postnet': lambda x: usps.POSTNET(x, **args), 'ean13': lambda x: createBarcodeDrawing('EAN13', value=str(x), **args), 'qrcode': lambda x: createBarcodeDrawing('QR', value=x, **args), } code = 'code128' if node.get('code'): code = node.get('code').lower() return codes[code](self._textual(node)) elif node.tag=='name': self.styles.names[ node.get('id')] = node.get('value') return None elif node.tag=='xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int','frags':'int'}))) elif node.tag=='pre': style = self.styles.para_style_get(node) return platypus.Preformatted(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str','dedent':'int'}))) elif node.tag=='illustration': return self._illustration(node) elif node.tag=='blockTable': return self._table(node) elif node.tag=='title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif re.match('^h([1-9]+[0-9]*)$', (node.tag or '')): styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading'+str(node.tag[1:])] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText':'str'}))) elif node.tag=='image': image_data = False if not node.get('file'): if node.get('name'): if node.get('name') in self.doc.images: _logger.debug("Image %s read ", node.get('name')) image_data = self.doc.images[node.get('name')].read() else: _logger.warning("Image %s not defined", node.get('name')) return False else: import base64 newtext = node.text if self.localcontext: newtext = utils._process_text(self, node.text or '') image_data = base64.decodestring(newtext) if not image_data: _logger.debug("No inline image data") return False image = StringIO(image_data) else: _logger.debug("Image get from file %s", node.get('file')) image = _open_image(node.get('file'), path=self.doc.path) return platypus.Image(image, mask=(250,255,250,255,250,255), **(utils.attr_get(node, ['width','height']))) elif node.tag=='spacer': if node.get('width'): width = utils.unit_get(node.get('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.get('length')) return platypus.Spacer(width=width, height=length) elif node.tag=='section': return self.render(node) elif node.tag == 'pageNumberReset': return PageReset() elif node.tag in ('pageBreak', 'nextPage'): return platypus.PageBreak() elif node.tag=='condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.tag=='setNextTemplate': return platypus.NextPageTemplate(str(node.get('name'))) elif node.tag=='nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif node.tag == 'setNextFrame': from reportlab.platypus.doctemplate import NextFrameFlowable return NextFrameFlowable(str(node.get('name'))) elif node.tag == 'currentFrame': from reportlab.platypus.doctemplate import CurrentFrameFlowable return CurrentFrameFlowable(str(node.get('name'))) elif node.tag == 'frameEnd': return EndFrameFlowable() elif node.tag == 'hr': width_hr=node.get('width') or '100%' color_hr=node.get('color') or 'black' thickness_hr=node.get('thickness') or 1 lineCap_hr=node.get('lineCap') or 'round' return platypus.flowables.HRFlowable(width=width_hr,color=color.get(color_hr),thickness=float(thickness_hr),lineCap=str(lineCap_hr)) else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (node.tag,)) return None
def _table(self, node): children = utils._child_get(node,self,'tr') if not children: return None length = 0 colwidths = None rowheights = None data = [] styles = [] posy = 0 for tr in children: paraStyle = None if tr.get('style'): st = copy.deepcopy(self.styles.table_styles[tr.get('style')]) for si in range(len(st._cmds)): s = list(st._cmds[si]) s[1] = (s[1][0],posy) s[2] = (s[2][0],posy) st._cmds[si] = tuple(s) styles.append(st) if tr.get('paraStyle'): paraStyle = self.styles.styles[tr.get('paraStyle')] data2 = [] posx = 0 for td in utils._child_get(tr, self,'td'): if td.get('style'): st = copy.deepcopy(self.styles.table_styles[td.get('style')]) for s in st._cmds: s[1][1] = posy s[2][1] = posy s[1][0] = posx s[2][0] = posx styles.append(st) if td.get('paraStyle'): # TODO: merge styles paraStyle = self.styles.styles[td.get('paraStyle')] posx += 1 flow = [] for n in utils._child_get(td, self): if n.tag == etree.Comment: n.text = '' continue fl = self._flowable(n, extra_style=paraStyle) if isinstance(fl,list): flow += fl else: flow.append( fl ) if not len(flow): flow = self._textual(td) data2.append( flow ) if len(data2)>length: length=len(data2) for ab in data: while len(ab)<length: ab.append('') while len(data2)<length: data2.append('') data.append( data2 ) posy += 1 if node.get('colWidths'): assert length == len(node.get('colWidths').split(',')) colwidths = [utils.unit_get(f.strip()) for f in node.get('colWidths').split(',')] if node.get('rowHeights'): rowheights = [utils.unit_get(f.strip()) for f in node.get('rowHeights').split(',')] if len(rowheights) == 1: rowheights = rowheights[0] table = platypus.LongTable(data = data, colWidths=colwidths, rowHeights=rowheights, **(utils.attr_get(node, ['splitByRow'] ,{'repeatRows':'int','repeatCols':'int'}))) if node.get('style'): table.setStyle(self.styles.table_styles[node.get('style')]) for s in styles: table.setStyle(s) return table
def _flowable(self, node): if node.localName == 'para': style = self.styles.para_style_get(node) return platypus.Paragraph( self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'name': self.styles.names[node.getAttribute('id')] = node.getAttribute( 'value') return None elif node.localName == 'xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted( self._textual(node), style, **(utils.attr_get(node, [], { 'bulletText': 'str', 'dedent': 'int', 'frags': 'int' }))) elif node.localName == 'pre': style = self.styles.para_style_get(node) return platypus.Preformatted( self._textual(node), style, **(utils.attr_get(node, [], { 'bulletText': 'str', 'dedent': 'int' }))) elif node.localName == 'illustration': return self._illustration(node) elif node.localName == 'blockTable': return self._table(node) elif node.localName == 'title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph( self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h1': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading1'] return platypus.Paragraph( self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h2': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading2'] return platypus.Paragraph( self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h3': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading3'] return platypus.Paragraph( self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'image': return platypus.Image(node.getAttribute('file'), mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ['width', 'height']))) elif node.localName == 'spacer': if node.hasAttribute('width'): width = utils.unit_get(node.getAttribute('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.getAttribute('length')) return platypus.Spacer(width=width, height=length) elif node.localName == 'pageBreak': return platypus.PageBreak() elif node.localName == 'condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.localName == 'setNextTemplate': return platypus.NextPageTemplate(str(node.getAttribute('name'))) elif node.localName == 'nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (node.localName, )) return None
def _rect(self, node): if node.get('round'): self.canvas.roundRect(radius=utils.unit_get(node.get('round')), **utils.attr_get(node, ['x','y','width','height'], {'fill':'bool','stroke':'bool'})) else: self.canvas.rect(**utils.attr_get(node, ['x','y','width','height'], {'fill':'bool','stroke':'bool'}))
def _drawCenteredString(self, node): self.canvas.drawCentredString(text=self._textual(node), **utils.attr_get(node, ['x','y']))
'postnet': lambda x: usps.POSTNET(x, **args), } code = 'code128' if node.get('code'): code = node.get('code').lower() return codes[code](self._textual(node)) elif node.tag == 'name': self.styles.names[node.get('id')] = node.get('value') return None elif node.tag == 'xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted( self._textual(node), style, **(utils.attr_get(node, [], { 'bulletText': 'str', 'dedent': 'int', 'frags': 'int' }))) elif node.tag == 'pre': style = self.styles.para_style_get(node) return platypus.Preformatted( self._textual(node), style, **(utils.attr_get(node, [], { 'bulletText': 'str', 'dedent': 'int' }))) elif node.tag == 'illustration': return self._illustration(node) elif node.tag == 'blockTable': return self._table(node) elif node.tag == 'title':