Comporre Pdf in Python

Leggendo l’articolo, anche poetico, del nostro Champion Ibm Roberto De Pedrini, riguardo il merge di diversi pdf, mi è venuta l’ispirazione di raccontare un po’ come fare un pdf in Python.

E’ molto semplice, è sufficiente installare il package fpdf (pip install fpdf) e poi con poche istruzioni si ottengo dei fantastici pdf con i quali possiamo costruire dei graziosi report, con i dati proveniente dal nostro IbmI.

Programma Python

from fpdf import FPDF
import webbrowser
import os.path
from DbPoweri import DbPoweri
from time import gmtime, strftime
 
class StampaPeso():
    def __init__(self):
        pass
    def testata(self, datai, dataf, datain , datafi):
        pdf = FPDF()
        pdf.add_page()
        pdf.set_font("Arial", size=20)
        self.page=1
        pdf.cell(200, 10, txt="Riepilogo produzione:" +datai+"-"+dataf , ln=1, align="C")
        pdf.set_font("Arial", size=12)
        self.dettaglio(pdf, datain , datafi)  
        a=strftime("%Y-%m-%d %H-%M-%S", gmtime())
Aggiungo la variabile "a" per decodificare in modo univoco il pdf con data e time 

        if os.path.exists("C:\\temp\\StampaProduzionePeso"+a+".pdf")  is False:
#SCRIVE IL PDF NELLA CARTELLA
            pdf.output( "C:\\temp\\StampaProduzionePeso"+a+".pdf","F").encode('latin-1')
#APRE IL BROWSER PDF
            webbrowser.open_new_tab(r''  'C://temp//StampaProduzionePeso'+a+'.pdf')
        else:
            print ("error")
            return
    def dettaglio(self,pdf,datain, datafi):
        pdf.set_font('Arial', '', 10)
        c=DbPoweri()
        c.connection()
#ROWS LISTA DELLE COLONNE DALLA FETCH DI CONNESSIONE SUL DATABASE IBMI
#ROWS1 LISTA DELLE COLONNE di totalizzazione DALLA FETCH DI CONNESSIONE SUL DATABASE IBMI 
        rows, col_names=c.peso(c.c1, datain, datafi)
        rows1, col_namest=c.totpeso(c.c1, datain ,datafi)
        pdf.set_fill_color(192,192,192)    
#PDF.CELL COSTRUISCO LA CELLA
#(WIDTH,HEIGHT, TXT, BORDER 0:NO BORDER 1:BORDER,
# 0 CONTINUA A DESTRA, 1 INIZIA UNA NUOVA LINEA
# ALIGN L:LEFT C:CENTER R:RIGHT)    
# INDICA SE LA CELLA PUO' ESSERE COLORATA True, TRASPARENTE False
        pdf.cell(10, 10, 'Cod', 1, 0, 'C',fill = True)
        pdf.cell(40, 10, 'Qta_Grammatura', 1, 0, 'C',fill = True)
        pdf.cell(40, 10, 'Qta_KG', 1, 1, 'C',fill = True)
        pdf.ln(0)
        nr=0
        posizione=0
        for riga in rows:
            w_x=0
            for col in riga:
                w_x+=1
                if w_x==1:
                    cod=col
                if w_x==2:
                    gramm=col
                if w_x==3:
                    peso=col
            pdf.set_fill_color(192,192,192)
            pdf.cell(10, 8, str(cod), 1, 0, 'L')
            pdf.cell(40, 8, str(gramm), 1, 0, 'R')
            pdf.cell(40, 8, str(peso), 1, 1, 'R')  
           
        for riga in rows1:
            w_x=0
            for col in riga:
                w_x=w_x+1
                if w_x==1:
                    gramm=col
                if w_x==2:
                    peso=col
            pdf.cell(10, 8, "", 1, 0, 'L') 
            pdf.cell(40, 8, str(gramm), 1, 0, 'R')
            pdf.cell(40, 8, str(peso), 1, 1, 'R')  

Conclusioni

