예제 #1
0
파일: html2html.py 프로젝트: ccdos/OpenERP
 def process_text(node,new_node):
     if new_node.tag in ['story','tr','section']:
         new_node.attrib.clear()
     for child in utils._child_get(node, self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.text  = utils._process_text(self, child.text)
                 new_child.tail  = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             if new_child.tag=='img' and new_child.get('name'):
                 if _regex.findall(new_child.get('name')) :
                     src =  utils._process_text(self, new_child.get('name'))
                     if src :
                         new_child.set('src','data:image/gif;base64,%s'%src)
                         output = cStringIO.StringIO(base64.decodestring(src))
                         img = ImageReader(output)
                         (width,height) = img.getSize()
                         if not new_child.get('width'):
                             new_child.set('width',str(width))
                         if not new_child.get('height') :
                             new_child.set('height',str(height))
                     else :
                         new_child.getparent().remove(new_child)
             new_child.text  = utils._process_text(self, child.text)
             new_child.tail  = utils._process_text(self, child.tail)
예제 #2
0
 def process_text(node, new_node):
     if new_node.tag in ['story', 'tr', 'section']:
         new_node.attrib.clear()
     for child in utils._child_get(node, self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.text = utils._process_text(self, child.text)
                 new_child.tail = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             if new_child.tag == 'img' and new_child.get('name'):
                 if _regex.findall(new_child.get('name')):
                     src = utils._process_text(self,
                                               new_child.get('name'))
                     if src:
                         new_child.set('src',
                                       'data:image/gif;base64,%s' % src)
                         output = cStringIO.StringIO(
                             base64.decodestring(src))
                         img = ImageReader(output)
                         (width, height) = img.getSize()
                         if not new_child.get('width'):
                             new_child.set('width', str(width))
                         if not new_child.get('height'):
                             new_child.set('height', str(height))
                     else:
                         new_child.getparent().remove(new_child)
             new_child.text = utils._process_text(self, child.text)
             new_child.tail = utils._process_text(self, child.tail)
예제 #3
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or '')
     for n in utils._child_get(node,self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ('rml_except', 'rml_loop', 'rml_tag'):
                 del txt_n.attrib[key]
         if not n.tag == 'bullet':
             txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
         rc1 += etree.tostring(txt_n)
     return rc1
예제 #4
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or "")
     for n in utils._child_get(node, self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ("rml_except", "rml_loop", "rml_tag"):
                 del txt_n.attrib[key]
         if not n.tag == "bullet":
             txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace("\n", ""))) or ""
         rc1 += etree.tostring(txt_n)
     return rc1
예제 #5
0
 def _textual(self, node):
     rc1 = utils._process_text(self, node.text or '')
     for n in utils._child_get(node,self):
         txt_n = copy.deepcopy(n)
         for key in txt_n.attrib.keys():
             if key in ('rml_except', 'rml_loop', 'rml_tag'):
                 del txt_n.attrib[key]
         if not n.tag == 'bullet':
             txt_n.text = utils.xml2str(self._textual(n))
         txt_n.tail = n.tail and utils.xml2str(utils._process_text(self, n.tail.replace('\n',''))) or ''
         rc1 += etree.tostring(txt_n)
     return rc1
