Discussione:
reportlab alcune info
(troppo vecchio per rispondere)
Claudio
2007-03-06 19:24:54 UTC
Permalink
Ieri ho preso in mano reportlab e superato lo sconcerto iniziale
perchè non è visuale (sconcerto comprensibile in un utonto microsoft)
ho fatto un giro sugli esempi e mi sembra estremamente potente.

Bello, e a prima vista semplice da usare, 20 minunti e la
documentazione con esempi ben fatti ha dato i suoi frutti,
naturalmente avendo letto solo un centesimo della documentazione
qualcosa mi è ancora poco chiaro. Ad ogni modo tanto per imparare mi
dedico a una stampa etichette.



1) nel realizzare un etichetta mi trovo di fronte al seguente
problema: Quando il testo è lungo vorrei adattarlo automaticamente.
quindi prima di scrivere un testo mi piacerebbe sapere le sue
dimensione in maniera da cambiarne in automatico le impostazioni (e
reporlab qui mi sembra eccezionale) per adattarlo all'etichetta.
Purtroppo per ora ho trovato solo come leggere la posizione del
cursore, quindi dopo aver scritta posso sapere quanto è grande (n
questo caso un rollback, se esiste, risolverebbe, ma non mi sembra
comunque una soluzione 'ottimale')

2)un altra richiesta simile e di poter definire un area rettangolare,
in cui scrivere con acapo automatico quando raggiunge il limite destro
dell'area. Ho visto che reporlab lo fa automaticamente ma, ma mi
sembra di capire solo rispetto al limite della pagine e non ad una
specifica area.

3)(Problema classico dei report) per ora ho fatto solo una pagina, ma
in un report a più pagine mi piacerebbe poter scrivere pagina 1 di 5.
ma il "5" lo si impara solo dopo aver stampato quelle precedenti.
Visto che l'oggetto è in memoria le pagine precedenti sono rimangono
accessibili? Cioè, esiste qualcosa del tipo report.selectpage(1))?

4) Tool visuale. I tools visuali in genere fanno impazzire nello
sviluppo di cose complesse, specie per report nidificati, ma per le
cose facili sono indubbiamente utili. Quindi mi chiedo esiste qualcosa
tipo GLADE dedicato a reportlab?.

PROBLEMA INSTALLAZIONE
5) Installazione (sotto windows XP)
l'installazione Fa riferimento a rl_accell. scarico il file e lo metto
sotto python25\dlls
poi digito install, tutto sembra andare bene. mi pare che il 95% della
roba funzioni, ma i test per rl_accell falliscono (ora non ricordo
l'errore, se la vostra sfera di cristallo dovesse essere in
riparazione vedro di segnarmeli per riportarli) ma nel caso fosse cosa
nota e risaputa...










