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:

  1. 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/)
  2. 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)
  3. 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:

șablon factură Google Docs

î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.

șablon de factură cu substituent

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.

conectarea mai multor aplicații

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.

adăugarea scriptului de aplicații

după ce puteți crea un nou Script de aplicație, veți vedea un script gol implicit care arată după cum urmează.

gol Google Apps Script

ș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”

implementați 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.

Denumirea proiectului

veți vedea un nou meniu pentru a seta opțiunile pentru implementarea aplicației web.

Opțiuni de implementare

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.

URL-ul aplicației

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.

răspuns din aplicația noastră web

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.

actualizați opțiunile 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.

concluzie