creați fișiere PDF din șabloane cu scripturi Python și Google
adesea, este util să creați fișiere PDF din scripturile Python. Indiferent dacă creați facturi, scrisori, rapoarte sau orice alte documente care conțin o mulțime de repetări de formatare, dar doar un pic de conținut dinamic, adăugarea unor automatizări vă poate economisi multe ore.
aveți câteva opțiuni pentru acest lucru. Cele obișnuite sunt:
- utilizați o bibliotecă PDF ca reportlab pentru a genera fișiere PDF direct (de ex. https://www.blog.pythonlibrary.org/2010/03/08/a-simple-step-by-step-reportlab-tutorial/)
- utilizați o bibliotecă templating HTML ca Jinja2 și de a converti de la HTML la PDF (de exemplu, a se vedea http://pbpython.com/pdf-reports.html)
- utilizați un API terță parte, cum ar fi https://pdfgeneratorapi.com/.
pentru opțiunea 1, generarea de PDF-uri direct din interiorul Python poate face formatarea foarte dificilă. Trebuie să desenați orice aveți nevoie element cu element, folosind cod și chiar și odată ce aveți un șablon care arată așa cum doriți, este dificil de întreținut.
Opțiunea 2 poate funcționa adesea mai bine, dar tot trebuie să construiți placa de gătit Jinja HTML și, uneori, conversia HTML în PDF nu iese așa cum vă așteptați.
Opțiunea 3 necesită să construiți șablonul mai întâi utilizând interfața web a unui serviciu online. Deși obțineți o interfață drag-and-drop, este destul de greoi și dificil să faceți șablonul să arate așa cum doriți. De obicei, trebuie să plătiți și pentru a utiliza serviciul.
în timp ce una dintre opțiunile de mai sus poate funcționa pentru dvs., dacă nu vă place niciuna dintre ele, puteți hack împreună un API de generare a documentelor bazat pe Google Drive. Veți obține un API gratuit și veți putea utiliza Google Docs ca instrument de templatare, care este destul de puternic și are multe șabloane preexistente pentru lucruri precum facturi, scrisori și CV-uri.
am început cu un șablon de factură pe care l-am găsit online. Se pare ca acest lucru:
în acest tutorial, vom parcurge crearea unui API care generează aceste facturi și vă permite să introduceți programatic numărul facturii dintr-un script Python extern. În realitate, ar trebui să faceți același lucru pentru multe alte domenii, dar vom începe cu un exemplu simplu din motive demonstrative.
vom scrie câteva rânduri de cod Script Google App și câteva rânduri de cod Python.
crearea unui document șablon
utilizați unul dintre șabloanele de Documente Google încorporate, căutați online unul care se potrivește nevoilor dvs. sau creați – vă propriul Peste la docs.google.com. (veți avea nevoie de un Cont Google).
adăugați substituenți în cazul în care aveți nevoie de informații dinamice. În exemplul de mai jos, am adăugat factura nr {invoice_id}
în locul id-ului „456” pe care l-am avut pe documentul original. Nu este nimic special în această sintaxă – vom folosi mai târziu o funcție de căutare și înlocuire de bază pentru a schimba acest lucru cu informațiile reale, deci folosiți ceva care este puțin probabil să apară în documentul final.
notați id-ul documentului, care este partea evidențiată în bara URL.
Configurarea unui Script Google personalizat
accesați Google Drive, apăsați „nou” în colțul din stânga sus. Sub” mai multe”, selectați” Script Google Apps „dacă este disponibil sau” conectați mai multe aplicații ” dacă nu îl vedeți.
căutați „apps script” și alegeți să îl conectați. S-ar putea să vedeți câteva mesaje de avertizare care vă întreabă dacă aveți încredere în voi înșivă. Spune că știi.
după ce puteți crea un nou Script de aplicație, veți vedea un script gol implicit care arată după cum urmează.
ștergeți codul pe care îl vedeți acolo și înlocuiți-l cu o funcție createDocument
care arată după cum urmează.
function createDocument(invoice_id) { var TEMPLATE_ID = '1Ybq8r_SiWu4Z4-_Z6S0IW1L8FJywfpjPAATPCvvkKk8'; var documentId = DriveApp.getFileById(TEMPLATE_ID).makeCopy().getId(); drivedoc = DriveApp.getFileById(documentId); drivedoc.setName("Invoice " + invoice_id); doc = DocumentApp.openById(documentId); var body = doc.getBody(); body.replaceText('{invoice_id}', invoice_id); drivedoc.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.EDIT); return "https://docs.google.com/document/d/" + documentId + "/export?format=pdf";}
pe linia 2, Comutați TEMPLATE_ID
cu ID-ul documentului pe care l-ați copiat din bara URL din documentul Google templated.
acest cod găsește documentul șablon, creează o copie a acestuia și setează numele fișierului la „factură” plus orice invoice_id
trecem. Apoi deschide noul fișier prin DocumentApp (în loc de aplicația Drive, astfel încât să putem obține conținutul fișierului și să le edităm). Acesta caută doc pentru substituent am adăugat ({invoice_id}
) și îl înlocuiește cu Real invoice_id
că funcția ia ca intrare. Apoi setează documentul să fie accesibil publicului și returnează o adresă URL care va merge direct la un export PDF pentru acel document.
sub această funcție, adăugați o altă funcție numită doGet
. În timp ce funcția anterioară poate fi numită orice, doGet
este o funcție specială în scripturile Google Apps, deci va trebui să o denumiți exact doGet
. Această funcție se va ocupa de cererile web primite după ce am implementat aplicația noastră.
codul pentru funcția doGet
este următorul. Lipiți acest lucru sub funcția anterioară createDocument()
.
function doGet(e) { var invoice_id = e.parameter.invoice_id; var url = createDocument(invoice_id); return ContentService.createTextOutput(url);}
aceasta preia invoice_id ca parametru URL, transmite acest lucru funcției noastre createDocument
pe care tocmai am scris-o și returnează adresa URL a documentului creat ca text simplu.
publicarea API-ului nostru
din meniul” publicare”, selectați „implementare ca aplicație web”
vi se va cere să denumiți proiectul. Dați-i un nume precum „PDF API” sau orice altceva doriți.
veți vedea un nou meniu pentru a seta opțiunile pentru implementarea aplicației web.
adăugați un mesaj de genul „implementare inițială” sub unde scrie „nou” și alegeți „oricine, chiar anonim” din setările de acces. Lăsați setările de execuție ca „eu”.
avertisment: dacă partajați linkul într-un loc public, oamenii pot abuza de serviciu și îl pot trimite spam cu solicitări automate. Google vă poate bloca contul pentru abuz dacă se întâmplă acest lucru, deci păstrați linkul în siguranță.
apăsați butonul Deploy și notați adresa URL pe care o vedeți în următoarea fereastră pop-up.
adauga „?invoice_id = 1″până la sfârșitul adresei URL și vizitați-o în browserul dvs. Ar trebui să arate ceva de genul
https://script.google.com/macros/s/AKfycbxDiKpTGqMijZmU8-0cPj06DBFjDOPYZJ9IFvhcO111GCh8jqxC/exec?invoice_id=1
dacă totul a mers bine, ar trebui să vedeți afișat un link Google Docs.
dacă vizitați adresa URL, trebuie descărcat un PDF al facturii cu substituentul dezactivat cu 1
.
actualizarea aplicației
dacă vedeți o eroare în schimb sau nu primiți un răspuns, probabil că ați făcut o greșeală în cod. Puteți să o modificați și să actualizați implementarea în același mod în care ați implementat-o inițial. Ecranul de actualizare este doar puțin diferit de ecranul de implementare.
singurul lucru dificil este că trebuie să selectați „Nou” ca versiune pentru fiecare modificare pe care o faceți. Dacă efectuați modificări la cod și actualizați o versiune anterioară, modificările nu vor intra în vigoare, ceea ce nu este evident din interfața de utilizare. (Puteți vedea că mi-a luat câteva încercări pentru a obține acest drept.).
crearea facturilor noastre din Python
acum putem crea facturi și le putem salva local dintr-un script Python. Următorul cod arată cum se generează trei facturi într-o buclă for
.
import requestsurl = "https://script.google.com/macros/s/AKfycbyYL5jhEstkuzZAmZjo0dUIyAmzUc1XL5B-01fHRHx8h63cieXc/exec?invoice_id={}"invoice_ids = for invoice_id in invoice_ids: print("processing ", invoice_id) response = requests.get(url.format(invoice_id)) print("file generated") response = requests.get(response.content) print("file downloaded") with open("invoice{}.pdf".format(invoice_id), "wb") as f: f.write(response.content)
rețineți că procesul de creare și descărcare este destul de lent, deci va dura câteva secunde pentru fiecare factură pe care o creați.
probabil ați observat că aceasta este o soluție destul de „hacky” pentru a genera fișiere PDF din interiorul Python. Funcționalitatea „înlocuire” este destul de limitată în comparație cu un limbaj de templare adecvat, iar transmiterea datelor printr-o solicitare get are, de asemenea, limitări. Dacă treceți prin ceva mai complicat decât un ID de factură, veți codifica mai întâi datele URL. Puteți face acest lucru în Python folosind modulul urllib.parse
. Un exemplu de modificare a scriptului Python pentru a face față datelor mai complicate este după cum urmează.
import requestsimport urllib.parseurl = "https://script.google.com/macros/s/AKfycbyYL5jhEstkuzZAmZjo0dUIyAmzUc1XL5B-01fHRHx8h63cieXc/exec?"invoice_ids = for invoice_id in invoice_ids: print("processing ", invoice_id) payload = {"invoice_id": invoice_id} u = url + urllib.parse.urlencode(payload) response = requests.get(u) print("file generated") response = requests.get(response.content) print(response.content) print("file downloaded") with open("invoice{}.pdf".format(invoice_id), "wb") as f: f.write(response.content)
dar există încă limitări cu privire la ce fel de date și cât de mult puteți trece doar folosind adrese URL, deci va trebui să modificați scriptul pentru a utiliza cererile de postare în schimb dacă trimiteți o mulțime de date dinamice.
este, de asemenea, destul de lent în comparație cu unele dintre celelalte metode pe care le-am discutat la început, iar Google are unele limitări cu privire la câte fișiere puteți crea automat în acest fel.
acestea fiind spuse, posibilitatea de a genera șabloane folosind Google Docs poate fi rapidă și puternică, deci va trebui să evaluați compromisurile pentru dvs.
de asemenea, rețineți că acesta este un exemplu destul de inventat, în care am fi putut rula scriptul Python din cadrul ecosistemului Google și am evitat necesitatea de a configura un API public care ar putea fi abuzat dacă alte persoane ar fi descoperit adresa URL. Cu toate acestea, este posibil să aveți o aplicație Python existentă, care nu este găzduită pe Google, pe care trebuie să o conectați cu fișiere PDF generate automat, iar această metodă vă permite în continuare să configurați un „microserviciu” autonom în cadrul ecosistemului Google, care permite generarea ușoară a PDF-urilor.