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 _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 render_DL(canv, letter_info, from_info): barcode = letter_info["barcode"] from_name = from_info["name"] from_addr = from_info["addr"] from_index = from_info["index"] from_fio = from_info["fio"] no_return = "Возврату не подлежит" if letter_info["no-return"] else "" dst_name = letter_info["recipient-name"] dst_addr = ", ".join( map( lambda k: letter_info[k], filter(lambda a: a in letter_info, [ "region-to", "area-to", "place-to", "location-to", "street-to", "hotel-to", "house-to", "slash-to", "letter-to", "building-to", "corpus-to", "room-to" ]))) dst_index = "%06d" % letter_info["index-to"] textlines = [ { "x": 20, "y": 100, "w": 65, "h": 15, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_name }, { "x": 20, "y": 85, "w": 65, "h": 15, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_addr }, { "x": 55, "y": 80, "w": 30, "h": 5, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_CENTER, "text": from_index }, { "x": 20, "y": 80, "w": 30, "h": 5, "fontsize": 6, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_fio }, { "x": 20, "y": 70, "w": 30, "h": 7, "fontsize": 8, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": no_return }, { "x": 115, "y": 50, "w": 85, "h": 15, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": dst_name }, { "x": 115, "y": 30, "w": 85, "h": 20, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": dst_addr }, { "x": 105, "y": 18, "w": 30, "h": 5, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_CENTER, "text": dst_index }, { "x": 95, "y": 84, "w": 45, "h": 5, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_CENTER, "text": "%s %s %s %s" % (barcode[0:6], barcode[6:8], barcode[8:13], barcode[13:14]) }, ] if "mail-category" in letter_info and letter_info[ "mail-category"] == "ORDERED": textlines.append({ "x": 95, "y": 75, "w": 45, "h": 5, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_CENTER, "text": u"Заказное" }) for i in textlines: ps = getSampleStyleSheet()["Normal"] ps.fontName = i["font"] ps.alignment = i["alignment"] ps.fontSize = i["fontsize"] par = Paragraph(i["text"], ps) w, h = par.wrap(i["w"] * mm, i["h"] * mm) par.drawOn(canv, i["x"] * mm, i["y"] * mm) n = -1 for ind in dst_index: n += 1 if ind not in _INDEX_IMAGES: continue canv.drawImage( ImageReader(BytesIO(standard_b64decode(_INDEX_IMAGES[ind]))), (20 + 9 * n) * mm, 10 * mm) # barcode if barcode > "": ift = common.I2of5(value=barcode, checksum=False, bearers=0, barWidth=0.35 * mm, gap=1 * mm, barHeight=10 * mm) ift.drawOn(canv, 95 * mm, 90 * mm)
def render_DLQR(canv, letter_info, from_info): barcode = letter_info["barcode"] from_name = from_info["name"] from_addr = from_info["addr"] from_index = from_info["index"] from_fio = from_info["fio"] no_return = u"Возврату не подлежит" if letter_info["no-return"] else "" dst_name = letter_info["recipient-name"] dst_addr = ", ".join( map( lambda k: letter_info[k], filter(lambda a: a in letter_info, [ "region-to", "area-to", "place-to", "location-to", "street-to", "hotel-to", "house-to", "slash-to", "letter-to", "building-to", "corpus-to", "room-to" ]))) dst_index = "%06d" % letter_info["index-to"] mass = letter_info["mass"] total_rate = letter_info["total_rate_wo_vat"] + letter_info["total_vat"] rate_print = u"%d руб %02d коп" % (total_rate // 100, total_rate - (total_rate // 100) * 100) textlines = [ # from { "x": 15, "y": 73, "w": 13, "h": 15, "fontsize": 8, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": u"От кого:" }, { "x": 28, "y": 73, "w": 70, "h": 15, "fontsize": 8, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_name }, { "x": 15, "y": 65, "w": 13, "h": 15, "fontsize": 8, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": u"Откуда:" }, { "x": 28, "y": 65, "w": 70, "h": 15, "fontsize": 8, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_addr }, { "x": 20, "y": 50, "w": 65, "h": 15, "fontsize": 12, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": from_index }, { "x": 15, "y": 25, "w": 30, "h": 15, "fontsize": 8, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": from_fio }, { "x": 15, "y": 35, "w": 55, "h": 25, "fontsize": 12, "font": "TimesNewRomanBold", "alignment": TA_CENTER, "text": no_return, "border": True }, # to { "x": 110, "y": 40, "w": 15, "h": 15, "fontsize": 9, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": u"Кому:" }, { "x": 120, "y": 40, "w": 80, "h": 15, "fontsize": 9, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": dst_name }, { "x": 110, "y": 30, "w": 15, "h": 15, "fontsize": 9, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": u"Куда:" }, { "x": 120, "y": 30, "w": 80, "h": 20, "fontsize": 9, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": dst_addr }, { "x": 175, "y": 15, "w": 25, "h": 5, "fontsize": 14, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": dst_index }, # barcode { "x": 15, "y": 80, "w": 45, "h": 15, "fontsize": 12, "font": "TimesNewRoman", "alignment": TA_CENTER, "text": "%s %s %s %s" % (barcode[0:6], barcode[6:8], barcode[8:13], barcode[13:14]) }, # letter category etc { "x": 110, "y": 70, "w": 45, "h": 15, "fontsize": 10, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": u"Без разряда" }, { "x": 110, "y": 65, "w": 85, "h": 15, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": u"Вес: %dг" % (mass, ) }, { "x": 110, "y": 60, "w": 85, "h": 15, "fontsize": 10, "font": "TimesNewRoman", "alignment": TA_LEFT, "text": u"Плата за пересылку: %s" % (rate_print, ) }, ] if "mail-category" in letter_info: cat = u"Письмо простое" if letter_info["mail-category"] == "ORDERED": cat = u"Письмо заказное" textlines.append({ "x": 110, "y": 75, "w": 45, "h": 15, "fontsize": 10, "font": "TimesNewRomanBold", "alignment": TA_LEFT, "text": cat }) for i in textlines: ps = getSampleStyleSheet()["Normal"] ps.fontName = i["font"] ps.alignment = i["alignment"] ps.fontSize = i["fontsize"] par = Paragraph(i["text"], ps) w, h = par.wrap(i["w"] * mm, i["h"] * mm) par.drawOn(canv, i["x"] * mm, i["y"] * mm - h) if ("border" in i) and h > 0: canv.setStrokeColorRGB(0, 0, 0) canv.rect(i["x"] * mm, i["y"] * mm - 2 * h, w, 2 * h) if letter_info["opm_id"] > "": render_QR(canv, letter_info, from_info, 110 * mm, 75 * mm) if barcode > "": ift = common.I2of5(value=barcode, checksum=False, bearers=0, barWidth=0.35 * mm, gap=1 * mm, barHeight=10 * mm) ift.drawOn(canv, 15 * mm, 80 * mm)