PDF fájlok létrehozása sablonokból Python és Google szkriptek segítségével

gyakran hasznos PDF fájlokat készíteni a Python szkriptekből. Függetlenül attól, hogy számlákat, leveleket, jelentéseket vagy bármilyen más dokumentumot hoz létre, amelyek sok formázási ismétlést tartalmaznak, de csak egy kis dinamikus tartalmat tartalmaznak, néhány automatizálás hozzáadásával sok órát takaríthat meg.

van néhány lehetőség erre. A szokásosak a következők:

  1. használjon olyan PDF könyvtárat, mint a reportlab, PDF fájlok közvetlen létrehozásához (pl. https://www.blog.pythonlibrary.org/2010/03/08/a-simple-step-by-step-reportlab-tutorial/)
  2. használjon olyan HTML sablonkönyvtárat, mint a Jinja2, és konvertáljon HTML-ből PDF-be (pl. lásd http://pbpython.com/pdf-reports.html)
  3. használjon harmadik féltől származó API-t, például https://pdfgeneratorapi.com/.

az 1.lehetőségnél a PDF-fájlok közvetlenül a Python belsejéből történő létrehozása nagyon megnehezítheti a formázást. Meg kell rajzolni mindent, amire szüksége van elemenként, kód használatával, és még akkor is, ha van egy sablon, amely a kívánt módon néz ki, nehéz fenntartani.

a 2.opció gyakran jobban működik, de még mindig meg kell építeni a Jinja HTML kazánt, és néha a HTML-ből PDF-be konvertálás nem jön ki egészen a várt módon.

a 3.opció megköveteli, hogy a sablont először egy online szolgáltatás webes felületével készítse el. Bár kapsz egy drag-and-drop felületet, elég nehézkes és nehéz a sablont úgy kinézni, ahogy akarod. Általában a Szolgáltatás igénybevételéért is fizetnie kell.

bár a fenti lehetőségek egyike működhet az Ön számára, ha egyik sem tetszik, akkor a Google Drive-on alapuló dokumentumgeneráló API-t is feltörheti. Ingyenes API-t kap, és a Google Dokumentumokat használhatja sablonkészítő eszközként, amely meglehetősen hatékony, és számos már létező sablonnal rendelkezik olyan dolgokhoz, mint a számlák, levelek és önéletrajzok.

Egy online számlasablonnal kezdtem. Ez így néz ki:

Google Dokumentumok Számlasablonja

ebben az oktatóanyagban egy olyan API létrehozását mutatjuk be, amely ezeket a számlákat generálja, és lehetővé teszi a számlaszám programozott beszúrását egy külső Python szkriptből. A valóságban ugyanezt kell tennie sok más területen is, de demonstrációs okokból egy egyszerű példával kezdjük.

néhány sornyi Google App Script kódot és néhány sor Python kódot fogunk írni.

sablondokumentum létrehozása

használja a beépített Google dokumentumsablonok egyikét, keressen online olyanra, amely megfelel az Ön igényeinek, vagy készítse el sajátját docs.google.com. (szüksége lesz egy Google-Fiókra).

adjon hozzá helyőrzőket, ahol dinamikus információkra van szüksége. Az alábbi példában hozzáadtam a {invoice_id} számú számlát az eredeti dokumentumon szereplő “456” azonosító helyett. Nincs semmi különös ebben a szintaxisban – később egy alapvető keresési és csere funkciót fogunk használni, hogy ezt kicseréljük a valódi információkra, ezért használjon valamit, ami valószínűleg nem jelenik meg a végleges dokumentumban.

jegyezze fel a dokumentum azonosítóját, amely az URL-sáv kiemelt része.

számlasablon helyőrzővel

egyéni Google szkript beállítása

lépjen a Google Drive-ra, nyomja meg az “új” gombot a bal felső sarokban. A “több” alatt válassza a “Google Apps Script” lehetőséget, ha elérhető, vagy a “További alkalmazások csatlakoztatása” lehetőséget, ha nem látja.

További alkalmazások csatlakoztatása

keresse meg az “apps script” kifejezést, és válassza ki a csatlakoztatást. Előfordulhat, hogy néhány figyelmeztető üzenet megkérdezi, hogy megbízik-e magában. Mondd, hogy igen.

Alkalmazások Parancsfájl hozzáadása

Miután létrehozott egy új alkalmazás szkriptet, megjelenik egy alapértelmezett üres parancsfájl, amely a következőképpen néz ki.

üres Google Apps Script

törölje az ott látható kódot, és cserélje ki egy createDocument funkcióval, amely a következőképpen néz ki.

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";}

a 2.sorban kapcsolja ki a TEMPLATE_ID értéket a dokumentumazonosítóval, amelyet a sablonos Google Doc URL-sávjából másolt.

ez a kód megkeresi a sablonos dokumentumot, létrehoz egy másolatot, és beállítja a fájl nevét “számla” Plusz bármi invoice_id amit átadunk. Ezután megnyitja az új fájlt a DocumentApp-on keresztül (a Drive alkalmazás helyett, hogy valóban megszerezhessük a fájl tartalmát és szerkeszthessük őket). Megkeresi a doc-ban a hozzáadott helyőrzőt ({invoice_id}), és lecseréli azt a tényleges invoice_id – re, amelyet a függvény bemenetként vesz fel. Ezután beállítja, hogy a dokumentum nyilvánosan hozzáférhető legyen, és visszaad egy URL-t, amely közvetlenül a dokumentum PDF-exportálásához vezet.

e funkció alatt adjon hozzá egy másik doGet nevű funkciót. Míg az előző függvény bármi megnevezhető, a doGetegy speciális funkció a Google Apps szkriptekben, ezért pontosan meg kell neveznie doGet. Ez a funkció kezeli a bejövő webes kéréseket, miután telepítettük alkalmazásunkat.

a doGet függvény kódja a következő. Illessze be ezt az előző createDocument() függvény alá.

function doGet(e) { var invoice_id = e.parameter.invoice_id; var url = createDocument(invoice_id); return ContentService.createTextOutput(url);}

ez az invoice_id-t veszi fel URL-paraméterként, ezt továbbítja az imént írt createDocument függvényünknek, és sima szövegként adja vissza a létrehozott dokumentum URL-jét.

API közzététele

a” közzététel “menüben válassza a” telepítés webalkalmazásként “lehetőséget”

telepítés webalkalmazásként

meg kell adnia a projekt nevét. Adj neki egy nevet, mint a “PDF API”, vagy bármi mást, amit akarsz.

a projekt elnevezése

egy új menü jelenik meg a webalkalmazás telepítésének beállításaihoz.

Deploy options

adjon hozzá egy “initial deploy” üzenethez hasonló üzenetet, ahol az “új” felirat szerepel, és válassza a “bárki, még névtelen” lehetőséget a hozzáférési beállítások közül. Hagyja a végrehajtási beállításokat “én”néven.

figyelem: ha nyilvános helyen osztja meg a linket, az emberek visszaélhetnek a szolgáltatással, és automatikus kérésekkel spamelhetik azt. Ha ez megtörténik, a Google zárolhatja fiókját visszaélés miatt, ezért tartsa biztonságban a linket.

nyomja meg a Telepítés gombot, és jegyezze fel a következő felugró ablakban látható URL-t.

 az alkalmazás URL-je

Add “?invoice_id=1 ” az URL végére, és keresse fel a böngészőben. Úgy kell kinéznie, mint

https://script.google.com/macros/s/AKfycbxDiKpTGqMijZmU8-0cPj06DBFjDOPYZJ9IFvhcO111GCh8jqxC/exec?invoice_id=1

ha minden jól ment,akkor megjelenik egy Google Dokumentumok link.

webes alkalmazásunk válasza

ha meglátogatja az URL-t, töltse le a számla PDF-jét a 1 – val kikapcsolt helyőrzővel.

az alkalmazás frissítése

ha ehelyett hibát lát, vagy nem kap választ, akkor valószínűleg hibát követett el a kódban. Módosíthatja és frissítheti a telepítést ugyanúgy, ahogy eredetileg telepítette. A frissítési képernyő csak kissé különbözik a telepítés képernyőtől.

frissítési telepítési lehetőségek

az egyetlen trükkös dolog az, hogy minden változtatáshoz ki kell választania az “új” verziót. Ha módosítja a kódot, és frissít egy korábbi verziót, a módosítások nem lépnek hatályba, ami nem nyilvánvaló a felhasználói felületről. (Láthatjátok, hogy néhány próbálkozás kellett ahhoz, hogy ez helyes legyen.).

számláink létrehozása Pythonból

mostantól számlákat hozhatunk létre, és helyben menthetjük őket egy Python szkriptből. A következő kód bemutatja, hogyan lehet három számlát létrehozni egy for ciklusban.

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)

vegye figyelembe, hogy a létrehozási és letöltési folyamat meglehetősen lassú, ezért minden egyes létrehozott számla néhány másodpercet vesz igénybe.

valószínűleg észrevette, hogy ez elég “hacky” megoldás PDF fájlok létrehozására a Python belsejéből. A “csere” funkció meglehetősen korlátozott a megfelelő sablonnyelvhez képest, és az adatok továbbítása a get kérésen keresztül is korlátozott. Ha átmegy valami bonyolultabb, mint egy számla ID, akkor URL kódolni az adatokat először. Ezt Pythonban a urllib.parse modul segítségével teheti meg. Példa a Python szkript módosítására a bonyolultabb adatok kezelésére a következő.

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)

de még mindig vannak korlátozások arra vonatkozóan, hogy milyen adatokat és mennyit adhat át csak az URL-ek használatával, ezért módosítania kell a szkriptet a POST kérések használatához, ha sok dinamikus adatot küld.

az elején tárgyalt más módszerekhez képest is meglehetősen lassú, és a Google korlátozza, hogy hány fájlt hozhat létre automatikusan ilyen módon.

ennek ellenére a sablonok létrehozása A Google Dokumentumok segítségével gyors és hatékony lehet, ezért magának kell értékelnie a kompromisszumokat.

azt is vegye figyelembe, hogy ez egy meglehetősen kitalált példa, ahol futtathattuk volna a Python szkriptet a Google ökoszisztémáján belül, és elkerülhettük volna egy nyilvános API beállítását, amely potenciálisan visszaélhet, ha mások felfedezik az URL-t. Előfordulhat azonban, hogy van egy meglévő, nem a Google-on tárolt Python-alkalmazás, amelyhez kapcsolódnia kell az automatikusan generált PDF-fájlokhoz, és ez a módszer továbbra is lehetővé teszi egy önálló “mikroszolgáltatás” beállítását a Google ökoszisztémáján belül, amely lehetővé teszi a PDF egyszerű generálását.

következtetés