vytvářejte soubory PDF ze šablon pomocí skriptů Python a Google

často je užitečné vytvářet soubory PDF ze skriptů Python. Ať už jste vytváření faktury, dopisy, zprávy nebo jiné dokumenty, které obsahují mnoho formátování opakování, ale jen trochu dynamického obsahu, přidání některé automatizace mohou ušetřit mnoho hodin.

máte k tomu několik možností. Obvyklé jsou:

  1. použijte knihovnu PDF, jako je reportlab, k přímému generování souborů PDF (např. https://www.blog.pythonlibrary.org/2010/03/08/a-simple-step-by-step-reportlab-tutorial/)
  2. Použití HTML šablon knihovna jako Jinja2 a převést z HTML do PDF (viz např. http://pbpython.com/pdf-reports.html)
  3. Pomocí API třetích stran, jako je https://pdfgeneratorapi.com/.

pro Možnost 1 může generování PDF přímo z Pythonu velmi ztěžovat formátování. Musíte nakreslit něco, co potřebujete prvek po prvku, použití kódu, a dokonce jakmile máte šablonu pohledu tak, jak chcete, je obtížné udržet.

možnost 2 může často fungovat lépe, ale stále musíte vytvořit Jinja HTML boilerplate a někdy konverze HTML do PDF nevyjde tak, jak jste očekávali.

volba 3 vyžaduje, abyste nejprve vytvořili šablonu pomocí webového rozhraní online služby. I když získáte rozhraní drag-and-drop, je docela neohrabané a obtížné vytvořit šablonu tak, jak chcete. Obvykle musíte také zaplatit za používání služby.

Když jedna z výše uvedených možností může pracovat pro vás, pokud se vám nelíbí žádné z nich, můžete také hack spolu dokumentu generace API založené na Google Drive. Budete získat zdarma API, a budete moci používat Google Docs jako svůj šablonovací nástroj, který je velmi silný a má mnoho pre-existujících šablon pro věci, jako jsou faktury, dopisy a Životopisy.

začal jsem se šablonou faktury, kterou jsem našel online. Vypadá to takto:

 šablona faktury Google Docs

v tomto tutoriálu projdeme vytvořením API, které generuje tyto faktury a umožňuje programově vložit číslo faktury z externího skriptu Python. Ve skutečnosti byste museli udělat totéž pro mnoho dalších oblastí, ale začneme jednoduchým příkladem pro demonstrační důvody.

budeme psát několik řádků kódu skriptu aplikace Google a několik řádků kódu Pythonu.

Vytvoření šablony dokumentu

Použít jednu z vestavěných Google šablony Dokumentů, vyhledávání on-line na ten, který odpovídá vašim potřebám, nebo vytvořit svůj vlastní v docs.google.com. (Budete potřebovat Účet Google).

přidejte zástupné symboly, kde potřebujete dynamické informace. V následujícím příkladu jsem přidal fakturu č. {invoice_id} místo id „456“, které jsem měl na původním dokumentu. Není nic zvláštního o této syntaxe — budeme používat základní vyhledávání a nahrazování funkce později vyměnit za skutečné informace, tak použijte něco, co je nepravděpodobné, že se skutečně objeví v závěrečném dokumentu.

poznamenejte si id dokumentu, což je zvýrazněná část v panelu URL.

šablony Faktury s zástupný symbol

Nastavení vlastního Skriptu Google

Přejít na Google Disk, stiskněte tlačítko „Nový“ v levém horním rohu. V části „Více“ vyberte „skript Google Apps“, Pokud je k dispozici, nebo „připojit více aplikací“, pokud jej nevidíte.

 připojení více aplikací

vyhledejte „apps script“ a zvolte Připojení. Možná se vám zobrazí varovné zprávy s dotazem, zda si věříte. Řekni, že ano.

 přidání skriptu aplikací

jakmile můžete vytvořit nový skript aplikace, uvidíte výchozí prázdný skript, který vypadá následovně.

prázdný skript Google Apps

odstraňte kód, který zde vidíte, a nahraďte jej funkcí createDocument, která vypadá následovně.

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

na řádku 2 Vypněte TEMPLATE_ID pomocí ID dokumentu, který jste zkopírovali z panelu URL v šablonovém Dokumentu Google.

Tento kód najde šablony doc, vytvoří kopii a nastaví název souboru na „Faktury „, plus všechny invoice_id jsme se projít. Poté otevře nový soubor prostřednictvím DocumentApp (místo aplikace Drive, abychom mohli skutečně získat obsah souboru a upravit je). Vyhledá doc pro zástupný symbol, který jsme přidali ({invoice_id}) a nahradí jej skutečným invoice_id, který Funkce bere jako vstup. Poté nastaví dokument, aby byl veřejně přístupný, a vrátí adresu URL, která půjde přímo do exportu PDF pro tento dokument.

pod tuto funkci přidejte další funkci nazvanou doGet. Zatímco předchozí funkci lze pojmenovat cokoli, doGet je speciální funkce ve skriptech Google Apps, takže ji budete muset pojmenovat přesně doGet. Tato funkce bude zpracovávat příchozí webové požadavky poté, co jsme nasadili naši aplikaci.

kód pro funkci doGet je následující. Vložte to pod předchozí funkci createDocument().

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

Toto vezme invoice_id jako parametr URL, předá to naší funkci createDocument, kterou jsme právě napsali, a vrátí adresu URL vytvořeného dokumentu jako prostý text.

Publikování naše API

Z „Publikovat“ menu, vyberte „Nasadit jako webové aplikace“

Nasadit jako webové aplikace

Budete dotázáni na název projektu. Dejte mu jméno jako „PDF API“ nebo cokoli jiného, co chcete.

 pojmenování projektu

zobrazí se nové menu pro nastavení možností nasazení webové aplikace.

Nasadit možnosti

Přidat zprávu jako „počáteční nasazení“ pod, kde se říká, „Nový“ a zvolte „Kdokoli, i anonymní“ z nastavení přístupu. Ponechte nastavení provádění jako „já“.

Upozornění: Pokud odkaz sdílíte na veřejném místě, lidé mohou službu zneužít a spamovat pomocí automatických požadavků. Google může zablokovat váš účet kvůli zneužití, pokud k tomu dojde, takže udržujte odkaz v bezpečí.

stiskněte tlačítko nasadit a poznamenejte si adresu URL, kterou uvidíte v dalším vyskakovacím okně.

 URL vaší aplikace

přidat“?invoice_id=1 “ na konec adresy URL a navštivte ji ve svém prohlížeči. Mělo by to vypadat nějak

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

pokud vše proběhlo dobře, měli byste vidět odkaz Dokumenty Google.

Odpověď z naší webové aplikace

Pokud navštívíte adresu URL, PDF faktury, s zástupný symbol vyměnil s 1 by měly být staženy.

Aktualizace aplikace

Pokud se vám zobrazí chybová místo, nebo ne dostat odpověď, pravděpodobně jste udělali chybu v kódu. Můžete jej změnit a aktualizovat nasazení stejným způsobem, jako jste jej původně nasadili. Obrazovka Aktualizace se jen mírně liší od obrazovky nasazení.

Aktualizovat možnosti nasazení

jediná složitější věc je, že musíte vybrat možnost „Nový“ jako verze pro každou změnu, kterou uděláte. Pokud provedete změny kódu a Aktualizaci předchozí verze, změny se projeví, což není zřejmé z uživatelského ROZHRANÍ. (Vidíte, že mi trvalo několik pokusů, než jsem to napravil.).

vytvoření našich faktur z Pythonu

nyní můžeme vytvářet faktury a ukládat je lokálně ze skriptu Pythonu. Následující kód ukazuje, jak vygenerovat tři faktury ve smyčce 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)

Všimněte si, že proces vytváření a stahování je poměrně pomalý, takže pro každou fakturu, kterou vytvoříte, bude trvat několik sekund.

pravděpodobně jste si všimli, že je to docela „hacky“ řešení pro generování souborů PDF z Pythonu. Funkce“ nahradit “ je ve srovnání se správným šablonovacím jazykem poměrně omezená a předávání dat prostřednictvím požadavku get má také omezení. Pokud projdete něčím komplikovanějším než ID faktury, musíte data nejprve zakódovat do adresy URL. Můžete to udělat v Pythonu pomocí modulu urllib.parse. Příklad modifikace skriptu Python pro řešení složitějších dat je následující.

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)

Ale jsou zde stále omezení, jaký druh dat a kolik můžete projít jen pomocí adresy Url, takže budete muset upravit skript pomocí POST požadavku, místo toho, pokud posíláte hodně dynamická data.

je to také poměrně pomalé ve srovnání s některými jinými metodami, které jsme diskutovali na začátku, a Google má určitá omezení, kolik souborů můžete tímto způsobem automaticky vytvořit.

Že řekl, že je schopen vytvářet šablony pomocí Google Docs může být rychlý a silný, takže budete muset posoudit kompromisy pro sebe.

Také si všimněte, že to je docela nepřirozený příklad, kde bychom mohli spustit Python skript v Google Ekosystému, a vyhnout se nutnosti zřídit veřejné čelí API, které by potenciálně mohly být zneužity, pokud se ostatní lidé objevili URL. Nicméně, možná jste stávající Python aplikací, které nejsou hostované na Google, který potřebujete, spojte se s auto generované PDF soubory, a tato metoda stále umožňuje nastavit samostatné „microservice“ v rámci ekosystému Google, který umožňuje snadné PDF generaci.

závěr