![Page 1: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/1.jpg)
Stampe HTML e PDFvelocemente e usando solo Python
![Page 2: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/2.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Chi sono
• [email protected] • Sviluppatore del framework Genropy • Sviluppatore di gestionali in Genropy • Nerd e giocatore incallito • Strimpellatore di ukulele • Papà
![Page 3: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/3.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Di cosa vi parlerò
• La problematica delle stampe • Come l’ abbiamo affrontata noi di Genropy • La libreria gnrhtml • Esempi pratici di utilizzo di gnrhtml • Integrazione con l'adapter sql Genropy • Strumenti più evoluti in Genropy • Utilizzo di gnrhtml da django
![Page 4: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/4.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Oh no! Le stampe...
• Noiose e laboriose • Codice su misura e scarsamente riutilizzabile • Difficile separazione tra grafica e dati • Problemi nel passaggio da schermo a carta
• Dati variabili in spazi fissi • Salti pagina, margini, dimensioni in millimetri
![Page 5: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/5.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Tipi di stampa
• Lettere, documenti testuali • Grafici, elementi geometrici vettoriali • Griglie con testata, righe e colonne • Moduli complessi e annidati
![Page 6: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/6.jpg)
Printforce Australia Pty Ltd
ABN 43 009 354 643
PO Box 6386
EAST PERTH WA 6892
Ph: 08 9223 2400
Fax: 08 9223 2402 (Accounts)
Email: [email protected]
Account
Professionals Edge Hill
PO Box 635
EDGE HILL QLD 4870
Invoice Nr.
P16069533
Invoice date
29/06/16
Page
1/1
Doc type
Tax invoice
Account Number
003642
ABN
85053524931
Deliver to
120 Collins Avenue EDGE HILL QLD 4870
Job/Online Nr. Description Qty Total
P16N059669.004
250000402701
Total Magnet Calendar DL
BRIAN KOVACS- STYLE E FINANCIAL YEAR JUN-JUL 2017
Extras
Gloss Lam 1 Side 210x96
1,000 690.00
P16N059669.003
250000402501
Total Magnet Calendar DL
LEVEAUX GARTNER - STYLE E FINANCIAL YEAR JUN-JUL 2017
Extras
Gloss Lam 1 Side 210x96
3,000 1,570.00
P16N059669.002
250000402401
Total Magnet Calendar DL
RAY DILLON - STYLE E FINANCIAL YEAR JUN-JUL 2017
Extras
Gloss Lam 1 Side 210x96
2,000 1,130.00
P16N059669.001
250000401301
Total Magnet Calendar DL
BILLY GARTNER - STYLE E FINANCIAL YEAR JUN-JUL 2017
Extras
Gloss Lam 1 Side 210x96
2,000 1,130.00
TERMS OF TRADE, Net 30 days from date of Invoice. All
claims for non delivery or damaged goods must be made in writing
to us within 14 days of the date of this invoice.
Products net
4,109.09
Freight net
0.00
Total net
4,109.09
Total GST
410.91
Total
4,520.00
If you have already made payment, please accept our thanks and retain this invoice for your records Printed on: 29/06/16 3:26 PM
![Page 7: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/7.jpg)
Group
IN
Client code
055082
Date in
29/2/16
Print Loc Div.
P
Year
16
Mode
N
Order
000116Job
001Press Check Production Nr
16000006Deliver by
Client infoCompany
TEST ACCOUNT - See Claire TurtonState
WA
Suburb
EAST PERTH
Post code
6892
Street
PO Box 6386
Phone
08 92232400
Fax
08 92232402
Contact
Dr Evil Badman - Accounts Receivable Offic ()
Email 2
Job alert
TEST ACCOUNT SEE CLAIRE TURTON [email protected]
0434 560646
Input infoEntered by
Claire Turton
Ext
3 205
Mobile
043 4560646
Assigned to
Claire Turton
Ext
3 205
Mobile
043 4560646
Office
Printforce Preston
Product infoProduct code
P.AA.SI.64.006Sides
1C.fr
4C.ba
0C.in
0Quantity
50Product title
6x4 Signboard VIC - Squareline SB35
Size
6x4
Product stock
Single Board
Inventory
No
Paperstock Sample encl.
No
Product details
Base Price
155.54
Extra Price
0.00
Freight
0.00
Total
155.54
Comment
0 - (date) date: 2016-02-22
1 - (unicode) method: Leave to the discretion of the installer
<_valuelabel='Intstallation Method'>
2 - (unicode) instruct: additional instructions
<_valuelabel='Additional Instructions'>
3 - (unicode) xstreet: x street field <_valuelabel='Nearest X
Street'>
Job extras Price Days
Code Destination Del Nr. DT Qty
055082.01TEST ACCOUNT - See Claire Turton: 84 Wellington Street EAST PERTH WA 6004
Phone:03 12345678D16000180 50
Run Number
Web Job Ref.
123456
Original Job
Source
2017-03-24T20:14:58.253365+01:00
![Page 8: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/8.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
gnrhtml: le idee chiave
• Generare un html e da lì un pdf • Stesso codice doppio output • Cambiare la grafica toccando solo stylesheet css • Esiste wkhtmltopdf!
• Produrre un html “quotato” • Definendo elementi logici intuitivi e ricorrenti • Usando chiamate funzionali
![Page 9: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/9.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Un HTML quotato?
<div style="right:0mm;bottom:0mm;top:5mm;border-width:0.3mm;height:280mm;width:200mm;border:5;left:5mm;">
<div style="position:absolute;top:0mm;height:29.7mm;">
<div style="width:79.7mm;top:0mm;left:0mm;height:29.7mm;" class="gnrlayout l1_layout x_br">
<div style="" class="content_base">TOP left</div>
</div>
<div style="width:79.7mm;top:0mm;left:80mm;height:29.7mm;" class="gnrlayout l1_layout x_br">
<div style="" class="content_base">Top center</div>
</div>
<div style="width:40mm;top:0mm;left:160mm;height:29.7mm;" class="gnrlayout l1_layout x_b">
<div style="" class="content_base">TOP right</div>
</div>
</div>
</div>
![Page 10: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/10.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Un HTML quotato?
• Ogni elemento ha dimensioni e posizioni fisse • Espresse in millimetri • Lo sviluppatore fornisce solo alcune misure fisse • La logica di rendering calcola
• Tutte le dimensioni rimanenti per differenza • E le posizioni assolute di tutti gli elementi
![Page 11: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/11.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
gnrhtml.GnrHtmlBuilder
from gnr.core.gnrhtml import GnrHtmlBuilder
def myprint(body):
pass
if __name__ == ‘__main__’:
builder = GnrHtmlBuilder()
builder.initializeSrc()
builder.styleForLayout()
myprint(builder.body)
builder.toHtml('myprint.html')
builder.toPdf(‘myprint.pdf’)
![Page 12: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/12.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Gli elementi a disposizione
• Non solo quelli corrispondenti a tutti tag HTML • div, style, img, span, link e tutti gli altri
• Ma soprattutto... layout, row, cell
![Page 13: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/13.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
layout, row e cell
• layout è un contenitore rettangolare di row • Una row contiene elementi cell affiancati • Ciascuno dei quali può contenere a sua volta… • un layout annidato • E così via all'infinito ;-)
![Page 14: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/14.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
layout, row, cell
![Page 15: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/15.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
layout, row, cell
• Alla fine sono tutti div • Che quali posso applicare stili e classi CSS
![Page 16: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/16.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Layout
from gnr.core.gnrhtml import GnrHtmlBuilder
def myprint(body):
mylayout = body.layout(height=280, width=200,
top=5,left=5,
border_width=0.3,
border_color=‘red’,
border_style=‘solid’)
![Page 17: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/17.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Layout: i parametri
• width, height : misure• top, left: posizionamento rispetto al foglio • um: unità di misura • border_ (width, color, style): tratto dei bordi • lbl_ (class, height): relativi a tutte alle etichette • content_class : classe css per tutti i testi interni
![Page 18: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/18.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
row
• “spaziatore” che serve a dividere il layout in righe • di altezza prefissata se specificato height • o altezza "elastica" ovvero calcolata • Può ridefinire alcuni parametri di layout
• lbl_class • lbl_height • content_class
![Page 19: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/19.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
row
from gnr.core.gnrhtml import GnrHtmlBuilder
def myprint(body):
mylayout = body.layout(height=280, width=200,
top=5,left=5, border_width=0.3,
border_color=‘red’,border_style=‘solid’)
r_first= mylayout.row(height=30)
![Page 20: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/20.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
cell
• L'unico elemento originale con contenuto • Può avere un’etichetta descrittiva del contenuto • Si può specificare larghezza fissa • Oppure calcolata per differenza
![Page 21: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/21.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
cell
from gnr.core.gnrhtml import GnrHtmlBuilder
def myprint(body):
mylayout = body.layout(height=280, width=200,
top=5,left=5, border_width=0.3,
border_color=‘red’,border_style=‘solid’)
r_first= mylayout.row(height=30)
left_cell = r_first.cell(content=‘Left!’, width=23)
right_cell = r_first.cell(content=‘Right!’)
![Page 22: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/22.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Giochiamoci un po’
![Page 23: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/23.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Ancora più pigri…
• Nell’ambiente GenroPy ci sono API più potenti • la classe TableScriptToHtml • integrata con l’adapter sql genropy • integrata con la web application • risorsa definita a livello di table • Gestione dimensioni pagina, salti pagina,
intestazioni, margini
![Page 24: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/24.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
TableScriptToHtml
from gnr.web.gnrbaseclasses import TableScriptToHtml
class Main(TableScriptToHtml):
templates='quotation'
maintable = 'pfrc.quotation'
rows_path = 'record.@rows'
doc_header_height = 33
doc_footer_height = 9
title_height=8
sub_headers_height=4
sub_row_height=5
space_between_rows=8
![Page 25: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/25.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
E poi implementa questi
• mainLayout • gridLayout • prepareRow • docHeader, pageHeader, docFooter, pageFooter • defineCustomStyles • calc….Height
![Page 26: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/26.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
![Page 27: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/27.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Vantaggi
• il metodo field • il metodo rowData • Il lanciatore di stampa integrato nella GUI • Integrazione con il sistema di carte intestate • Salti pagina automatici
![Page 28: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/28.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Un utilizzo da Django
• Creo un modulo che importa gnrhtml • Definisco i metodi di stampa • Li imposto come actions di una table
![Page 29: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/29.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Un utilizzo da Django
from gnr.core.gnrhtml import GnrHtmlBuilder
from django.http import FileResponse
def gnrhtmlbuilder():
builder = GnrHtmlBuilder(page_height=297, page_width=21)
builder.initializeSrc()
builder.styleForLayout()
return builder
![Page 30: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/30.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
La action Django
def print_questions(modeladmin, request, queryset):
builder = gnrhtmlbuilder()
l = builder.body.layout(…)
headers = l.row(height=6, content_class='headers')
headers.cell('Pub.Date', width=28)
headers.cell('Question')
headers.cell('Status', width=28)
for x in queryset:
r = l.row(height=8)
r.cell(str(x.pub_date.date()), width=28)
r.cell(x.question_text)
approved = 'Approved' if x.approved else 'Not yet'
r.cell(approved, width=28)
path = '/Users/saverioporcari/esempi_stampa/questions_django.html'
builder.toHtml(path)
response= FileResponse(open(path, 'rb'))
response['Content-Disposition'] = 'attachment; filename=questions.html'
return response
![Page 31: Stampe HTML e PDF - Pycon Italia fileSaverio Porcari - Stampe HTML e PDF, velocemente con Python Chi sono • saverio.porcari@softwell.it • Sviluppatore del framework Genropy •](https://reader031.vdocuments.pub/reader031/viewer/2022021621/5c6b840609d3f287198ba6b7/html5/thumbnails/31.jpg)
Saverio Porcari - Stampe HTML e PDF, velocemente con Python
Domande?