Ejemplo n.º 1
0
 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,))
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
    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()]
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
 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
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
    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
Ejemplo n.º 11
0
    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))
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
    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())
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
 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(),
     ]
Ejemplo n.º 16
0
 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()]
Ejemplo n.º 17
0
    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())
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
 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
Ejemplo n.º 20
0
 def getPageBreak(self):
     return platypus.PageBreak()
Ejemplo n.º 21
0
 def new_page(self):
     self.story.append(platypus.PageBreak())
Ejemplo n.º 22
0
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
Ejemplo n.º 23
0
     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':
Ejemplo n.º 24
0
    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
Ejemplo n.º 25
0
 def render_page_break(pg_break: DG.PageBreak) -> Flowable:
     """Convert a PageBreak in to a Platypus version"""
     return platypus.PageBreak()
Ejemplo n.º 26
0
 def _make_page_break(story, orientation):
     story.append(p.NextPageTemplate(orientation))
     story.append(p.PageBreak())
     return story
Ejemplo n.º 27
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
Ejemplo n.º 28
0
 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