Beispiel #1
0
 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))
Beispiel #2
0
    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
Beispiel #3
0
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)
Beispiel #4
0
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)