Stasera lo riprendo sottomano e forse le domande domani saranno
vecchie.
Yuri Valentini
2007-03-06 21:54:57 UTC
Permalink
Post by Claudio
4) Tool visuale. I tools visuali in genere fanno impazzire nello
sviluppo di cose complesse, specie per report nidificati, ma per le
cose facili sono indubbiamente utili. Quindi mi chiedo esiste qualcosa
tipo GLADE dedicato a reportlab?.
Rispondo solo a questo (e anche in modo parziale), perché anche io sono
un principiante con reportlab.
C'è un framework per costruire applicazioni database in python chiamato
Dabo (http://dabodev.com).
Quando provai dabo (ormai 6 mesi fa) notai che all'interno c'è un editor
che permette di creare report in modo visuale (tipo Microsoft Access,
per intenderci).
Non ho approfondito, comunque secondo me è molto probabile che per
utilizzarlo per generare i propri report, occarre fare "import" di buona
parte del framework dabo.
--
Yuri Valentini
Topomorto
2007-03-07 12:08:31 UTC
Permalink
Post by Claudio
Ieri ho preso in mano reportlab e superato lo sconcerto iniziale
perchè non è visuale (sconcerto comprensibile in un utonto microsoft)
ho fatto un giro sugli esempi e mi sembra estremamente potente.
Bello, e a prima vista semplice da usare, 20 minunti e la
documentazione con esempi ben fatti ha dato i suoi frutti,
naturalmente avendo letto solo un centesimo della documentazione
qualcosa mi è ancora poco chiaro. Ad ogni modo tanto per imparare mi
dedico a una stampa etichette.
1) nel realizzare un etichetta mi trovo di fronte al seguente
problema: Quando il testo è lungo vorrei adattarlo automaticamente.
quindi prima di scrivere un testo mi piacerebbe sapere le sue
dimensione in maniera da cambiarne in automatico le impostazioni (e
reporlab qui mi sembra eccezionale) per adattarlo all'etichetta.
Purtroppo per ora ho trovato solo come leggere la posizione del
cursore, quindi dopo aver scritta posso sapere quanto è grande (n
questo caso un rollback, se esiste, risolverebbe, ma non mi sembra
comunque una soluzione 'ottimale')
2)un altra richiesta simile e di poter definire un area rettangolare,
in cui scrivere con acapo automatico quando raggiunge il limite destro
dell'area. Ho visto che reporlab lo fa automaticamente ma, ma mi
sembra di capire solo rispetto al limite della pagine e non ad una
specifica area.
3)(Problema classico dei report) per ora ho fatto solo una pagina, ma
in un report a più pagine mi piacerebbe poter scrivere pagina 1 di 5.
ma il "5" lo si impara solo dopo aver stampato quelle precedenti.
Visto che l'oggetto è in memoria le pagine precedenti sono rimangono
accessibili? Cioè, esiste qualcosa del tipo report.selectpage(1))?
Per rispondere a gran parte delle tue domande ti consiglio di leggerti
bene i Frame (dalla pagina 58 della userguide.pdf). Hai anche la
possibilità di far gestire a lui il cambio di pagina e cosa scrivere e
dove (il classico pag. 1, pag. 2 ecc...)
Post by Claudio
4) Tool visuale. I tools visuali in genere fanno impazzire nello
sviluppo di cose complesse, specie per report nidificati, ma per le
cose facili sono indubbiamente utili. Quindi mi chiedo esiste qualcosa
tipo GLADE dedicato a reportlab?.
Sinceramente te lo sconsiglio vivamente, anche perchè a leggere quello
che vuoi fare di sicuro un tool visuale non fa al caso tuo...
Post by Claudio
PROBLEMA INSTALLAZIONE
5) Installazione (sotto windows XP)
l'installazione Fa riferimento a rl_accell. scarico il file e lo metto
sotto python25\dlls
poi digito install, tutto sembra andare bene. mi pare che il 95% della
roba funzioni, ma i test per rl_accell falliscono (ora non ricordo
l'errore, se la vostra sfera di cristallo dovesse essere in
riparazione vedro di segnarmeli per riportarli) ma nel caso fosse cosa
nota e risaputa...
mmm... io con python24 non ho avuto problemi, mentre con il 2.5 ho avuto
un po' di rognette qua e la in particolare sull'utilizzo della memoria
in processi piuttosto brutali con reportlab.... Cmque sono tornato al
2.4 in attesa direttamente di python 3
Post by Claudio
Stasera lo riprendo sottomano e forse le domande domani saranno
vecchie.
Ciao
--
Topomorto... per una sentenza sbagliata :'(
Topomorto dice NO alla pena di morte... soprattutto la sua.
Non uccidete la nostra libertà. Fermate Palladium
Don't kill our freedom. Stop Palladium
Claudio
2007-03-07 13:19:56 UTC
Permalink
On Wed, 07 Mar 2007 13:08:31 +0100, Topomorto <***@email.it>
wrote:

Grazie per il consiglio. La parola frame mi suona bene, immagino che
mi risolva il problema dell'area di testo. La documentazione la
leggerò stasera (python è un hobby, non un lavoro)
Post by Topomorto
Post by Claudio
4) Tool visuale. I tools visuali in genere fanno impazzire nello
sviluppo di cose complesse, specie per report nidificati, ma per le
cose facili sono indubbiamente utili. Quindi mi chiedo esiste qualcosa
tipo GLADE dedicato a reportlab?.
Sinceramente te lo sconsiglio vivamente, anche perchè a leggere quello
che vuoi fare di sicuro un tool visuale non fa al caso tuo...
Per questa cosa in particolare non lo prendo nemmeno in cosiderazione,

