def _flowable(self, n): tags = { 'name': lambda node: self.__name(node), 'para': lambda node: platypus.Paragraph(self._textual(node), self.styles.para_style_get(node), **(utils.attr_get(node, [], {'bulletText': 'str'}))), 'xpre': lambda node: platypus.XPreformatted(self._textual(node), self.styles.para_style_get(node), **(utils.attr_get(node, [], {'bulletText': 'str', 'dedent': 'int', 'frags': 'int'}))), 'pre': lambda node: platypus.Preformatted(self._textual(node), self.styles.para_style_get(node), **(utils.attr_get(node, [], {'bulletText': 'str', 'dedent': 'int'}))), 'illustration': lambda node: self._illustration(node), 'blockTable': lambda node: self._table(node), 'title': lambda node: platypus.Paragraph(self._textual(node), reportlab.lib.styles.getSampleStyleSheet()['Title'], **(utils.attr_get(node, [], {'bulletText': 'str'}))), 'h1': lambda node: platypus.Paragraph(self._textual(node), reportlab.lib.styles.getSampleStyleSheet()['Heading1'], **(utils.attr_get(node, [], {'bulletText': 'str'}))), 'h2': lambda node: platypus.Paragraph(self._textual(node), reportlab.lib.styles.getSampleStyleSheet()['Heading2'], **(utils.attr_get(node, [], {'bulletText': 'str'}))), 'h3': lambda node: platypus.Paragraph(self._textual(node), reportlab.lib.styles.getSampleStyleSheet()['Heading3'], **(utils.attr_get(node, [], {'bulletText': 'str'}))), 'image': lambda node: platypus.Image(node.getAttribute('file'), mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ['width', 'height', 'preserveAspectRatio', 'anchor']))), 'spacer': lambda node: platypus.Spacer( width=utils.unit_get(node.getAttribute('width') if node.hasAttribute('width') else '1cm'), height=utils.unit_get(node.getAttribute('length'))), 'barCode': lambda node: code39.Extended39(self._textual(node)), 'pageBreak': lambda node: platypus.PageBreak(), # FIXME: it is not in RML std 'nextPage': lambda node: platypus.PageBreak(), 'condPageBreak': lambda node: platypus.CondPageBreak(**(utils.attr_get(node, ['height']))), 'setNextTemplate': lambda node: platypus.NextPageTemplate(str(node.getAttribute('name'))), 'nextFrame': lambda node: platypus.CondPageBreak(1000), # TODO: change the 1000 ! 'ul': lambda node: self._list(node), 'keepInFrame': lambda node: self.__keep_in_frame(node), } retvalue = tags.get(n.localName) if retvalue: return retvalue(n) else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (n.localName,))
def saveas(self, filename, header=None, footer=None): #print "BODY:\n",self.body.toxml(),"\n" self.rldoc = platypus.SimpleDocTemplate(filename) # overwrites the default UL : #self.stylesheet.UL = BulletListStyle(bulletWidth=12) self.header = header self.footer = footer for k, v in self.getElementStyle(self.body).items(): setattr(self.rldoc, k, v) story = [] for e in self.body.content: style = self.getElementStyle(e) if style.pageBreakBefore: if len(story) \ and story[-1].__class__ != platypus.PageBreak: story.append(platypus.PageBreak()) #print e.toxml() story += self.elem2flow(e, style, self.getDocumentWidth()) if style.pageBreakAfter: if len(story) \ and story[-1].__class__ != platypus.PageBreak: story.append(platypus.PageBreak()) #print story #for fl in story: # assert hasattr(fl,"wrapOn") self.rldoc.build(story, onFirstPage=self.onEveryPage, onLaterPages=self.onEveryPage)
def _create(self): """ create the table with leading page break """ story = [plat.PageBreak()] self.levelStyles = [self.tableTS] story.append(plat.Paragraph("Table of Tables", self.toc_h1)) story.append(self) return story
def create_intro(self): self.elements += [ pdf.Spacer(0, 0.25 * inch), pdf.Paragraph(self.crawler.novel_title or 'N/A', style=self.styles['Title']), pdf.Spacer(0, 0.1 * inch), pdf.Table( [[self.crawler.novel_author or 'N/A']], style=pdf.TableStyle([ ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('SIZE', (0, 0), (-1, -1), 12), ]), ), pdf.Spacer(0, 0.5 * inch), ] if self.app.book_cover: self.elements += [pdf.Image(self.app.book_cover, height=5 * inch)] else: self.elements += [pdf.Spacer(0, 5 * inch)] # end if self.elements += [ pdf.Spacer(0, 0.5 * inch), pdf.Table( [['Generated by <Lightnovel Crawler>'], ['https://github.com/dipu-bd/lightnovel-crawler']], style=pdf.TableStyle([ ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ]), ), ] self.elements += [pdf.PageBreak()]
def to_pdf(screenplay, output_filename, template_constructor=DocTemplate): story = get_title_page_story(screenplay) has_title_page = bool(story) for para in screenplay: if isinstance(para, Dialog): add_dialog(story, para) elif isinstance(para, DualDialog): add_dual_dialog(story, para) elif isinstance(para, Action): add_paragraph( story, para, centered_action_style if para.centered else action_style) elif isinstance(para, Slug): add_paragraph(story, para, slug_style) elif isinstance(para, Transition): add_paragraph(story, para, transition_style) elif isinstance(para, types.PageBreak): story.append(platypus.PageBreak()) else: # Ignore unknown types pass doc = template_constructor(output_filename, pagesize=(page_width, page_height), has_title_page=has_title_page) doc.build(story)
def story_title(survey, info=dict()): story = [ platypus.Paragraph(str(line), stylesheet['Title']) for line in survey.title.split('\n') ] story += [ platypus.FrameBreak(), ] keys = list(survey.info.keys()) if keys: keys.sort() table = [[ platypus.Paragraph(str(key), stylesheet['Normal']), platypus.Paragraph(str(survey.info[key]), stylesheet['Normal']) ] for key in keys] story += [ platypus.Table(table, colWidths=(50 * mm, None)), ] if info: story += [platypus.Spacer(0, 10 * mm)] keys = list(info.keys()) keys.sort() table = [[ platypus.Paragraph(str(key), stylesheet['Normal']), platypus.Paragraph(str(info[key]), stylesheet['Normal']) ] for key in keys] story += [ platypus.Table(table, colWidths=(50 * mm, None)), ] story += [platypus.NextPageTemplate('Normal'), platypus.PageBreak()] return story
def render(self, node_stories): if self.localcontext and not self.localcontext.get( 'internal_header', False): del self.localcontext['internal_header'] fis = [] r = _rml_flowable( self.doc, self.localcontext, images=self.images, path=self.path, title=self.title) story_cnt = 0 for node_story in node_stories: 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, canvasmaker=NumberedCanvas)
def _flowable(self, node): if node.localName == 'para': style = self.styles.para_style_get(node) return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'name': self.styles.names[ node.getAttribute('id')] = node.getAttribute('value') return None elif node.localName == '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.localName == '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.localName == 'illustration': return self._illustration(node) elif node.localName == 'blockTable': return self._table(node) elif node.localName == 'title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h1': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading1'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h2': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading2'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'h3': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading3'] return platypus.Paragraph(self._textual(node), style, **(utils.attr_get(node, [], {'bulletText': 'str'}))) elif node.localName == 'image': return platypus.Image(node.getAttribute('file'), mask=(250, 255, 250, 255, 250, 255), **(utils.attr_get(node, ['width', 'height', 'preserveAspectRatio', 'anchor']))) elif node.localName == 'spacer': if node.hasAttribute('width'): width = utils.unit_get(node.getAttribute('width')) else: width = utils.unit_get('1cm') length = utils.unit_get(node.getAttribute('length')) return platypus.Spacer(width=width, height=length) elif node.localName == 'barCode': return code39.Extended39(self._textual(node)) elif node.localName == 'pageBreak': return platypus.PageBreak() elif node.localName == 'condPageBreak': return platypus.CondPageBreak(**(utils.attr_get(node, ['height']))) elif node.localName == 'setNextTemplate': return platypus.NextPageTemplate(str(node.getAttribute('name'))) elif node.localName == 'nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif node.localName == 'ul': return self._list(node) else: sys.stderr.write( 'Warning: flowable not yet implemented: %s !\n' % (node.localName,)) return None
def _create(self): """ create the table with page break at the end """ story = [ plat.Paragraph("Table of Content", ParagraphStyle(name='Heading1', fontSize=0)), self, plat.PageBreak() ] return story
def _make_page_break(self, story, orientation): # Set up the next page template story.append(p.NextPageTemplate(orientation)) # Add the page break story.append(p.PageBreak()) # Return this return story
def add_page_break(self, break_to=None): """ Add a new PageBreak to the story. :param break_to: next page number after break: 'odd' (front side of paper or left side in book) or 'even' (back side of paper or right side in book) :type break_to: str :return: - """ if not break_to: self._story.append(plat.PageBreak()) else: self._story.append(flow.RepPageBreak(break_to=break_to))
def render(self, node_stories): fis = [] r = _rml_flowable(self.doc, self.localcontext, images=self.images, path=self.path, title=self.title) story_cnt = 0 for node_story in node_stories: if story_cnt > 0: fis.append(platypus.PageBreak()) fis += r.render(node_story) story_cnt += 1 if self.localcontext: fis.append(PageCount()) self.doc_tmpl.build(fis)
def frameAction(self, frame): ''' overwritten method to set new template during build :param frame: element holding several flowables that should be printed :type frame: instance of platypus.frames.Frame ''' # platypus uses access to protected members: # pylint: disable=W0212 frame._generated_content = [] if self.break_to == 'any': # Break only once. None if at top of page if not frame._atTop: frame._generated_content.append( SetNextTemplate(self.template_name)) frame._generated_content.append(plat.PageBreak()) elif self.break_to == 'odd': # Break once if on even page, twice # on odd page, none if on top of odd page if self.canv._pageNumber % 2: # odd pageNumber if not frame._atTop: # Blank pages get no heading or footer frame._generated_content.append( SetNextTemplate(self.template_name)) frame._generated_content.append( SetNextTemplate('emptyPage')) frame._generated_content.append(plat.PageBreak()) frame._generated_content.append(ResetNextTemplate()) frame._generated_content.append(plat.PageBreak()) else: # even frame._generated_content.append( SetNextTemplate(self.template_name)) frame._generated_content.append(plat.PageBreak()) elif self.break_to == 'even': # Break once if on odd page, twice # on even page, none if on top of even page if self.canv._pageNumber % 2: # odd pageNumber frame._generated_content.append( SetNextTemplate(self.template_name)) frame._generated_content.append(plat.PageBreak()) else: # even if not frame._atTop: # Blank pages get no heading or footer frame._generated_content.append( SetNextTemplate(self.template_name)) frame._generated_content.append( SetNextTemplate('emptyPage')) frame._generated_content.append(plat.PageBreak()) frame._generated_content.append(ResetNextTemplate()) frame._generated_content.append(plat.PageBreak())
def pdf_maker(trialnumber, ptname, footer): ''' Makes a PDF with a top text, image, and bottom text. Inputs:- trialnumber: number of trials to plot (indexing from zero) ptname: patient name (string) to put in top text footer: text string for bottom text ''' from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet import reportlab.platypus as platypus from reportlab.lib.units import cm fileprefix = 'emg-plot-' filesuffix = '.png' toptext = '<font size=14><b>EMG for %s</b></font>' % ptname pdf_path = tkFileDialog.asksaveasfilename(initialdir='C:', initialfile='EMG report %s.pdf' %ptname) doc = platypus.SimpleDocTemplate(pdf_path, topMargin = cm, bottomMargin = cm, rightMargin = cm, leftMargin = cm) story = [] # Make new, indented text style. style = getSampleStyleSheet()['Normal'] indented = ParagraphStyle( 'indented', parent=style, leftIndent=2*cm ) for n in range(trialnumber+1): story.append(platypus.Paragraph(toptext, indented)) story.append(platypus.Spacer(1,0.1*cm)) graph = platypus.Image(str(fileprefix+str(n)+filesuffix)) graph._restrictSize(19*cm, 24*cm) story.append(graph) #story.append(platypus.Spacer(1,0.5*cm)) footer = footer.replace('\n','<br />\n') #Reportlab's Paragraph ignores newlines story.append(platypus.Paragraph(footer, indented)) story.append(platypus.PageBreak()) print('docbuild ran in %s' %pdf_path) doc.build(story)
def create_toc(self): self.toc = TableOfContents() self.toc.levelStyles = [ ParagraphStyle(fontName='Times-Bold', fontSize=14, name='Heading1', leftIndent=20, firstLineIndent=-20, spaceBefore=5, leading=16), ParagraphStyle(fontSize=12, name='Heading2', leftIndent=40, firstLineIndent=-20, spaceBefore=0, leading=12), ] self.elements += [ self.toc, pdf.PageBreak(), ]
def create_chapter(self, content): for tag in content.children: if not tag.name: self.elements += [ pdf.Spacer(0, 0.15 * inch), pdf.Paragraph(str(tag), self.styles['Normal']), ] elif re.match(r'h\d', tag.name): self.elements += [ pdf.Paragraph(tag.text, self.styles[tag.name]), ] elif tag.name == 'p': self.elements += [ pdf.Spacer(0, 0.15 * inch), pdf.Paragraph(tag.text, self.styles['Normal']), ] # elif re.match(r'b|strong|label', tag.name): # run = paragraph.add_run(tag.text) # run.bold = True # elif re.match(r'i|em|cite', tag.name): # run = paragraph.add_run(tag.text) # run.italic = True # elif re.match(r'u', tag.name): # run = paragraph.add_run(tag.text) # run.underline = True # elif re.match(r'sub', tag.name): # run = paragraph.add_run(tag.text) # run.font.subscript = True # elif re.match(r'sup', tag.name): # run = paragraph.add_run(tag.text) # run.font.superscript = True # elif re.match(r'pre|code|kdb', tag.name): # run = paragraph.add_run(tag.text) # run.font.outline = True # else: # paragraph.add_run(tag.text) # end if # end for self.elements += [pdf.PageBreak()]
def _create(self, story): """ creates the pdf story, called during `report.Build` :param story: pdf story to add paragraphs to :type story: list of `pdf.Story` elements """ # add logo story.append( plat.Image(io.BytesIO(logo.CONTI_CORP_LOGO), width=logo.CONTI_LOGO_SIZE[0] * 0.5, height=logo.CONTI_LOGO_SIZE[1] * 0.5)) story.append(plat.Spacer(1, 2 * cm)) # add title story.append(plat.Paragraph(self.title, self.TITLE_STYLE)) story.append(plat.Spacer(1, 1 * cm)) # add title story.append(plat.Paragraph("for", self.TITLE_STYLE)) story.append(plat.Spacer(1, 1 * cm)) # add checkpoint story.append(plat.Paragraph(self.checkpoint, self.TITLE_STYLE)) story.append(plat.Paragraph(self.add_info, self.TITLE_STYLE)) story.append(plat.Spacer(1, 3 * cm)) # confidence statement story.append( plat.Paragraph( '<para alignment="center">%s</para>' % self.confidential_level, self.TITLE_STYLE)) story.append(plat.Spacer(1, 3 * cm)) # Add Date story.append(plat.Spacer(1, 7 * cm)) story.append(plat.Paragraph(self.date, self.CENTER_STYLE)) story.append(plat.PageBreak())
def to_pdf(screenplay, output_filename, template_constructor=DocTemplate, is_strong=False, has_scene_num=False, first_page_number=False, first_line_indent=False): global scene_number scene_number = 1 story = get_title_page_story(screenplay) has_title_page = bool(story) for para in screenplay: if isinstance(para, Dialog): add_dialog(story, para) elif isinstance(para, DualDialog): add_dual_dialog(story, para) elif isinstance(para, Action): add_paragraph( story, para, centered_action_style if para.centered else (action_style_first_line_indent if first_line_indent else action_style)) elif isinstance(para, Slug): add_slug(story, para, slug_style, is_strong, has_scene_num) elif isinstance(para, Transition): add_paragraph(story, para, transition_style) elif isinstance(para, types.PageBreak): story.append(platypus.PageBreak()) else: # Ignore unknown types pass doc = template_constructor(output_filename, pagesize=(page_width, page_height), has_title_page=has_title_page, first_page_number=first_page_number) doc.build(story) slug_style.leftIndent = -40.8
def render(self, node_stories): if self.localcontext and not self.localcontext.get('internal_header',False): del self.localcontext['internal_header'] fis = [] r = _rml_flowable(self.doc,self.localcontext, images=self.images, path=self.path, title=self.title, canvas=None) story_cnt = 0 for node_story in node_stories: if story_cnt > 0: fis.append(platypus.PageBreak()) fis += r.render(node_story) # end of story numbering computation fis.append(PageReset()) story_cnt += 1 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 getPageBreak(self): return platypus.PageBreak()
def new_page(self): self.story.append(platypus.PageBreak())
def get_title_page_story(screenplay): """Get Platypus flowables for the title page """ # From Fountain spec: # The recommendation is that Title, Credit, Author (or Authors, either # is a valid key syntax), and Source will be centered on the page in # formatted output. Contact and Draft date would be placed at the lower # left. def add_lines(story, attribute, style, space_before=0): lines = screenplay.get_rich_attribute(attribute) if not lines: return 0 if space_before: story.append(Spacer(frame_width, space_before)) total_height = 0 for line in lines: html = to_html(line) para = Paragraph(html, style) width, height = para.wrap(frame_width, frame_height) story.append(para) total_height += height return space_before + total_height title_story = [] title_height = sum(( add_lines(title_story, 'Title', title_style), add_lines(title_story, 'Credit', centered_style, space_before=line_height), add_lines(title_story, 'Author', centered_style), add_lines(title_story, 'Authors', centered_style), add_lines(title_story, 'Source', centered_style), )) lower_story = [] lower_height = sum(( add_lines(lower_story, 'Draft date', draft_style), add_lines(lower_story, 'Contact', contact_style, space_before=line_height), add_lines(lower_story, 'Copyright', centered_style, space_before=line_height), )) if not title_story and not lower_story: return [] story = [] top_space = min(frame_height / 3.0, frame_height - lower_height - title_height) if top_space > 0: story.append(Spacer(frame_width, top_space)) story += title_story # The minus 6 adds some room for rounding errors and whatnot middle_space = frame_height - top_space - title_height - lower_height - 6 if middle_space > 0: story.append(Spacer(frame_width, middle_space)) story += lower_story story.append(platypus.PageBreak()) return story
return platypus.Image(name, mask=(250, 255, 250, 255, 250, 255), **args) 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':
def __createPdfFromImages(self, src_images_path): doc = platypus.SimpleDocTemplate(self.__pdfPath) doc.leftMargin = 0 doc.bottomMargin = 0 doc.rightMargin = 0 doc.topMargin = 0 pageWidth = PAGE_WIDTH_MM * self.__scale story = [] hasStory = False i = 1 for image_file in src_images_path: try: pilImg = Image.open(image_file) print('Adding ' + basename(image_file) + ' to pdf document...') except Exception: print('Cannot access a file: ' + image_file) continue imageWidth = pilImg.size[0] print('imageWidth:', imageWidth) imageHeight = pilImg.size[1] print('imageHeight:', imageHeight) # desc = 'Paragraph number desc_file = join(dirname(image_file), DESC_FILE_NAME) print('desc_file:', desc_file) desc = None if exists(desc_file): desc = read_desc(desc_file) print('desc:', desc) if desc is not None and not DESC_DONE.get(desc_file, False): para = Paragraph(desc, style_heading1) story.append(para) DESC_DONE[desc_file] = True #put different spaces before first and second images on every page if not i % 2: story.append( platypus.Spacer(1, self.__space_before_image1 * inch)) else: story.append( platypus.Spacer(1, self.__space_before_image2 * inch)) repImg = platypus.Image(image_file, pageWidth, pageWidth * (imageHeight / imageWidth)) story.append(repImg) #put some space after every image if not i % 2: story.append( platypus.Spacer(1, self.__space_after_image1 * inch)) else: story.append( platypus.Spacer(1, self.__space_after_image2 * inch)) #break page after every 2 images if not i % 2: story.append(platypus.PageBreak()) i += 1 print('OK') hasStory = True doc.build(story) if hasStory: print("Pdf file was created successfully") else: print("Pdf file was not created") if exists(self.__pdfPath): remove(self.__pdfPath) return hasStory
def render_page_break(pg_break: DG.PageBreak) -> Flowable: """Convert a PageBreak in to a Platypus version""" return platypus.PageBreak()
def _make_page_break(story, orientation): story.append(p.NextPageTemplate(orientation)) story.append(p.PageBreak()) return story
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 _flowable(self, node): if node.localName=='para': style = self.styles.para_style_get(node) return platypus.Paragraph( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str'}))) elif node.localName=='name': self.styles.names[ node.getAttribute('id')] = node.getAttribute('value') return None elif node.localName=='xpre': style = self.styles.para_style_get(node) return platypus.XPreformatted( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str','dedent':'int','frags':'int'}))) elif node.localName=='pre': style = self.styles.para_style_get(node) return platypus.Preformatted( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str','dedent':'int'}))) elif node.localName=='illustration': return self._illustration(node) elif node.localName=='blockTable': return self._table(node) elif node.localName=='title': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Title'] return platypus.Paragraph( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str'}))) elif node.localName=='h1': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading1'] return platypus.Paragraph( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str'}))) elif node.localName=='h2': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading2'] return platypus.Paragraph( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str'}))) elif node.localName=='h3': styles = reportlab.lib.styles.getSampleStyleSheet() style = styles['Heading3'] return platypus.Paragraph( self._textual(node), style, **(utils.getAttrsAsDict(node, [], {'bulletText':'str'}))) elif node.localName=='image': return platypus.Image( node.getAttribute('file'), mask=(250, 255, 250, 255, 250, 255), **(utils.getAttrsAsDict(node, ['width','height']))) elif node.localName=='spacer': if node.hasAttribute('width'): width = utils.as_pt(node.getAttribute('width')) else: width = utils.as_pt('1cm') length = utils.as_pt(node.getAttribute('length')) return platypus.Spacer(width=width, height=length) elif node.localName=='pageBreak': return platypus.PageBreak() elif node.localName=='condPageBreak': return platypus.CondPageBreak(**(utils.getAttrsAsDict(node, ['height']))) elif node.localName=='setNextTemplate': return platypus.NextPageTemplate(str(node.getAttribute('name'))) elif node.localName=='nextFrame': return platypus.CondPageBreak(1000) # TODO: change the 1000 ! elif barcode_codes and node.localName=='barCode': code = barcode_codes.get(node.getAttribute('code'), Code128) attr_types = {'barWidth': 'pt', 'barHeight': 'pt', 'fontName': 'text', 'fontSize': 'pt', 'humanReadable': 'bool'} return code( self._textual(node), **utils.getAttrsAsDict(node, ['barWidth', 'barHeight'], attr_types)) else: sys.stderr.write('Warning: flowable not yet implemented: %s !\n' % (node.localName,)) return None