Ecco lo sviluppo del pdf. Con poche istruzioni si riescono a fare delle stampe eccellenti. Questa tecnica può essere usata, inoltre, per lanciare la stampa dei pdf collegati a particolari disegni di produzione o eseguire delle funzioni di stampa per le certificazioni e così via.
Insomma questo linguaggio dimostra di essere molto versatile e si integra perfettamente con il nostro IbmI.
Happy coding!

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

View Comments

  • Salve, un link alla documentazione della libreria DbPoweri (se esiste) ? Ho letto qualcosa solo per la libreria ibm_db_dbi.
    Grazie

  • La libreria DbPoweri non esiste è una classe python che usa la libreria pypyodbc (che può essere usata al fuori del pase) del progetto:

    Ecco il sorgente della classe:

    import pypyodbc

    class DbPoweri():

    def __init__(self):
    super(DbPoweri, self).__init__()

    def connection(self):
    connection = pypyodbc.connect(driver='{iSeries Access ODBC Driver}',
    system='192.168.0.100',uid='ARTPYTHON',pwd='ARTPYTHON')
    self.c1 = connection.cursor()

    def peso(self,c1, datain, datafi):

    stringa=("select cla5ma cod, des grammatura, decimal(sum(qtmomm),11,0) Qta_Grammatura , "
    " decimal(sum(qtmomm*peunma), 11, 0) Peso_Kg from libreria.mgmov00f " +
    " inner join libreria.mgart00f on cddtma=cddtmm and cdarmm=cdarma " +
    " inner join libreria.cstb01lh on cod=cla5ma "+

    " where camomm='30' and cddtmm='01'"
    " and dtmomm between " + datain + " and " +datafi+ "" +
    " group by cla5ma, des" )

    c1.execute(stringa)
    col_names = [x[0] for x in c1.description]
    row = c1.fetchall()

    return row, col_names
    def totpeso(self,c1, datain, datafi):

    stringa=("select decimal(sum(qtmomm),11,0) Qta_Grammatura , "
    " decimal(sum(qtmomm*peunma), 11, 0) Peso_Kg from libreria.mgmov00f " +
    " inner join libreria.mgart00f on cddtma=cddtmm and cdarmm=cdarma " +
    " inner join libreria.cstb01lh on cod=cla5ma "+

    " where camomm='30' and cddtmm='01'"
    " and dtmomm between " + datain + " and " +datafi+ "" + "")

    c1.execute(stringa)
    col_names = [x[0] for x in c1.description]
    row = c1.fetchall()

    return row, col_names

  • Buongiorno. Domandona : và settato qualcosa da qualche parte per far aprire al browser il pdf ? ho provato ad usare l'istruzione vista sopra.Benchè non mi dia errori non produce alcun risultato... Grazie, saluti Nalesso Antonio

  • Salve, non dovrebbero esserci particolari prerequisiti nel browser. Su edge dovrebbe aprirlo tranquillamente. Presumo che il pdf venga generato correttamente nella cartella. Potrebbe essere qualcosa legato a windows defender che blocca l'apertura. Attendo. Grazie. Buona Serata

  • In realtà stò testando solo la parte di apertura. il Pdf già esiste in una cartella del IFS. La apertura del browser la voglio fare direttamente da AS400 lanciando uno script Python (uso i comandi della libreria PYONI per interfacciarmi). Tuttavia anche provando a lanciare il comando secco dalla Qshell non ottengo nulla :
    python3 -m webbrowser -t "http://www.python.org"

    Ho provato anche a registrare il browser con uno script ...
    chrome_path="C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"

    Ma non cambia nulla. Speravo riuscisse ad interfacciarsi col Pc che stà lanciando la finestra dell'emulatore ... ma ovviamente non è così (sono a conoscenza che ci manca la parte grafica in as ... )

    Mi sarebbe utile perchè oggi devo passare per lo STRPCO e STRPCCMD, ma sono limitato come ben noto dalla lunghezza dei parametri che posso passare.

    Grazie mille.

Recent Posts

SQL: SELECT con i “superpoteri”

Con un piccolo trucco anche una semplice istruzione SELECT può eseguire qualsiasi comando di sistema ! Vediamo come...

5 mesi ago

NetServer per tutti – parte 5

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 4

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 3

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 2

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 1

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago