예제 #1
0
    def wrap(self, aW, aH):
        frame = self._frame
        from reportlab.platypus.doctemplate import NextPageTemplate, CurrentFrameFlowable, LayoutError
        G = [NextPageTemplate(self.nextTemplate)]
        if aH < self.gap + self.required - _FUZZ:
            #we are going straight to the nextTemplate with no attempt to modify the frames
            G.append(PageBreak())
        else:
            #we are going to modify the incoming templates
            templates = self._doctemplateAttr('pageTemplates')
            if templates is None:
                raise LayoutError('%s called in non-doctemplate environment' %
                                  self.identity())
            T = [t for t in templates if t.id == self.nextTemplate]
            if not T:
                raise LayoutError('%s.nextTemplate=%s not found' %
                                  (self.identity(), self.nextTemplate))
            T = T[0]
            F = [f for f in T.frames if f.id in self.nextFrames]
            N = [f.id for f in F]
            N = [f for f in self.nextFrames if f not in N]
            if N:
                raise LayoutError(
                    '%s frames=%r not found in pageTemplate(%s)\n%r has frames %r'
                    % (self.identity(), N, T.id, T, [f.id for f in T.frames]))
            T = self._doctemplateAttr('pageTemplate')

            def unwrap(canv, doc, T=T, onPage=T.onPage, oldFrames=T.frames):
                T.frames = oldFrames
                T.onPage = onPage
                onPage(canv, doc)

            T.onPage = unwrap
            h = aH - self.gap
            for i, f in enumerate(F):
                f = copy(f)
                f.height = h
                f._reset()
                F[i] = f
            T.frames = F
            G.append(CurrentFrameFlowable(F[0].id))
        frame.add_generated_content(*G)
        return 0, 0
예제 #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
예제 #3
0
파일: trml2pdf.py 프로젝트: mrmoyeez/XacCRM
 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