{"id":21,"date":"2012-04-16T07:33:00","date_gmt":"2012-04-16T07:33:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=21"},"modified":"2012-04-16T07:33:00","modified_gmt":"2012-04-16T07:33:00","slug":"reportlab-creare-pdf-con-python","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/reportlab-creare-pdf-con-python\/","title":{"rendered":"ReportLab: Creare PDF con Python"},"content":{"rendered":"<div>Ritorniamo un po&#8217; a parlare di quello che pi\u00f9 ci piace fare di pi\u00f9: sviluppare software!\u00a0<\/div>\n<div>Tempo fa ero alla ricerca di un ottimo metodo che mi permettesse di stampare etichette per un processo industriale. La scelta ricadde su Python per una serie di motivi particolari legati al sistema in uso su le macchine presenti in loco. Ora il dilemma era scegliere la libreria migliore per generare dei PDF da inviare alle macchine di stampa. Scriverne una nuova sarebbe stata un&#8217;enorme perdita di tempo e visto che, fortunatamente, viviamo in un mondo costellato di ottimi progetti Open Source, dove \u00e8 possibile trovare sempre quello che fa al caso proprio, mi sono messo alla ricerca di qualcosa che mi aiutasse in questa problematica. Nelle ricerche effettuate mi sono imbattuto in numerosi progetti interessanti ma uno in particolare pare essere completo ed altamente funzionante: la libreria pdfgen di <a href=\"http:\/\/www.reportlab.com\/software\/opensource\/\" target=\"_blank\">reportlab<\/a>. Esistono due versione della stessa libreria, quella base e quella plus. Per i nostri scopi quella pi\u00f9 semplice va benissimo ed \u00e8 anche quella che troveremo nei nostri repository.<\/div>\n<div><\/div>\n<div>Per iniziare ad utilizzare pdfgen dobbiamo prima installare il necessario. Baster\u00e0 recarsi nel proprio gestore di pacchetti ed installare python-reportlab o digitare nel terminale (per sistemi debian.based):<\/div>\n<p><i># apt-get install python-reportlab<\/i><\/p>\n<div>A questo punto possiamo includere la libreria nei nostri sorgenti python con:<\/div>\n<div><\/div>\n<div><i>import reportlab.pdfgen<\/i><\/div>\n<div><\/div>\n<div>Analizziamo ora un semplice script per vedere il funzionamento di questo strumento:<\/div>\n<div><\/div>\n<div><i>&#8212;&#8211; Python &#8212;&#8211;<\/i><\/div>\n<div><i>#!\/usr\/bin\/env python<\/p>\n<p>from reportlab.pdfgen import canvas <span>(1) <\/span><br \/>from datetime import datetime<\/p>\n<p>mio_pdf = canvas.Canvas(&#8216;mio.pdf&#8217;) <span>(2)<\/span><br \/># &#8212;&#8211; imposta le dimensioni a 7.2 x 2.3 cm<br \/>mio_pdf.setPageSize((204.0944882400, 65.1968504100)) <span>(3)<\/span><\/i><\/div>\n<div><i># &#8212;&#8211; scrive la data di oggi nel pdf<br \/>mio_pdf.drawString(0,54,str(datetime.today()))<span> (4)<\/span><\/i><\/div>\n<div><i># &#8212;&#8211; genera e salva il pdf<br \/>mio_pdf.showPage() <span>(5)<\/span><br \/>mio_pdfp.save() <span>(6)<\/span><\/i><\/div>\n<div><i>&#8212;&#8212;&#8212;-<\/i><\/div>\n<div><\/div>\n<div>Come si vede il codice \u00e8 molto semplice ma molto potente. Analizziamolo passo per passo anche se i commenti dovrebbero essere di per s\u00e8 molto chiari. Partendo dal primo rigo di codice utile, si importa semplicemente la funzione canvas dalla libreria (1). Tale funzione \u00e8 quella che si occupa di &#8220;disegnare&#8221; il documento ed il suo contenuto. Sar\u00e0 la funzione che pi\u00f9 utilizzerete nel vostro codice e perci\u00f2 vi conviene studiarla per bene. Successivamente (2) viene generato il contenitore per i nostri dati e si definiscono le dimensioni in punti (3). Al suo interno poi si definiscono le coordinate in stile cartesiano (a partire dal punto in basso a sinistra che rappresenta lo 0,0) in cui inserire il nostro contenuto. Qui (4) si \u00e8 scelto di stampare la data di oggi in un punto indicativamente in alto a sinistra. Infine (5) si genera il PDF con tutto ci\u00f2 che \u00e8 stato creato e lo si salva (6) nella path in cui viene eseguito il nostro script.<\/div>\n<div><\/div>\n<div>La libreria \u00e8 molto potente e permette di definire numerosissimi valori per generare al meglio il nostro documento secondo le nostre esigenze. Per la <a href=\"http:\/\/www.reportlab.com\/apis\/reportlab\/dev\/pdfgen.html\" target=\"_blank\">documentazione completa<\/a> vi rimando al sito ufficiale che risulta essere completo ed esaustivo nella maggior parte dei casi.\u00a0<\/div>\n<div><\/div>\n<div>Per ogni dubbio non esitate ad utilizzare i commenti. Cercher\u00f2 di aiutarvi.<\/div>\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ritorniamo un po&#8217; a parlare di quello che pi\u00f9 ci piace fare di pi\u00f9: sviluppare software!\u00a0 Tempo fa ero alla ricerca di un ottimo metodo che mi permettesse di stampare etichette per un processo industriale. La scelta ricadde su Python per una serie di motivi particolari legati al sistema in uso su le macchine presenti [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-opencode","category-python"],"views":9871,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}