X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=openerp%2Freport%2Frender%2Frml2pdf%2Ftrml2pdf.py;h=00b119ac61f273d39d924381ddfc9cf8f9cfdb0e;hb=b6a7402fdbddfe817fa36292e6f89e8659f9bdea;hp=153eff14b65958d14d89b56b0eac034d5d30d228;hpb=66cadcdb18c9ce0f48a05cf7d13cb98ed2f171e5;p=odoo%2Fodoo.git diff --git a/openerp/report/render/rml2pdf/trml2pdf.py b/openerp/report/render/rml2pdf/trml2pdf.py index 153eff1..00b119a 100644 --- a/openerp/report/render/rml2pdf/trml2pdf.py +++ b/openerp/report/render/rml2pdf/trml2pdf.py @@ -82,7 +82,6 @@ def _open_image(filename, path=None): pass raise IOError("File %s cannot be found in image path" % filename) - class NumberedCanvas(canvas.Canvas): def __init__(self, *args, **kwargs): canvas.Canvas.__init__(self, *args, **kwargs) @@ -94,14 +93,15 @@ class NumberedCanvas(canvas.Canvas): def save(self): """add page info to each page (page x of y)""" - num_pages = len(self._saved_page_states) for state in self._saved_page_states: self.__dict__.update(state) - self.draw_page_number(num_pages) + self.draw_page_number() canvas.Canvas.showPage(self) canvas.Canvas.save(self) - def draw_page_number(self, page_count): + def draw_page_number(self): + page_count = len(self._saved_page_states) + self.setFont("Helvetica", 8) self.drawRightString((self._pagesize[0]-30), (self._pagesize[1]-40), " %(this)i / %(total)i" % { 'this': self._pageNumber, @@ -140,9 +140,11 @@ class _rml_styles(object,): for style in node.findall('paraStyle'): sname = style.get('name') self.styles[sname] = self._para_style_update(style) - - self.styles_obj[sname] = reportlab.lib.styles.ParagraphStyle(sname, self.default_style["Normal"], **self.styles[sname]) - + if self.default_style.has_key(sname): + for key, value in self.styles[sname].items(): + setattr(self.default_style[sname], key, value) + else: + self.styles_obj[sname] = reportlab.lib.styles.ParagraphStyle(sname, self.default_style["Normal"], **self.styles[sname]) for variable in node.findall('initialize'): for name in variable.findall('name'): self.names[ name.get('id')] = name.get('value') @@ -220,7 +222,7 @@ class _rml_styles(object,): if sname in self.styles_obj: style = self.styles_obj[sname] else: - _logger.warning('Warning: style not found, %s - setting default!\n' % (node.get('style'),) ) + _logger.debug('Warning: style not found, %s - setting default!', node.get('style')) if not style: style = self.default_style['Normal'] para_update = self._para_style_update(node) @@ -249,16 +251,30 @@ class _rml_doc(object): from reportlab.pdfbase.ttfonts import TTFont for node in els: + for font in node.findall('registerFont'): name = font.get('fontName').encode('ascii') fname = font.get('fontFile').encode('ascii') if name not in pdfmetrics._fonts: pdfmetrics.registerFont(TTFont(name, fname)) + #by default, we map the fontName to each style (bold, italic, bold and italic), so that + #if there isn't any font defined for one of these style (via a font family), the system + #will fallback on the normal font. addMapping(name, 0, 0, name) #normal addMapping(name, 0, 1, name) #italic addMapping(name, 1, 0, name) #bold addMapping(name, 1, 1, name) #italic and bold + #if registerFontFamily is defined, we register the mapping of the fontName to use for each style. + for font_family in node.findall('registerFontFamily'): + family_name = font_family.get('normal').encode('ascii') + if font_family.get('italic'): + addMapping(family_name, 0, 1, font_family.get('italic').encode('ascii')) + if font_family.get('bold'): + addMapping(family_name, 1, 0, font_family.get('bold').encode('ascii')) + if font_family.get('boldItalic'): + addMapping(family_name, 1, 1, font_family.get('boldItalic').encode('ascii')) + def setTTFontMapping(self,face, fontname, filename, mode='all'): from reportlab.lib.fonts import addMapping from reportlab.pdfbase import pdfmetrics @@ -595,6 +611,18 @@ class _rml_Illustration(platypus.flowables.Flowable): drw = _rml_draw(self.localcontext ,self.node,self.styles, images=self.self2.images, path=self.self2.path, title=self.self2.title) drw.render(self.canv, None) +# Workaround for issue #15: https://bitbucket.org/rptlab/reportlab/issue/15/infinite-pages-produced-when-splitting +original_pto_split = platypus.flowables.PTOContainer.split +def split(self, availWidth, availHeight): + res = original_pto_split(self, availWidth, availHeight) + if len(res) > 2 and len(self._content) > 0: + header = self._content[0]._ptoinfo.header + trailer = self._content[0]._ptoinfo.trailer + if isinstance(res[-2], platypus.flowables.UseUpSpace) and len(header + trailer) == len(res[:-2]): + return [] + return res +platypus.flowables.PTOContainer.split = split + class _rml_flowable(object): def __init__(self, doc, localcontext, images=None, path='.', title=None, canvas=None): if images is None: @@ -973,14 +1001,17 @@ class _rml_template(object): if story_cnt > 0: fis.append(platypus.PageBreak()) fis += r.render(node_story) - # Reset Page Number with new story tag - fis.append(PageReset()) story_cnt += 1 - if self.localcontext and self.localcontext.get('internal_header',False): - self.doc_tmpl.afterFlowable(fis) - self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) - else: - self.doc_tmpl.build(fis) + try: + if self.localcontext and self.localcontext.get('internal_header',False): + self.doc_tmpl.afterFlowable(fis) + self.doc_tmpl.build(fis,canvasmaker=NumberedCanvas) + else: + self.doc_tmpl.build(fis) + except platypus.doctemplate.LayoutError, e: + e.name = 'Print Error' + e.value = 'The document you are trying to print contains a table row that does not fit on one page. Please try to split it in smaller rows or contact your administrator.' + raise def parseNode(rml, localcontext=None, fout=None, images=None, path='.', title=None): node = etree.XML(rml)