示例#1
0
def export(listino, luogoDiRiferimento):
    response = http.HttpResponse(content_type='application/pdf')
    width, height = portrait(A4)

    pageTemplates = [
        PageTemplate(id='Listino', onPage=onPageListino),
    ]

    doc = BaseDocTemplate(
        response,
        pagesize=(width, height),
        leftMargin=1 * cm,
        rightMargin=1 * cm,
        bottomMargin=1.5 * cm,
        topMargin=1 * cm,
        showBoundary=test,
        pageTemplates=pageTemplates,
    )

    doc.listino = listino  # arricchisco il doc

    righe_prezzo = listino.prezzolistino_set.all()

    story = []

    listinoEsclusivo = getTabellaListino(doc, righe_prezzo, 'T', luogoDiRiferimento)
    if listinoEsclusivo:
        title = Paragraph("SERVIZIO TAXI ESCLUSIVO", normalStyle)
        story.append(title)
        story.append(listinoEsclusivo)

    listinoCollettivo = getTabellaListino(doc, righe_prezzo, 'C', luogoDiRiferimento)
    if listinoEsclusivo and listinoCollettivo:
        story.append(Spacer(1, 1.5 * cm))
    if listinoCollettivo:
        title = Paragraph("SEVIZIO COLLETIVO MINIBUS", normalStyle)
        story.append(KeepTogether([title, listinoCollettivo]))

    if not listinoCollettivo and not listinoEsclusivo:
        story.append(
            Paragraph("Non abbiamo nessuna corsa specificata nel listino.", normal_style)
        )

    # footer
    footer_style = ParagraphStyle(name='Justify', alignment=TA_JUSTIFY, fontSize=8)
    # footer_height = 0
    if LISTINO_FOOTER:
        note_finali_lines = [LISTINO_FOOTER]
        story.append(Spacer(1, 1 * cm))
        note_finali = Paragraph("<br/>".join(note_finali_lines),
                                footer_style)
        # note_finali.wrap(width - doc.rightMargin - doc.leftMargin, 5 * cm)
        # note_finali.drawOn(canvas, doc.leftMargin, doc.bottomMargin)
        # footer_height = note_finali.height
        story.append(note_finali)

    doc.build(story, canvasmaker=NumberedCanvas)
    return response
    def __init__(self,
                 dictValeurs={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_VALEURS, DICT_OPTIONS
        DICT_VALEURS = dictValeurs
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("LOCATIONS", "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        # ----------- Insertion du contenu des frames --------------
        listeLabels = []
        for IDlocation, dictValeur in dictValeurs.iteritems():
            listeLabels.append((dictValeur["{FAMILLE_NOM}"], IDlocation))
        listeLabels.sort()

        for labelDoc, IDlocation in listeLabels:
            dictValeur = dictValeurs[IDlocation]
            if dictValeur["select"] == True:

                story.append(DocAssign("IDlocation", IDlocation))
                nomSansCivilite = dictValeur["{FAMILLE_NOM}"]
                story.append(Bookmark(nomSansCivilite, str(IDlocation)))

                # Saut de page
                story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
def _showDoc(fn,story):
    pageTemplate = PageTemplate('normal', [Frame(72, 440, 170, 284, id='F1'),
                            Frame(326, 440, 170, 284, id='F2'),
                            Frame(72, 72, 170, 284, id='F3'),
                            Frame(326, 72, 170, 284, id='F4'),
                            ], myMainPageFrame)
    doc = BaseDocTemplate(outputfile(fn),
            pageTemplates = pageTemplate,
            showBoundary = 1,
            )
    doc.multiBuild(story)
示例#4
0
def renderElements(elements, filesuffix=None, tmpdir=None):
    """ takes a list of reportlab flowables and renders them to a test.pdf file"""
    margin = 2 * cm
    if filesuffix:
        fn = 'test_' + filesuffix + '.pdf'
    else:
        fn = 'test.pdf'
    fn = os.path.join(tmpdir, fn)
    doc = BaseDocTemplate(fn, topMargin=margin, leftMargin=margin, rightMargin=margin, bottomMargin=margin)
    pt = WikiPage("Title")
    doc.addPageTemplates(pt)
    elements.insert(0, NextPageTemplate('Title'))   
    doc.build(elements)
示例#5
0
    def _new_base_doc_template(self, path):
        pagesize = letter
        opt = self.options
        if opt.orientation == 'landscape':
            pagesize = landscape(letter)

        doc = BaseDocTemplate(
            path,
            leftMargin=opt.left_margin * inch,
            rightMargin=opt.right_margin * inch,
            topMargin=opt.top_margin * inch,
            bottomMargin=opt.bottom_margin * inch,
            pagesize=pagesize
            #                                   _pageBreakQuick=0,
            #                                   showBoundary=1
        )
        return doc
示例#6
0
 def test5(self):
     '''extreme test inspired by Moritz Pfeiffer https://bitbucket.org/moritzpfeiffer/'''
     with self.assertRaises(LayoutError):
         text = """
         Clearly, the natural general principle that will subsume this case is
         not subject to a parasitic gap construction.  Presumably, most of the
         methodological work in modern linguistics can be defined in such a way
         as to impose the system of base rules exclusive of the lexicon.  In the
         discussion of resumptive pronouns following (81), the fundamental error
         of regarding functional notions as categorial is to be regarded as a
         descriptive <span color="red">fact</span>.<br/>So far, the earlier discussion of deviance is not
         quite equivalent to a parasitic gap construction.  To characterize a
         linguistic level L, a case of semigrammaticalness of a different sort
         may remedy and, at the same time, eliminate irrelevant intervening
         contexts in selectional <span color="red">rules</span>.<br/>
         Summarizing, then, we assume that the descriptive power of the base
         component can be defined in such a way as to impose nondistinctness in
         the sense of distinctive feature theory.
         """
         styleSheet = getSampleStyleSheet()
         story = []
         story.append(Paragraph(text, styleSheet['Normal']))
         doc = BaseDocTemplate(
             outputfile('test_platypus_much_too_large.pdf'),
             pagesize=portrait(A4),
             pageTemplates=[
                 PageTemplate(
                     'page_template',
                     [
                         Frame(0,
                               0,
                               0,
                               0,
                               leftPadding=0,
                               rightPadding=0,
                               topPadding=0,
                               bottomPadding=0,
                               id='DUMMY_FRAME')
                     ],
                 )
             ],
         )
         doc.build(story)
示例#7
0
 def __init__(self, name, study_name):
     self.doc = BaseDocTemplate(name,
                                title=name,
                                showBoundary=0,
                                pagesize=letter)
     template = PageTemplate('normal',
                             [Frame(inch, inch, 6.5 * inch, 8.4 * inch)],
                             onPageEnd=self.pageHeader)
     self.doc.addPageTemplates(template)
     #self.doc.setProgressCallBack(self.progressCB)
     self.styles = stylesheet()
     self.jobsize = 1
     self.headerId = 0
     self.headerVisitLabel = ''
     self.headerPlateLabel = ''
     self.studyName = study_name
     self.outlines = []
     self.outlineDesc = None
     self.outlineVisitLabel = None
     self.outlineID = 0
     self.content = [DFOutlines(self.outlines)]
示例#8
0
    def _new_base_doc_template(self, path):
        pagesize = letter
        opt = self.options
        if opt.orientation == 'landscape':
            pagesize = landscape(letter)
            leftMargin = opt.bottom_margin * inch
            rightMargin = opt.top_margin * inch
            topMargin = opt.left_margin * inch
            bottomMargin = opt.right_margin * inch
        else:
            leftMargin = opt.left_margin * inch
            rightMargin = opt.right_margin * inch
            topMargin = opt.top_margin * inch
            bottomMargin = opt.bottom_margin * inch

        doc = BaseDocTemplate(path,
                              leftMargin=leftMargin,
                              rightMargin=rightMargin,
                              topMargin=topMargin,
                              bottomMargin=bottomMargin,
                              pagesize=pagesize)
        return doc
示例#9
0
文件: pdf.py 项目: firesalp/aemanager
    def init_doc(self, title):

        def proposal_footer(canvas, doc):
            canvas.saveState()
            canvas.setFont('Helvetica', 10)
            PAGE_WIDTH = defaultPageSize[0]
            footer_text = "%s %s - %s, %s %s" % (self.user.first_name,
                                                 self.user.last_name,
                                                 self.user.get_profile().address.street.replace("\n", ", ").replace("\r", ""),
                                                 self.user.get_profile().address.zipcode,
                                                 self.user.get_profile().address.city)
            if self.user.get_profile().address.country:
                footer_text = footer_text + u", %s" % (self.user.get_profile().address.country)

            canvas.drawCentredString(PAGE_WIDTH / 2.0, 0.5 * inch, footer_text)
            extra_info = u"SIRET : %s" % (self.user.get_profile().company_id)
            if self.user.get_profile().vat_number:
                extra_info = u"%s - N° TVA : %s" % (extra_info, self.user.get_profile().vat_number)
            canvas.drawCentredString(PAGE_WIDTH / 2.0, 0.35 * inch, extra_info)
            canvas.restoreState()

        self.doc = BaseDocTemplate(self.response, title=title, leftMargin=0.5 * inch, rightMargin=0.5 * inch)
        frameT = Frame(self.doc.leftMargin, self.doc.bottomMargin, self.doc.width, self.doc.height + 0.5 * inch, id='normal')
        self.doc.addPageTemplates([PageTemplate(id='all', frames=frameT, onPage=proposal_footer), ])
示例#10
0
document = BaseDocTemplate(
    # pagesize=(400,400), # this is override for a pagesize of the PageTemplate
    pageTemplate=
    [],  # add list of page template for here or use 'addPageTemplates()'
    showBoundary=1,
    filename=BytesIO(),
    leftmargin=4,
    leftMargin=4,
    rightMargin=4,
    topMargin=4,
    bottomMargin=4,
    allowSplitting=1,
    title='Document',
    author='JGCH',
    subject='Training',
    creator='JGCH',
    producer='JGCH',
    keywords=['Training, GitHub'],
    invariant=None,
    pageCompression=None,
    _pageBreakQuick=1,
    rotation=0,
    _debug=0,
    encrypt=None,
    cropMarks=None,
    enforceColorSpace=None,
    displayDocTitle=None,
    lang=None,
    initialFontName=None,
    initialFontSize=None,
    initialLeading=None,
    cropBox=None,
    artBox=None,
    trimBox=None,
    bleedBox=None,
    # keepTogetherClass= KeepTogether
)
    def __init__(self,
                 dictValeurs={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_VALEURS, DICT_OPTIONS
        DICT_VALEURS = dictValeurs
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("INSCRIPTIONS", "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        # ----------- Insertion du contenu des frames --------------
        listeLabels = []
        for IDinscription, dictValeur in dictValeurs.items():
            listeLabels.append((dictValeur["{FAMILLE_NOM}"], IDinscription))
        listeLabels.sort()

        for labelDoc, IDinscription in listeLabels:
            dictValeur = dictValeurs[IDinscription]
            if dictValeur["select"] == True:
                story.append(DocAssign("IDinscription", IDinscription))
                nomSansCivilite = dictValeur["{FAMILLE_NOM}"]
                story.append(Bookmark(nomSansCivilite, str(IDinscription)))

                # ----------- Insertion du cadre principal --------------
                cadre_principal = doc.modeleDoc.FindObjet("cadre_principal")
                if cadre_principal != None:

                    if "intro" in DICT_OPTIONS and DICT_OPTIONS[
                            "intro"] != None or "tableau" in DICT_OPTIONS and DICT_VALEURS[
                                "tableau"] == True:
                        # ------------------- TITRE -----------------
                        dataTableau = []
                        largeursColonnes = [
                            TAILLE_CADRE_CONTENU[2],
                        ]
                        dataTableau.append(
                            (_(u"Confirmation d'inscription"), ))
                        dataTableau.append((u"", ))
                        style = TableStyle([
                            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
                            ('FONT', (0, 1), (0, 1), "Helvetica", 8),
                            ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
                            ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
                        ])
                        tableau = Table(dataTableau, largeursColonnes)
                        tableau.setStyle(style)
                        story.append(tableau)
                        story.append(Spacer(0, 10))

                        # TEXTE D'INTRODUCTION
                        paraStyleIntro = ParagraphStyle(
                            name="intro",
                            fontName="Helvetica",
                            fontSize=11,
                            leading=14,
                            spaceBefore=0,
                            spaceafter=0,
                            leftIndent=0,
                            rightIndent=0,
                            alignment=0,
                        )

                    if "intro" in DICT_OPTIONS and DICT_OPTIONS[
                            "intro"] != None:
                        texteIntro = DICT_VALEURS["intro"]
                        story.append(
                            Paragraph(u"<i>%s</i>" % texteIntro,
                                      paraStyleIntro))
                        story.append(Spacer(0, 20))

                    if "tableau" in DICT_OPTIONS and DICT_OPTIONS[
                            "tableau"] == True:
                        # ------------------- TABLEAU CONTENU -----------------
                        dataTableau = []
                        largeursColonnes = [80, 280]
                        paraStyle = ParagraphStyle(
                            name="detail",
                            fontName="Helvetica-Bold",
                            fontSize=9,
                        )
                        dataTableau.append(
                            (_(u"Nom"),
                             Paragraph(DICT_VALEURS["{INDIVIDU_NOM}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Prénom"),
                             Paragraph(DICT_VALEURS["{INDIVIDU_PRENOM}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Activité"),
                             Paragraph(DICT_VALEURS["{ACTIVITE_NOM_LONG}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Groupe"),
                             Paragraph(DICT_VALEURS["{GROUPE_NOM_LONG}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Catégorie"),
                             Paragraph(DICT_VALEURS["{NOM_CATEGORIE_TARIF}"],
                                       paraStyle)))

                        style = TableStyle([
                            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                            ('FONT', (0, 0), (0, -1), "Helvetica", 9),
                            ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                            ('ALIGN', (0, 0), (0, -1), 'RIGHT'),
                        ])
                        tableau = Table(dataTableau, largeursColonnes)
                        tableau.setStyle(style)
                        story.append(tableau)

                # Saut de page
                story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
示例#12
0
def make_invoice(fp, purchase, org, pgnum, tickets, **kw):
    """
    make pdf invoice. Should be called with the same parameters
    as the render_template with the html template.
    """
    doc = BaseDocTemplate(fp, pagesize=A4)
    styles = getSampleStyleSheet()

    args = dict(date=purchase.date[0],
                rcptaddr=[purchase.buyerName[0]],
                senderaddr=[org.name[0]],
                orgnum=org.orgnum[0],
                fskatt=org.fskatt[0],
                kind=purchase.kind[0],
                ocr=purchase.ocr[0],
                conditions='30 dagar netto',
                latefee=u'Efter förfallodatum debiteras '
                u'dröjsmålsränta enligt räntelagen.',
                total=purchase.total[0],
                pgnum=pgnum,
                styles=styles)

    qrcode = {
        'uqr': 1,
        'tp': 1,
        'nme': org.name[0],
        'cid': org.orgnum[0],
        'idt': time.strftime('%Y%m%d', time.localtime(purchase.date[0])),
        'iref': purchase.ocr[0],
        'due': str(purchase.total[0]),
        'pt': 'PG',
        'acc': pgnum[:-1] + '-' + pgnum[-1:]
    }

    if purchase.buyerAddress:
        args['rcptaddr'] += purchase.buyerAddress[0].split('\n')
    if org.address:
        args['senderaddr'] += org.address[0].split('\n')
    if org.phone:
        args['phone'] = org.phone[0]
    if org.email:
        args['email'] = org.email[0]
    if org.url:
        args['url'] = org.url[0]
    if org.seat:
        args['seat'] = org.seat[0]
    if org.vatnum:
        args['vatnum'] = org.vatnum[0]
    if purchase.buyerReference:
        args['buyerref'] = purchase.buyerReference[0]
    if purchase.buyerAnnotation:
        args['annotation'] = purchase.buyerAnnotation[0].split('\n')
    for (code, pct, value) in purchase.vat:
        qrcode[{'10': 'vh', '11': 'vm', '12': 'vl'}[code]] = str(value)
    try:
        args['expiryDate'] = purchase.expiryDate[0]
        qrcode['ddt'] = time.strftime('%Y%m%d',
                                      time.localtime(purchase.expiryDate[0]))
    except (AttributeError, IndexError):
        qrcode['ddt'] = time.strftime('%Y%m%d')

    args['qrcode'] = json.dumps(qrcode)

    tmpl = InvoiceTemplate(name='invoice', **args)
    tmpl2 = Invoice2Template(name='invoice2', **args)

    doc.addPageTemplates([tmpl, tmpl2])

    elements = [NextPageTemplate('invoice'), NextPageTemplate('invoice2')]

    indentedsmallstyle = ParagraphStyle('Small',
                                        fontName='Helvetica',
                                        fontSize=8,
                                        leading=9,
                                        leftIndent=5 * mm)
    boldstyle = ParagraphStyle('Bold',
                               fontName='Helvetica-Bold',
                               fontSize=10,
                               leading=12)
    boldrightstyle = ParagraphStyle('Bold',
                                    fontName='Helvetica-Bold',
                                    fontSize=10,
                                    leading=12,
                                    alignment=TA_RIGHT)
    mycellstyle = CellStyle('mycellstyle')
    mycellstyle.topPadding = mycellstyle.bottomPadding = 0
    tabledata = [
        Table(
            [[
                Paragraph(_('Item'), boldstyle),
                Paragraph(_('Price'), boldrightstyle),
                Paragraph(_('Quantity'), boldrightstyle),
                Paragraph(_('Total'), boldrightstyle)
            ]],
            colWidths=[115 * mm, 20 * mm, 20 * mm, 25 * mm],
            style=TableStyle([
                ('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
                ('TOPPADDING', (0, 0), (-1, -1), 0),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                #('BOX', (0,0), (-1, -1), 0.25, colors.black),
            ]))
    ]
    for item in purchase.items:
        celldata = [
            Table(
                [[
                    item.name[0],
                    formatters.money(item.price[0], True), item.quantity[0],
                    formatters.money(item.total[0], True)
                ]],
                colWidths=[115 * mm, 20 * mm, 20 * mm, 25 * mm],
                style=TableStyle([
                    ('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
                    ('TOPPADDING', (0, 0), (-1, -1), 0),
                    ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                    #('BOX', (0,0), (-1, -1), 0.25, colors.black),
                    #('ALIGN', (0,0), (-1, 0), 'LEFT')
                ]),
            )
        ]
        if item.options:
            for opt, val in item.optionsWithValue:
                celldata.append(
                    Paragraph('%s: <i>%s</i>' % (opt, val),
                              indentedsmallstyle))
        tabledata.append(celldata)

    # Sum and VAT
    tabledata.append([
        Table(
            [[
                '',
                Paragraph(_('Total'), boldrightstyle),
                Paragraph(formatters.money(purchase.total[0], True),
                          boldrightstyle)
            ]],
            colWidths=[115 * mm, 40 * mm, 25 * mm],
            style=TableStyle([
                ('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
                ('TOPPADDING', (0, 0), (-1, -1), 0),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                #('BOX', (0,0), (-1, -1), 0.25, colors.black),
                #('ALIGN', (0,0), (-1, 0), 'LEFT')
            ]),
        )
    ])

    #vats = [(25, decimal.Decimal('11.37')), (12, decimal.Decimal('6.78'))]

    for code, percentage, amount in purchase.vat:
        tabledata.append([
            Table(
                [[
                    '',
                    Paragraph(
                        _('Including %s%% VAT') %
                        py3txt(formatters.vatpercentage(percentage)),
                        boldrightstyle),
                    Paragraph(formatters.money(amount, True), boldrightstyle)
                ]],
                colWidths=[115 * mm, 40 * mm, 25 * mm],
                style=TableStyle([
                    ('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
                    ('TOPPADDING', (0, 0), (-1, -1), 0),
                    ('BOTTOMPADDING', (0, 0), (-1, -1), 0),
                    #('BOX', (0,0), (-1, -1), 0.25, colors.black),
                    #('ALIGN', (0,0), (-1, 0), 'LEFT')
                ]),
            )
        ])

    t = Table(
        [[t] for t in tabledata],
        colWidths=[180 * mm],
        repeatRows=1,
        style=TableStyle([
            ('LEFTPADDING', (0, 0), (0, -1), 0),
            ('RIGHTPADDING', (0, -1), (-1, -1), 0),
            #('BOX', (0,0), (-1, -1), 0.25, colors.black)
        ]))

    elements.append(t)

    extraText = purchase.extraText
    if extraText:
        textElements = []
        text_style = ParagraphStyle('Text',
                                    fontName='Helvetica',
                                    fontSize=8,
                                    leading=9)
        for text in extraText:
            textElements.append(Paragraph(text, text_style))
        elements.append(KeepTogether(textElements))

    doc.multiBuild(elements)
    def __init__(self,
                 dictValeurs={},
                 IDmodele=None,
                 nomDoc=FonctionsPerso.GenerationNomDoc(
                     "RECU_REGLEMENT", "pdf"),
                 afficherDoc=True):
        """ Impression """
        global DICT_VALEURS
        DICT_VALEURS = dictValeurs

        # Initialisation du document
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Vérifie qu'un cadre principal existe bien dans le document
        if doc.modeleDoc.FindObjet("cadre_principal") == None:
            raise Exception(
                "Votre modele de document doit obligatoirement comporter un cadre principal. Retournez dans l'editeur de document et utilisez pour votre modele la commande 'Inserer un objet special > Inserer le cadre principal'."
            )

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        ##        # Définit le template des pages suivantes
        ##        story.append(NextPageTemplate("suivante"))

        # ----------- Insertion du contenu des frames --------------

        # ------------------- TITRE -----------------
        dataTableau = []
        largeursColonnes = [
            TAILLE_CADRE_CONTENU[2],
        ]
        dataTableau.append((_(u"Reçu de règlement"), ))
        dataTableau.append((u"", ))
        style = TableStyle([
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
            ('FONT', (0, 1), (0, 1), "Helvetica", 8),
            ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
            ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 10))

        # TEXTE D'INTRODUCTION
        paraStyleIntro = ParagraphStyle(
            name="intro",
            fontName="Helvetica",
            fontSize=11,
            leading=14,
            spaceBefore=0,
            spaceafter=0,
            leftIndent=0,
            rightIndent=0,
            alignment=0,
        )

        if DICT_VALEURS["intro"] != None:
            texteIntro = DICT_VALEURS["intro"]
            story.append(Paragraph(u"<i>%s</i>" % texteIntro, paraStyleIntro))
            story.append(Spacer(0, 20))

        couleurFond = (0.8, 0.8, 1)

        # ------------------- TABLEAU CONTENU -----------------

        dataTableau = []
        largeursColonnes = [120, 280]

        paraStyle = ParagraphStyle(
            name="detail",
            fontName="Helvetica-Bold",
            fontSize=9,
        )
        dataTableau.append((_(u"Caractéristiques du règlement"), ""))
        montantEnLettres = UTILS_Conversion.trad(DICT_VALEURS["montant"],
                                                 MONNAIE_SINGULIER,
                                                 MONNAIE_DIVISION).strip()
        dataTableau.append((_(u"Montant du règlement :"),
                            Paragraph(montantEnLettres.capitalize(),
                                      paraStyle)))
        dataTableau.append((_(u"Mode de règlement :"),
                            Paragraph(DICT_VALEURS["nomMode"], paraStyle)))
        dataTableau.append((_(u"Nom du payeur :"),
                            Paragraph(DICT_VALEURS["nomPayeur"], paraStyle)))
        if DICT_VALEURS["nomEmetteur"] != None:
            dataTableau.append((_(u"Nom de l'émetteur :"),
                                Paragraph(DICT_VALEURS["nomEmetteur"],
                                          paraStyle)))
        if DICT_VALEURS["numPiece"] not in ("", None):
            dataTableau.append((_(u"Numéro de pièce :"),
                                Paragraph(DICT_VALEURS["numPiece"],
                                          paraStyle)))

        style = TableStyle([
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('FONT', (0, 0), (0, -1), "Helvetica", 9),
            ('FONT', (1, 0), (1, -1), "Helvetica-Bold", 9),
            ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
            ('ALIGN', (0, 1), (0, -1), 'RIGHT'),
            ('ALIGN', (1, 1), (1, -1), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica", 7),
            ('SPAN', (0, 0), (-1, 0)),
            ('BACKGROUND', (0, 0), (-1, 0), couleurFond),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)

        # --------------------- LISTE DES PRESTATIONS ----------------
        listePrestations = dictValeurs["prestations"]
        if len(listePrestations) > 0:

            story.append(Spacer(0, 20))
            textePrestations = _(u"En paiement des prestations suivantes :")
            story.append(
                Paragraph(u"<i>%s</i>" % textePrestations, paraStyleIntro))
            story.append(Spacer(0, 20))

            dataTableau = [
                (_(u"Date"), _(u"Activité"), _(u"Individu"), _(u"Intitulé"),
                 _(u"Part utilisée")),
            ]
            largeursColonnes = [50, 95, 70, 135, 50]

            paraStyle = ParagraphStyle(
                name="detail",
                fontName="Helvetica",
                fontSize=7,
                leading=7,
                spaceBefore=0,
                spaceAfter=0,
            )

            for dictPrestation in listePrestations:
                date = UTILS_Dates.DateDDEnFr(dictPrestation["date"])
                activite = dictPrestation["nomActivite"]
                individu = dictPrestation["prenomIndividu"]
                label = dictPrestation["label"]
                montant = dictPrestation["montant"]
                ventilation = dictPrestation["ventilation"]

                dataTableau.append((
                    Paragraph(u"<para align='center'>%s</para>" % date,
                              paraStyle),
                    Paragraph(activite, paraStyle),
                    Paragraph(individu, paraStyle),
                    Paragraph(label, paraStyle),
                    Paragraph(
                        u"<para align='right'>%.2f %s</para>" %
                        (ventilation, SYMBOLE), paraStyle),
                ))

            style = TableStyle([
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                ('FONT', (0, 0), (-1, -1), "Helvetica", 7),
                ('TOPPADDING', (0, 1), (-1, -1), 1),
                ('BOTTOMPADDING', (0, 1), (-1, -1), 3),

                # Ligne Entetes
                ('FONT', (0, 0), (-1, 0), "Helvetica", 7),
                ('BACKGROUND', (0, 0), (-1, 0), couleurFond),
                ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)

        # Enregistrement et ouverture du PDF
        try:
            doc.build(story)
        except Exception, err:
            print "Erreur dans ouverture PDF :", err
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return
示例#14
0
    def Impression(self, listeActivites, listePeriodes):
        # Création du PDF
        self.taille_page = A4
        self.orientation = "PORTRAIT"
        if self.orientation == "PORTRAIT" :
            self.hauteur_page = self.taille_page[1]
            self.largeur_page = self.taille_page[0]
        else:
            self.hauteur_page = self.taille_page[0]
            self.largeur_page = self.taille_page[1]
        
        # Création des conditions pour les requêtes SQL
        conditionsPeriodes = GetSQLdates(listePeriodes)
        
        if len(listeActivites) == 0 : conditionActivites = "()"
        elif len(listeActivites) == 1 : conditionActivites = "(%d)" % listeActivites[0]
        else : conditionActivites = str(tuple(listeActivites))
                                    
        # Récupération des individus grâce à leurs consommations
        self.EcritStatusBar(_(u"Recherche des individus..."))
        DB = GestionDB.DB() 
        req = """SELECT individus.IDindividu, IDcivilite, nom, prenom, date_naiss
        FROM consommations 
        LEFT JOIN individus ON individus.IDindividu = consommations.IDindividu
        WHERE etat IN ("reservation", "present")
        AND IDactivite IN %s AND %s
        GROUP BY individus.IDindividu
        ORDER BY nom, prenom
        ;""" % (conditionActivites, conditionsPeriodes)
        DB.ExecuterReq(req)
        listeIndividus = DB.ResultatReq()
        DB.Close() 
        if len(listeIndividus) == 0 :
            dlg = wx.MessageDialog(self, _(u"Aucun individu n'a été trouvé avec les paramètres spécifiés !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.EcritStatusBar(u"")
            return

        dictIndividus = {}
        listeIDindividus = []
        
        dictAnniversaires = {} 
        
        self.EcritStatusBar(_(u"Recherche des dates de naissance..."))
        for IDindividu, IDcivilite, nom, prenom, date_naiss in listeIndividus :
            if date_naiss != None : 
                date_naiss = DateEngEnDateDD(date_naiss)
                age = GetAge(date_naiss)
                jour = date_naiss.day
                mois = date_naiss.month
                
                # Mémorisation de l'individu
                dictIndividus[IDindividu] = { 
                    "IDcivilite" : IDcivilite, "nom" : nom, "prenom" : prenom, 
                    "age" : age, "date_naiss" : date_naiss,
                    }
                
                # Mémorisation du IDindividu
                if dictAnniversaires.has_key(mois) == False : 
                    dictAnniversaires[mois] = {} 
                if dictAnniversaires[mois].has_key(jour) == False : 
                    dictAnniversaires[mois][jour] = []
                dictAnniversaires[mois][jour].append(IDindividu)
                
                if IDindividu not in listeIDindividus :
                    listeIDindividus.append(IDindividu) 
                
        # Récupération des photos individuelles
        dictPhotos = {}
        taillePhoto = 128
        if self.ctrl_photos.GetSelection() == 0 : tailleImageFinal = 16
        if self.ctrl_photos.GetSelection() == 1 : tailleImageFinal = 32
        if self.ctrl_photos.GetSelection() == 2 : tailleImageFinal = 64
        if self.check_photos.GetValue() == True :
            index = 0
            for IDindividu in listeIDindividus :
                self.EcritStatusBar(_(u"Recherche des photos... %d/%d") % (index, len(listeIDindividus)))
                IDcivilite = dictIndividus[IDindividu]["IDcivilite"]
                nomFichier = Chemins.GetStaticPath("Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
                IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu, nomFichier=nomFichier, taillePhoto=(taillePhoto, taillePhoto), qualite=100)
                
                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp(fichier="photoTmp%d.jpg" % IDindividu)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier, width=tailleImageFinal, height=tailleImageFinal)
                dictPhotos[IDindividu] = img
                
                index += 1
            
        # ---------------- Création du PDF -------------------
        self.EcritStatusBar(_(u"Création du PDF...")) 
        
        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("ANNIVERSAIRES", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = BaseDocTemplate(nomDoc, pagesize=(self.largeur_page, self.hauteur_page), topMargin=30, bottomMargin=30, showBoundary=False)
        doc.addPageTemplates(MyPageTemplate(pageSize=(self.largeur_page, self.hauteur_page)))
        story = []
                        
        # Mois
        listeMois = dictAnniversaires.keys()
        listeMois.sort() 
        for numMois in listeMois :
            
            # Mémorise le numéro de mois pour le titre de la page
            nomMois = LISTE_NOMS_MOIS[numMois-1]
            story.append(DocAssign("numMois", numMois))

            # Jours
            dictJours = dictAnniversaires[numMois]
            listeJours = dictJours.keys() 
            listeJours.sort() 
            for numJour in listeJours :                                
                # Initialisation du tableau
                dataTableau = []
                largeursColonnes = []
                                    
                # Recherche des entêtes de colonnes :
                if self.check_photos.GetValue() == True :
                    largeursColonnes.append(tailleImageFinal+6)
                
                # Colonne nom de l'individu
                largeursColonnes.append(LARGEUR_COLONNE-sum(largeursColonnes))
                
                # Label numéro de jour
                ligne = []
                ligne.append(str(numJour))
                if self.check_photos.GetValue() == True :
                    ligne.append(u"")
                dataTableau.append(ligne)
                
                # Individus
                listeIndividus = dictAnniversaires[numMois][numJour]
                
                for IDindividu in listeIndividus :
                    ligne = []
                    
                    # Photo
                    if self.check_photos.GetValue() == True and IDindividu in dictPhotos :
                        img = dictPhotos[IDindividu]
                        ligne.append(img)
                    
                    # Nom
                    nom = dictIndividus[IDindividu]["nom"]
                    prenom = dictIndividus[IDindividu]["prenom"]
                    ligne.append(u"%s %s" % (nom, prenom))
                    
                    # Ajout de la ligne individuelle dans le tableau
                    dataTableau.append(ligne)
             
                couleurFondJour = (0.8, 0.8, 1) # Vert -> (0.5, 1, 0.2)
                couleurFondTableau = (1, 1, 1)
                
                style = TableStyle([
                        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), # Centre verticalement toutes les cases
                        ('BACKGROUND', (0,0), (-1,-1), couleurFondTableau), # Donne la couleur de fond du titre de groupe
                        
                        ('FONT',(0,0),(-1,-1), "Helvetica", 7), # Donne la police de caract. + taille de police 
                        ('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
                        ('ALIGN', (0,1), (-1,-1), 'CENTRE'), # Centre les cases
                        
                        ('SPAN',(0,0),(-1,0)), # Fusionne les lignes du haut pour faire le titre du groupe
                        ('FONT',(0,0),(0,0), "Helvetica-Bold", 10), # Donne la police de caract. + taille de police du titre de groupe
                        ('BACKGROUND', (0,0), (-1,0), couleurFondJour), # Donne la couleur de fond du titre de groupe
                        
                        ])
                    
                # Création du tableau
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)
                story.append(Spacer(0, 10))
                    
            # Saut de page après un mois
            story.append(PageBreak())
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
        
        self.EcritStatusBar(u"") 
示例#15
0
文件: pdf.py 项目: AdhlanFauzan/tam
def render_to_reportlab(context):
    """
        In context dictionary we could have a 'fattura'
        or a list of fatture in 'fatture'.

        Everything will be appended to a pdf returned as Django response.

        To reset page counter between different invoices, we'll use
        2 "Normale" templates, one for even and one for odds, so every times
        the template changes we'll reset the NumberedCanvas
    """
    if "fattura" in context and "fatture" in context:
        raise Exception(
            "Please create PDF choosing between a fattura or multiple fatture")
    if "fattura" in context:
        fatture = [context.get('fattura')]
    else:
        fatture = context.get('fatture')

    response = http.HttpResponse(content_type='application/pdf')
    NormalTemplates = ['Normale0', 'Normale1']

    fatture_rimanenti = len(fatture)
    story = []

    pageTemplates = [
        PageTemplate(id='Normale0', onPage=onPageNormal),
        PageTemplate(id='Normale1', onPage=onPageNormal),
        PageTemplate(id='ConducenteConsorzio',
                     onPage=onPageConducenteConsorzio),
        PageTemplate(id='ConsorzioConducente',
                     onPage=onPageConsorzioConducente),
    ]
    # scelgo il template della prima pagina come primo della lista
    if fatture[0].is_ricevuta_sdoppiata():
        lastTemplateID = 'ConducenteConsorzio'
        pageTemplates = pageTemplates[2:] + pageTemplates[:2]
    else:
        lastTemplateID = 'Normale0'

    width, height = portrait(A4)
    doc = BaseDocTemplate(
        response,
        pagesize=(width, height),
        leftMargin=1 * cm,
        rightMargin=1 * cm,
        bottomMargin=1.5 * cm,
        topMargin=1 * cm,
        showBoundary=test,
        pageTemplates=pageTemplates,
    )
    doc.fatture = fatture
    doc.lastTemplateID = lastTemplateID
    doc.fattura_corrente = 0

    for fattura in fatture:
        ricevutaMultipla = fattura.is_ricevuta_sdoppiata()
        story_fattura = []
        fatturazione = FATTURE_PER_TIPO[fattura.tipo]

        righeFattura = [
            ('Descrizione', 'Q.tà', 'Prezzo', 'IVA %', 'Importo'),
        ]

        righe = fattura.righe.all()

        raggruppa_barbatrucco = False
        if fatturazione.codice == "5":
            totale = sum([r.val_totale() for r in righe])
            conducente = righe[0].conducente if righe else None
            if "Imposta di bollo" not in [r.descrizione for r in righe]:
                if not (totale < settings.MIN_PRICE_FOR_TAXSTAMP and
                        (conducente is None or conducente.emette_ricevute)):
                    raggruppa_barbatrucco = True

        if raggruppa_barbatrucco:
            # print "5 esente iva con barbatrucco"

            netto = totale / Decimal(1.1)

            class RigaTotaleIvata(object
                                  ):  # una riga che fa corrispondere il totale
                descrizione = "Servizi per consorzio."
                note = None
                qta = 1
                prezzo = netto
                iva = 10

                def val_imponibile(self):
                    return self.prezzo

                def val_iva(self):
                    return totale - netto

                def val_totale(self):
                    return totale

            riga = RigaTotaleIvata()
            # la fattura ha totale pari al totale di tutte le righe
            # l'iva è fissa al 10% e il netto è calcolato di conseguenza
            imponibile = netto
            iva = totale - netto
            righe = [riga]

        else:
            imponibile = fattura.val_imponibile()
            iva = fattura.val_iva()

        for riga in righe:
            descrizione = riga.descrizione
            if riga.note: descrizione += " (%s)" % riga.note
            righeFattura.append(
                (Paragraph(descrizione,
                           normalStyle), Paragraph("%s" % riga.qta,
                                                   normalStyle),
                 moneyfmt(riga.prezzo), riga.iva, moneyfmt(riga.val_totale())))
        righeTotali = []
        righeTotali.append(('Imponibile', moneyfmt(imponibile)))
        righeTotali.append(('IVA', moneyfmt(iva)))
        righeTotali.append(('TOTALE', moneyfmt(fattura.val_totale())))
        righeStyle = TableStyle([
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (-1, -1),
             'RIGHT'),  # globalmente allineato a destra...
            ('ALIGN', (0, 0), (1, -1),
             'LEFT'),  # tranne la prima colonna (con la descrizione)
            ('GRID', (0, 1), (-1, -1), 0.1, colors.grey),
            ('FACE', (0, 0), (-1, -1), 'Helvetica'),
            ('FACE', (0, 0), (-1, 0), 'Helvetica-Bold'),  # header
            ('SIZE', (0, 0), (-1, -1), 8),

            # ('SPAN', (0, -1), (3, -1)),	# anziché mettere lo span qui aggiungo in coda una tabella diversa
        ])
        totaliStyle = TableStyle([
            ('ALIGN', (0, 0), (-1, -1), 'RIGHT'),
            ('GRID', (-1, 0), (-1, -1), 0.1, colors.grey),
            ('FACE', (0, 0), (-1, -1), 'Helvetica'),  # header
            ('FACE', (0, -1), (-1, -1), 'Helvetica-Bold'),  # Totale
            ('SIZE', (0, 0), (-1, -1), 8),
        ])

        colWidths = ((width - doc.leftMargin - doc.rightMargin) -
                     (1.6 * 4) * cm, ) + (1.6 * cm, ) * 4
        story_fattura = [
            Table(righeFattura,
                  style=righeStyle,
                  repeatRows=1,
                  colWidths=colWidths)
        ]
        story_fattura.append(
            KeepTogether(
                Table(righeTotali,
                      style=totaliStyle,
                      colWidths=(width - doc.leftMargin - doc.rightMargin -
                                 1.6 * cm, 1.6 * cm))))

        if ricevutaMultipla:  # le ricevute si raddoppiano con 2 template diversi
            # raddoppio lo story di questa fattura cambiando template
            story_fattura = story_fattura + [
                NextPageTemplate("ConsorzioConducente"),
                PageBreak()
            ] + story_fattura
        fatture_rimanenti -= 1
        if fatture_rimanenti:
            story_fattura += [
                NextPageTemplate(NormalTemplates[-1]),
                PageBreak()
            ]

        NormalTemplates.reverse()  # reverse current, next normal template

        story = story + story_fattura

    doc.build(story, canvasmaker=NumberedCanvas)
    return response
示例#16
0
    def __init__(self,
                 dictComptes={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_COMPTES, DICT_OPTIONS
        DICT_COMPTES = dictComptes
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("ATTESTATIONS_FISCALES",
                                                     "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Vérifie qu'un cadre principal existe bien dans le document
        if doc.modeleDoc.FindObjet("cadre_principal") == None:
            raise Exception(
                "Votre modele de document doit obligatoirement comporter un cadre principal. Retournez dans l'editeur de document et utilisez pour votre modele la commande 'Inserer un objet special > Inserer le cadre principal'."
            )

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        ##        # Définit le template des pages suivantes
        ##        story.append(NextPageTemplate("suivante"))

        # ----------- Insertion du contenu des frames --------------
        listeNomsSansCivilite = []
        for IDcompte_payeur, dictCompte in dictComptes.items():
            listeNomsSansCivilite.append(
                (dictCompte["{FAMILLE_NOM}"], IDcompte_payeur))
        listeNomsSansCivilite.sort()

        for nomSansCivilite, IDcompte_payeur in listeNomsSansCivilite:
            dictCompte = dictComptes[IDcompte_payeur]

            story.append(DocAssign("IDcompte_payeur", IDcompte_payeur))
            nomSansCivilite = dictCompte["{FAMILLE_NOM}"]
            story.append(Bookmark(nomSansCivilite, str(IDcompte_payeur)))

            # ------------------- TITRE -----------------
            dataTableau = []
            largeursColonnes = [
                TAILLE_CADRE_CONTENU[2],
            ]
            dataTableau.append((dictOptions["titre"], ))
            texteDateReference = UTILS_Dates.DateEngFr(
                str(datetime.date.today()))
            dataTableau.append(
                (_(u"Période du %s au %s") %
                 (UTILS_Dates.DateDDEnFr(dictOptions["date_debut"]),
                  UTILS_Dates.DateDDEnFr(dictOptions["date_fin"])), ))
            style = TableStyle([
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
                ('FONT', (0, 1), (0, 1), "Helvetica", 8),
                ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
                ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 30))

            couleurFond = (0.8, 0.8, 1)
            couleurFondActivite = (0.92, 0.92, 1)

            # TEXTE CONTENU
            paraStyle = ParagraphStyle(
                name="contenu",
                fontName="Helvetica",
                fontSize=11,
                leading=16,
                spaceBefore=0,
                spaceafter=0,
                leftIndent=6,
                rightIndent=6,
            )

            # INTRO
            texte = dictCompte["{INTRO}"]
            if texte != "":
                listeParagraphes = texte.split("</para>")
                for paragraphe in listeParagraphes:
                    textePara = Paragraph(u"%s" % paragraphe, paraStyle)
                    story.append(textePara)

                story.append(Spacer(0, 25))

            # DETAIL par enfant
            dataTableau = [
                (_(u"Nom et prénom"), _(u"Date de naissance"), _(u"Montant")),
            ]
            largeursColonnes = [220, 80, 80]

            paraStyle = ParagraphStyle(
                name="detail",
                fontName="Helvetica-Bold",
                fontSize=9,
            )

            for nomCompletIndividu, dictIndividu in dictCompte["individus"]:
                dataTableau.append(
                    (nomCompletIndividu, dictIndividu["date_naiss"],
                     u"%.2f %s" % (dictIndividu["regle"], SYMBOLE)))

            dataTableau.append(("", "Total :", dictCompte["{MONTANT_REGLE}"]))

            style = TableStyle([
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
                ('GRID', (0, 0), (-1, -2), 0.25, colors.black),
                ('FONT', (0, 0), (-1, 0), "Helvetica", 6),
                ('FONT', (0, 1), (-1, -1), "Helvetica", 10),
                ('TOPPADDING', (0, 1), (-1, -2), 10),
                ('BOTTOMPADDING', (0, 1), (-1, -2), 10),
                ('GRID', (-1, -1), (-1, -1), 0.25, colors.black),
                ('FONT', (-1, -1), (-1, -1), "Helvetica-Bold", 10),
                ('ALIGN', (-2, -1), (-2, -1), 'RIGHT'),
                ('FONT', (-2, -1), (-2, -1), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)

            # Saut de page
            story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
    def __init__(self,
                 dictValeurs={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_VALEURS, DICT_OPTIONS
        DICT_VALEURS = dictValeurs
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("COTISATIONS", "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        # ----------- Insertion du contenu des frames --------------
        listeLabels = []
        for IDcotisation, dictValeur in dictValeurs.iteritems():
            listeLabels.append((dictValeur["{FAMILLE_NOM}"], IDcotisation))
        listeLabels.sort()

        for labelDoc, IDcotisation in listeLabels:
            dictValeur = dictValeurs[IDcotisation]
            if dictValeur["select"] == True:

                story.append(DocAssign("IDcotisation", IDcotisation))
                nomSansCivilite = dictValeur["{FAMILLE_NOM}"]
                story.append(Bookmark(nomSansCivilite, str(IDcotisation)))

                ##                # ------------------- TITRE -----------------
                ##                dataTableau = []
                ##                largeursColonnes = [ TAILLE_CADRE_CONTENU[2], ]
                ##                dataTableau.append((dictCompte["titre"],))
                ##                texteDateReference = UTILS_Dates.DateEngFr(str(datetime.date.today()))
                ##                dataTableau.append((_(u"Situation au %s") % texteDateReference,))
                ##                style = TableStyle([
                ##                        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
                ##                        ('FONT',(0,0),(0,0), "Helvetica-Bold", 19),
                ##                        ('FONT',(0,1),(0,1), "Helvetica", 8),
                ##                        ('LINEBELOW', (0,0), (0,0), 0.25, colors.black),
                ##                        ('ALIGN', (0,0), (-1,-1), 'LEFT'),
                ##                        ])
                ##                tableau = Table(dataTableau, largeursColonnes)
                ##                tableau.setStyle(style)
                ##                story.append(tableau)
                ##                story.append(Spacer(0,30))
                ##
                ##
                ##                couleurFond = (0.8, 0.8, 1)
                ##                couleurFondActivite = (0.92, 0.92, 1)
                ##
                ##                # TEXTE CONTENU
                ##                paraStyle = ParagraphStyle(name="contenu",
                ##                              fontName="Helvetica",
                ##                              fontSize=11,
                ##                              #leading=7,
                ##                              spaceBefore=0,
                ##                              spaceafter=0,
                ##                              leftIndent=6,
                ##                              rightIndent=6,
                ##                            )
                ##
                ##                texte = dictCompte["texte"]
                ##                listeParagraphes = texte.split("</para>")
                ##                for paragraphe in listeParagraphes :
                ##                    textePara = Paragraph(u"%s</para>" % paragraphe, paraStyle)
                ##                    story.append(textePara)

                # Saut de page
                story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
    def __init__(self,
                 dictComptes={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_COMPTES, DICT_OPTIONS
        DICT_COMPTES = dictComptes
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("RAPPELS", "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Vérifie qu'un cadre principal existe bien dans le document
        if doc.modeleDoc.FindObjet("cadre_principal") == None:
            raise Exception(
                "Votre modele de document doit obligatoirement comporter un cadre principal. Retournez dans l'editeur de document et utilisez pour votre modele la commande 'Inserer un objet special > Inserer le cadre principal'."
            )

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        ##        # Définit le template des pages suivantes
        ##        story.append(NextPageTemplate("suivante"))

        # ----------- Insertion du contenu des frames --------------
        listeNomsSansCivilite = []
        for IDcompte_payeur, dictCompte in dictComptes.items():
            listeNomsSansCivilite.append(
                (dictCompte["nomSansCivilite"], IDcompte_payeur))
        listeNomsSansCivilite.sort()

        for nomSansCivilite, IDcompte_payeur in listeNomsSansCivilite:
            dictCompte = dictComptes[IDcompte_payeur]
            if dictCompte["select"] == True:

                story.append(DocAssign("IDcompte_payeur", IDcompte_payeur))
                nomSansCivilite = dictCompte["nomSansCivilite"]
                story.append(Bookmark(nomSansCivilite, str(IDcompte_payeur)))

                # ------------------- TITRE -----------------
                dataTableau = []
                largeursColonnes = [
                    TAILLE_CADRE_CONTENU[2],
                ]
                dataTableau.append((dictCompte["titre"], ))
                texteDateReference = DateEngFr(str(datetime.date.today()))
                dataTableau.append(
                    (_(u"Situation au %s") % texteDateReference, ))
                style = TableStyle([
                    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                    ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
                    ('FONT', (0, 1), (0, 1), "Helvetica", 8),
                    ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
                    ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
                ])
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)
                story.append(Spacer(0, 30))

                couleurFond = (0.8, 0.8, 1)
                couleurFondActivite = (0.92, 0.92, 1)

                # TEXTE CONTENU
                paraStyle = ParagraphStyle(
                    name="contenu",
                    fontName="Helvetica",
                    fontSize=11,
                    #leading=7,
                    spaceBefore=0,
                    spaceafter=0,
                    leftIndent=6,
                    rightIndent=6,
                )

                texte = dictCompte["texte"]
                listeParagraphes = texte.split("</para>")
                for paragraphe in listeParagraphes:
                    if "<para" in paragraphe:
                        paragraphe = u"%s</para>" % paragraphe
                        textePara = Paragraph(paragraphe, paraStyle)
                        story.append(textePara)
                        if "> </para" in paragraphe:
                            story.append(Spacer(0, 13))

                # Saut de page
                story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
示例#19
0
    def __init__(self,
                 dictValeurs={},
                 IDmodele=None,
                 nomDoc=FonctionsPerso.GenerationNomDoc("INSCRIPTION", "pdf"),
                 afficherDoc=True):
        """ Impression """
        global DICT_VALEURS
        DICT_VALEURS = dictValeurs

        # Initialisation du document
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12
        couleurFond = (0.8, 0.8, 1)

        # ----------- Insertion du contenu des frames --------------
        cadre_principal = doc.modeleDoc.FindObjet("cadre_principal")
        if cadre_principal != None:

            if DICT_VALEURS["intro"] != None or DICT_VALEURS["tableau"] == True:

                # ------------------- TITRE -----------------
                dataTableau = []
                largeursColonnes = [
                    TAILLE_CADRE_CONTENU[2],
                ]
                dataTableau.append((_(u"Confirmation d'inscription"), ))
                dataTableau.append((u"", ))
                style = TableStyle([
                    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                    ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
                    ('FONT', (0, 1), (0, 1), "Helvetica", 8),
                    ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
                    ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
                ])
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)
                story.append(Spacer(0, 10))

                # TEXTE D'INTRODUCTION
                paraStyleIntro = ParagraphStyle(
                    name="intro",
                    fontName="Helvetica",
                    fontSize=11,
                    leading=14,
                    spaceBefore=0,
                    spaceafter=0,
                    leftIndent=0,
                    rightIndent=0,
                    alignment=0,
                )

            if DICT_VALEURS["intro"] != None:
                texteIntro = DICT_VALEURS["intro"]
                story.append(
                    Paragraph(u"<i>%s</i>" % texteIntro, paraStyleIntro))
                story.append(Spacer(0, 20))

            if DICT_VALEURS["tableau"] == True:

                # ------------------- TABLEAU CONTENU -----------------
                dataTableau = []
                largeursColonnes = [80, 280]
                paraStyle = ParagraphStyle(
                    name="detail",
                    fontName="Helvetica-Bold",
                    fontSize=9,
                )
                dataTableau.append((_(u"Nom"),
                                    Paragraph(DICT_VALEURS["{INDIVIDU_NOM}"],
                                              paraStyle)))
                dataTableau.append(
                    (_(u"Prénom"),
                     Paragraph(DICT_VALEURS["{INDIVIDU_PRENOM}"], paraStyle)))
                dataTableau.append(
                    (_(u"Activité"),
                     Paragraph(DICT_VALEURS["{ACTIVITE_NOM_LONG}"],
                               paraStyle)))
                dataTableau.append(
                    (_(u"Groupe"),
                     Paragraph(DICT_VALEURS["{GROUPE_NOM_LONG}"], paraStyle)))
                dataTableau.append(
                    (_(u"Catégorie"),
                     Paragraph(DICT_VALEURS["{NOM_CATEGORIE_TARIF}"],
                               paraStyle)))

                style = TableStyle([
                    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                    ('FONT', (0, 0), (0, -1), "Helvetica", 9),
                    ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                    ('ALIGN', (0, 0), (0, -1), 'RIGHT'),
                ])
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)

        # Si aucune frame principale
        if len(story) == 0:
            story.append(Spacer(0, 20))

        # Enregistrement et ouverture du PDF
        try:
            doc.build(story)
        except Exception, err:
            print "Erreur dans ouverture PDF :", err
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return