Ma considerata la classica stampa a listone:
LOGO,INTESTAZIONE,DATA
codice listino: MOLTOCARO desc: Listino clienti rompiballe
Riga di testata: CODICE;DECRIZIONE;PREZZO:
e giù la lunga lista degli articoli

non sarebbe una cattiva idea utilizare un tools visuale.

Per esperienza quando programmavo per lavoro in visualfox (anche se i
repor non erano la mia passione) so che Appena il report si complicava
dovevo fare i salti mortali per fare in modo che il report assumesse
la forma che desideravo con soluzioni degne del miglior macchiavelli.
Già un semplice master-detail Testata corpo e totali sul piede non
risulta semplicissimo da implementare.

Il problema delle etichette con font autoadattante sarebbe
parzialmente risolvibile con degli accrocchi, ma bisognerebbe
impazzire 50 volte tanto quello che prevedo di impazzire con reportlab
(studio del manuale compreso).
Arso - Italy
2007-03-20 23:10:11 UTC
Permalink
Post by Claudio
Grazie per il consiglio. La parola frame mi suona bene, immagino che
mi risolva il problema dell'area di testo. La documentazione la
leggerò stasera (python è un hobby, non un lavoro)
Ti posto un acrocchio che ho fatto e che stampa una lista di mail ricevute.
Con i flowables c'è l'adattamento automatico della cella delle tabelle
alla quantità di testo presente.
Quanche volta con mi deborda su alcune celle, ma generalmente funziona
egregiamente.
Spero che ti possa servire e che non sia scritto troppo da schifo per
essere capito.

# Task lists di draco per gestione pop3
import re
import time
from mx import DateTime
from time import strftime

# Importa oggetti complessi Tabella StileTabella e Template dei documenti
from reportlab.platypus import Image, Table, TableStyle, Spacer,
SimpleDocTemplate
# Unita' di misura
from reportlab.lib.units import mm, cm, inch
# Definizione elemento di disegno
from reportlab.pdfgen.canvas import Canvas
# Costanti definizione pagina
from reportlab.lib.pagesizes import A4, landscape, portrait
# Colori
import reportlab.lib.colors as colors
# Tutti i tipi di oggetti python
from types import *

from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY

strf = '%d-%m-%Y %H:%M:%S'

class Gpop_Pdf:
"""Rappresenta l'istanza del report da stampare

Accetta come parametro il nome del file .pdf da generare"""
def __init__(self, pdfFile=None):
self.pdfFile = pdfFile
self.doc = SimpleDocTemplate(self.pdfFile, pagesize=portrait(A4),
leftMargin=1*cm, rightMargin=1*cm, topMargin=1.3*cm,
bottonMargin=1.3*cm,
showMargin=False, allowSplitting=True)
stl = []
stl.append(('ALIGN', (0,0), (-1,-1), 'LEFT'))
stl.append(('ALIGN', (1,0), (1,0), 'CENTER'))
stl.append(('VALIGN', (0,0), (-1,-1), 'TOP'))
stl.append(('GRID', (0,0), (-1,-1), 1, colors.black))
self.tabStlHead = TableStyle(stl)
stl = []
stl.append(('ALIGN', (0,0), (-1,-1), 'LEFT'))
stl.append(('ALIGN', (1,0), (1,0), 'CENTER'))
stl.append(('VALIGN', (0,0), (-1,-1), 'TOP'))
stl.append(('GRID', (0,0), (-1,-1), 1, colors.black))
self.tabStlFoot = TableStyle(stl)
stl = []
stl.append(('ALIGN', (0,0), (-1,-1), 'LEFT'))
stl.append(('VALIGN', (0,0), (-1,-1), 'TOP'))
stl.append(('GRID', (0,0), (-1,-1), 0.5, colors.black))
self.tabStlBody = TableStyle(stl)

