4
votes

Comment générer un PDF avec un modèle donné, avec des données dynamiques en Python ou NodeJS à déployer sur AWS

Recherche de recommandation d'une bibliothèque en Python (première préférence) ou NodeJS qui peut générer un fichier pdf de préférence à partir d'un modèle html dynamique à exécuter dans AWS. L'exigence est de générer une facture PDF à envoyer aux clients.

J'ai rencontré ci-dessous 2 bibliothèques de nœuds:

  • PDFKit
  • jsPDF

Ici, nous pourrions avoir à traiter des nombres pour X et Y.

Une meilleure approche serait quelque chose où nous pouvons simplement utiliser html / css pour générer un modèle avec des espaces réservés qui peuvent être remplacés par des données dynamiques (provenant d'une requête de base de données). Toute suggestion serait appréciée.

Merci!


0 commentaires

3 Réponses :


3
votes

https://www.npmjs.com/package/pdfmake La bibliothèque ci-dessus permet une flexibilité en ce qui concerne les factures dynamiques dans node.js


0 commentaires

2
votes

Cette approche a fonctionné pour moi en Python en utilisant les bibliothèques ci-dessous:

Jinja2 - pour générer du HTML avec des données personnalisées

xhtml2pdf - pour générer un PDF à partir de HTML

Considérez dans votre PROJECT DIR, il existe un fichier modèle (facture.html) et un fichier python (pdf_generator.py)

pdf_generator.py

<!DOCTYPE html>
<html lang="en">
<body>
Name: {{ json_data.company_name }} <br>
City/State: {{ json_data.city }}, {{ json_data.state }} <br>
Date: {{ json_data.order_creation_date }} <br>
Order ID: {{ json_data.order_id }} <br>
</body>
</html>

facture.html

from xhtml2pdf import pisa 
import jinja2
templateLoader = jinja2.FileSystemLoader(searchpath="./")
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "invoice.html"
template = templateEnv.get_template(TEMPLATE_FILE)

# This data can come from database query
body = {
    "data":{
        "order_id": 123,
        "order_creation_date": "2020-01-01 14:14:52",
        "company_name": "Test Company",
        "city": "Mumbai",
        "state": "MH",
    }
}

# This renders template with dynamic data 
sourceHtml = template.render(json_data=body["data"]) 
outputFilename = "invoice.pdf"

# Utility function
def convertHtmlToPdf(sourceHtml, outputFilename):
    # open output file for writing (truncated binary)
    resultFile = open(outputFilename, "w+b")

    # convert HTML to PDF
    pisaStatus = pisa.CreatePDF(
            src=sourceHtml,            # the HTML to convert
            dest=resultFile)           # file handle to receive result

    # close output file
    resultFile.close()

    # return True on success and False on errors
    print(pisaStatus.err, type(pisaStatus.err))
    return pisaStatus.err

if __name__ == "__main__":
    pisa.showLogging()
    convertHtmlToPdf(sourceHtml, outputFilename)


0 commentaires

0
votes

Avec https://getpdfapi.com, vous pouvez concevoir des modèles PDF à l'aide d'un éditeur Web et une fois que vous avez terminé, un point de terminaison d'API REST sera créé juste pour vous.

Ce point de terminaison peut être utilisé pour envoyer vos données au format JSON au modèle PDF que vous venez de créer. Le seul code que vous devez écrire est le code qui intègre l'API.

Vous pouvez consulter une démo rapide ici: https://www.youtube.com/watch?v=cv4ZYd_aJO8


0 commentaires