예제 #6
0
 def process_text(node,new_node):
     for child in utils._child_get(node, self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.text  = utils._process_text(self, child.text)
                 new_child.tail  = utils._process_text(self, child.tail)
                 new_child.remove(n)
             process_text(child, new_child)
         else:
             new_child.text  = utils._process_text(self, child.text)
             new_child.tail  = utils._process_text(self, child.tail)
예제 #7
0
 def _tag_para(self, node):
     new_node = copy.deepcopy(node)
     new_node.tag = 'p'
     if new_node.attrib.get('style',False):
         new_node.set('class', new_node.get('style'))
     new_node.text = utils._process_text(self, node.text)
     return etree.tostring(new_node)
예제 #8
0
파일: rml2html.py 프로젝트: erplens/erplens
 def _tag_para(self, node):
     new_node = copy.deepcopy(node)
     new_node.tag = 'p'
     if new_node.attrib.get('style',False):
         new_node.set('class', new_node.get('style'))
     new_node.text = utils._process_text(self, node.text)
     return etree.tostring(new_node)
예제 #9
0
 def _textual(self, node, x=0, y=0):
     text = node.text and node.text.encode('utf-8') or ''
     rc = utils._process_text(self, text)
     for n in node:
         if n.tag == 'seq':
             from reportlab.lib.sequencer import getSequencer
             seq = getSequencer()
             rc += str(seq.next(n.get('id')))
         if n.tag == 'pageCount':
             if x or y:
                 self.canvas.translate(x,y)
             self.canvas.doForm('pageCount%s' % (self.canvas._storyCount,))
             if x or y:
                 self.canvas.translate(-x,-y)
         if n.tag == 'pageNumber':
             rc += str(self.canvas.getPageNumber())
         rc += utils._process_text(self, n.tail)
     return rc.replace('\n','')
예제 #10
0
 def _textual(self, node, x=0, y=0):
     text = node.text and node.text.encode('utf-8') or ''
     rc = utils._process_text(self, text)
     for n in node:
         if n.tag == 'seq':
             from reportlab.lib.sequencer import getSequencer
             seq = getSequencer()
             rc += str(seq.next(n.get('id')))
         if n.tag == 'pageCount':
             if x or y:
                 self.canvas.translate(x,y)
             self.canvas.doForm('pageCount%s' % (self.canvas._storyCount,))
             if x or y:
                 self.canvas.translate(-x,-y)
         if n.tag == 'pageNumber':
             rc += str(self.canvas.getPageNumber())
         rc += utils._process_text(self, n.tail)
     return rc.replace('\n','')
예제 #11
0
 def __init__(self, node, style, localcontext = {}):
     self.localcontext = localcontext
     coord = [utils.unit_get(x) for x in utils._process_text(self, node.text).split(' ')]
     self.ok = False
     self.posx = coord[0]
     self.posy = coord[1]
     self.width = coord[2]-coord[0]
     self.ok = coord[1]==coord[3]
     self.style = style
     self.style = style.get('hr')
예제 #12
0
파일: rml2html.py 프로젝트: erplens/erplens
 def __init__(self, node, style, localcontext = {}):
     self.localcontext = localcontext
     coord = [utils.unit_get(x) for x in utils._process_text(self, node.text).split(' ')]
     self.ok = False
     self.posx = coord[0]
     self.posy = coord[1]
     self.width = coord[2]-coord[0]
     self.ok = coord[1]==coord[3]
     self.style = style
     self.style = style.get('hr')
예제 #13
0
    def _textual(self, node, x=0, y=0):
        text = node.text and node.text.encode("utf-8") or ""
        rc = utils._process_text(self, text)
        for n in node:
            if n.tag == "seq":
                from openerp.reportlab.lib.sequencer import getSequencer

                seq = getSequencer()
                rc += str(seq.next(n.get("id")))
            if n.tag == "pageCount":
                if x or y:
                    self.canvas.translate(x, y)
                self.canvas.doForm("pageCount%s" % (self.canvas._storyCount,))
                if x or y:
                    self.canvas.translate(-x, -y)
            if n.tag == "pageNumber":
                rc += str(self.canvas.getPageNumber())
            rc += utils._process_text(self, n.tail)
        return rc.replace("\n", "")
예제 #14
0
파일: rml2html.py 프로젝트: erplens/erplens
    def __init__(self, node, style,localcontext = {}):
        self.localcontext = localcontext
        self.posx = utils.unit_get(node.get('x'))
        self.posy =  utils.unit_get(node.get('y'))

        aligns = {
            'drawString': 'left',
            'drawRightString': 'right',
            'drawCentredString': 'center'
        }
        align = aligns[node.tag]
        self.pos = [(self.posx, self.posy, align, utils._process_text(self, node.text), style.get('td'), style.font_size_get('td'))]
예제 #15
0
    def __init__(self, node, style,localcontext = {}):
        self.localcontext = localcontext
        self.posx = utils.unit_get(node.get('x'))
        self.posy =  utils.unit_get(node.get('y'))

        aligns = {
            'drawString': 'left',
            'drawRightString': 'right',
            'drawCentredString': 'center'
        }
        align = aligns[node.tag]
        self.pos = [(self.posx, self.posy, align, utils._process_text(self, node.text), style.get('td'), style.font_size_get('td'))]
예제 #16
0
파일: rml2html.py 프로젝트: erplens/erplens
 def process(node,new_node):
     for child in utils._child_get(node,self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.remove(n)
             process(child, new_child)
         else:
             new_child.text  = utils._process_text(self, child.text)
             new_child.tag = 'p'
             try:
                 if new_child.get('style').find('terp_tblheader')!= -1:
                     new_node.tag = 'th'
             except Exception:
                 pass
예제 #17
0
 def process(node,new_node):
     for child in utils._child_get(node,self):
         new_child = copy.deepcopy(child)
         new_node.append(new_child)
         if len(child):
             for n in new_child:
                 new_child.remove(n)
             process(child, new_child)
         else:
             new_child.text  = utils._process_text(self, child.text)
             new_child.tag = 'p'
             try:
                 if new_child.get('style').find('terp_tblheader')!= -1:
                     new_node.tag = 'th'
             except Exception:
                 pass
예제 #18
0
 def __init__(self, template, localcontext=None):
     self.frame_pos = -1
     self.localcontext = localcontext
     self.frames = []
     self.template_order = []
     self.page_template = {}
     self.loop = 0
     self._tags = {
         'drawString': _rml_tmpl_draw_string,
         'drawRightString': _rml_tmpl_draw_string,
         'drawCentredString': _rml_tmpl_draw_string,
         'lines': _rml_tmpl_draw_lines
     }
     self.style = _rml_draw_style()
     rc = 'data:image/png;base64,'
     self.data = ''
     for pt in template.findall('pageTemplate'):
         frames = {}
         id = pt.get('id')
         self.template_order.append(id)
         for tmpl in pt.findall('frame'):
             posy = int(utils.unit_get(tmpl.get('y1')))
             posx = int(utils.unit_get(tmpl.get('x1')))
             frames[(posy, posx, tmpl.get('id'))] = _rml_tmpl_frame(
                 posx, utils.unit_get(tmpl.get('width')))
         for tmpl in pt.findall('pageGraphics'):
             for n in tmpl:
                 if n.tag == 'image':
                     self.data = rc + utils._process_text(self, n.text)
                 if n.tag in self._tags:
                     t = self._tags[n.tag](n, self.style, self.localcontext)
                     frames[(t.posy, t.posx, n.tag)] = t
                 else:
                     self.style.update(n)
         keys = frames.keys()
         keys.sort()
         keys.reverse()
         self.page_template[id] = []
         for key in range(len(keys)):
             if key > 0 and keys[key - 1][0] == keys[key][0]:
                 if type(self.page_template[id][-1]) == type(
                         frames[keys[key]]):
                     if self.page_template[id][-1].tag_mergeable():
                         self.page_template[id][-1].merge(frames[keys[key]])
                     continue
             self.page_template[id].append(frames[keys[key]])
     self.template = self.template_order[0]
예제 #19
0
파일: rml2html.py 프로젝트: erplens/erplens
 def __init__(self, template, localcontext=None):
     self.frame_pos = -1
     self.localcontext = localcontext
     self.frames = []
     self.template_order = []
     self.page_template = {}
     self.loop = 0
     self._tags = {
         'drawString': _rml_tmpl_draw_string,
         'drawRightString': _rml_tmpl_draw_string,
         'drawCentredString': _rml_tmpl_draw_string,
         'lines': _rml_tmpl_draw_lines
     }
     self.style = _rml_draw_style()
     rc = 'data:image/png;base64,'
     self.data = ''
     for pt in template.findall('pageTemplate'):
         frames = {}
         id = pt.get('id')
         self.template_order.append(id)
         for tmpl in pt.findall('frame'):
             posy = int(utils.unit_get(tmpl.get('y1')))
             posx = int(utils.unit_get(tmpl.get('x1')))
             frames[(posy,posx,tmpl.get('id'))] = _rml_tmpl_frame(posx, utils.unit_get(tmpl.get('width')))
         for tmpl in pt.findall('pageGraphics'):
             for n in tmpl:
                 if n.tag == 'image':
                     self.data = rc + utils._process_text(self, n.text)
                 if n.tag in self._tags:
                     t = self._tags[n.tag](n, self.style,self.localcontext)
                     frames[(t.posy,t.posx,n.tag)] = t
                 else:
                     self.style.update(n)
         keys = frames.keys()
         keys.sort()
         keys.reverse()
         self.page_template[id] = []
         for key in range(len(keys)):
             if key>0 and keys[key-1][0] == keys[key][0]:
                 if type(self.page_template[id][-1]) == type(frames[keys[key]]):
                     if self.page_template[id][-1].tag_mergeable():
                         self.page_template[id][-1].merge(frames[keys[key]])
                     continue
             self.page_template[id].append(frames[keys[key]])
     self.template = self.template_order[0]
예제 #20
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
예제 #21
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 openerp.reportlab.graphics.barcode import code128
                from openerp.reportlab.graphics.barcode import code39
                from openerp.reportlab.graphics.barcode import code93
                from openerp.reportlab.graphics.barcode import common
                from openerp.reportlab.graphics.barcode import fourstate
                from openerp.reportlab.graphics.barcode import usps
                from openerp.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 openerp.reportlab.platypus.doctemplate import NextFrameFlowable

            return NextFrameFlowable(str(node.get("name")))
        elif node.tag == "currentFrame":
            from openerp.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
예제 #22
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