self.tabWidHead = [2.0*cm, 10.5*cm, 3.0*cm, 3.5*cm]
#self.tabHeiHead = [None for ii in range(4)]

self.tabWidFoot = [2.0*cm, 10.5*cm, 3.0*cm, 3.5*cm]
#self.tabHeiFoot = [None for ii in range(4)]

self.tabWidBody = [1.0*cm, 2.0*cm, 10.5*cm, 2.0*cm, 3.5*cm]
#self.tabHeiBody = [None for ii in range(4)]

# Definizione spacer e ricghe interruzione
self.spaceHead = Spacer(width = 0, height = 2.5*mm)
self.spaceFoot = Spacer(width = 0, height = 2.5*mm)
self.spaceBody = Spacer(width = 0, height = 1.5*mm)
# Collezione elementi di dettaglio
self.flowables = []
pass

def head(self, maia=None):
T_maia = []
T_maia.append(['INIZIO', '==== ==== Giornale E-Mail ricevute
==== ====', 'Esecuzione del', maia['maia_prtdta_new'].strftime(strf)])
T_maia.append(['Mailbox:', maia['maia_accoun'], 'Esecuzione
prec.', maia['maia_prtdta'].strftime(strf)])
T_maia.append(['Destinatario:', maia['maia_filter'], 'Stampa su
coda:', maia['maia_printe']])
tabHead = Table(data = T_maia, style = self.tabStlHead,
colWidths = self.tabWidHead )
self.flowables.append(tabHead)
self.flowables.append(self.spaceHead)
pass

def foot(self, maia=None):
T_maia = []
T_maia.append(['FINE', 'Giornale E-Mail ricevute', 'Esecuzione
del', maia['maia_prtdta_new'].strftime(strf)])
T_maia.append(['Mailbox:', maia['maia_accoun'], 'Precedente',
maia['maia_prtdta'].strftime(strf)])
T_maia.append(['Destinatario:', maia['maia_filter'], 'Numero
msg:', str(maia['maia_nummsg'])])
self.flowables.append(self.spaceFoot)
tabFoot = Table(data = T_maia, style = self.tabStlFoot,
colWidths = self.tabWidFoot )
self.flowables.append(tabFoot)
pass

def body(self, mais=None):
T_mais = []
T_mais.append(['Seq.', 'Mittente:', mais['mais_frommm'],
'Spedita', mais['mais_dtamsg'].strftime(strf)])
T_mais.append([mais['mais_nummsg'], 'Oggetto:',
mais['mais_subjec'], 'Rilevata', mais['mais_dtaric'].strftime(strf)])

tabMais = Table(data = T_mais, style = self.tabStlBody,
colWidths = self.tabWidBody )
self.flowables.append(tabMais)
self.flowables.append(self.spaceBody)
pass

def build(self):
self.doc.build(flowables=self.flowables)
pass
--
======================================================
Arso - Italy Gentoo 2004-02 Stage 1
Armada e500
======================================================
Claudio
2007-03-21 10:02:54 UTC
Permalink
On Tue, 20 Mar 2007 23:10:11 GMT, Arso - Italy
<***@non.ce> wrote:

La stampa mi funziona già, anche se devo migliorare il
ridimensionamento testo per adattarlo allo spazio. (In questo momento
ha un funzionamento "Spannometrico" con la tendenza a scrivere più
piccolo del necessario. Questa sera ad ogni modo esamio il tuo codice
per vedere se posso attingere a qualche "tips" utile. Anzi domani,
stasera ho un impegno.
PS. (per ragioni di tempo sono un programmatore della domenica.)
Post by Arso - Italy
Ti posto un acrocchio che ho fatto e che stampa una lista di mail ricevute.
Con i flowables c'è l'adattamento automatico della cella delle tabelle
alla quantità di testo presente.
Quanche volta con mi deborda su alcune celle, ma generalmente funziona
egregiamente.
Spero che ti possa servire e che non sia scritto troppo da schifo per
essere capito.
Loading...