Last Updated on 14 Dicembre 2019 by Roberto De Pedrini
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.
Index
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!
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.