如何使用给定模板生成 PDF,其中包含 Python 中的动态数据或部署在 AWS 上的 NodeJS
How to generate a PDF with a given template, with dynamic data in Python or NodeJS to be deployed on AWS
寻找 Python(首选)或 NodeJS 中的库推荐,最好从动态 html 模板生成 pdf 文件,以便在 AWS 中生成 运行。要求是生成要发送给客户的发票 pdf。
遇到过以下 2 个 Node 库:
- PDF套件
- jsPDF
这里我们可能需要处理 X 和 Y 的数字。
更好的方法是我们可以简单地使用 html/css 生成带有占位符的模板,可以用动态数据(来自数据库查询)替换。
如有任何建议,我们将不胜感激。
谢谢!
https://www.npmjs.com/package/pdfmake
上述库在 node.js
中的动态发票方面具有灵活性
这种方法在 Python 中对我有用,使用以下库:
Jinja2 - 用于生成 HTML 自定义数据
xhtml2pdf - 用于从 HTML
生成 PDF
考虑在您的项目目录中,有一个模板文件(invoice.html) 和python 文件(pdf_generator.py)
pdf_generator.py
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)
invoice.html
<!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>
借助 https://getpdfapi.com,您可以使用基于 Web 的编辑器设计 PDF 模板,完成后,将为您创建一个 REST API 端点。
此端点可用于将您的数据以 JSON 格式发送到您刚创建的 PDF 模板。
您唯一需要编写的代码是集成 API.
的代码
您可以在此处查看快速演示:https://www.youtube.com/watch?v=cv4ZYd_aJO8
寻找 Python(首选)或 NodeJS 中的库推荐,最好从动态 html 模板生成 pdf 文件,以便在 AWS 中生成 运行。要求是生成要发送给客户的发票 pdf。
遇到过以下 2 个 Node 库:
- PDF套件
- jsPDF
这里我们可能需要处理 X 和 Y 的数字。
更好的方法是我们可以简单地使用 html/css 生成带有占位符的模板,可以用动态数据(来自数据库查询)替换。 如有任何建议,我们将不胜感激。
谢谢!
https://www.npmjs.com/package/pdfmake 上述库在 node.js
中的动态发票方面具有灵活性这种方法在 Python 中对我有用,使用以下库:
Jinja2 - 用于生成 HTML 自定义数据
xhtml2pdf - 用于从 HTML
生成 PDF考虑在您的项目目录中,有一个模板文件(invoice.html) 和python 文件(pdf_generator.py)
pdf_generator.py
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)
invoice.html
<!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>
借助 https://getpdfapi.com,您可以使用基于 Web 的编辑器设计 PDF 模板,完成后,将为您创建一个 REST API 端点。
此端点可用于将您的数据以 JSON 格式发送到您刚创建的 PDF 模板。 您唯一需要编写的代码是集成 API.
的代码您可以在此处查看快速演示:https://www.youtube.com/watch?v=cv4ZYd_aJO8