nodejs 和 hummus-recipe 中的 Mailmerge pdf
Mailmerge pdf in nodejs and hummus-recipe
我正在尝试制作一个简单的邮件合并,其中将收件人信息插入到模板 pdf 之上。
模板为1页,结果可达数百页。
我有数组对象中的所有收件人,但需要找到一种方法来遍历它并为每个收件人创建一个唯一的页面。
我不确定 hummus-recipe 是否是正确的工具,因此非常感谢任何关于如何执行此操作的意见。
我的演示是这样的
const HummusRecipe = require('hummus-recipe')
const recepients = [
{name: "John Doe", address: "My Streetname 23", zip: "23456", city: "My City"},
{name: "Jane Doe", address: "Another Streetname 56 ", zip: "54432", city: "Her City"}
//'.......'
]
const template = 'template.pdf';
const pdfDoc = new HummusRecipe(template, 'output.pdf');
function createPdf(){
pdfDoc
.editPage(1)
.text(recepients[0].name, 30, 60)
.text(recepients[0].address, 30, 75)
.text(recepients[0].zip + ' ' + recepients[0].city, 30, 90)
.endPage()
//. appendpage(template) - tried versions of this in loops etc., but can't get it to work.
.endPDF();
}
createPdf();
这显然只创建了一个包含收件人[0] 的页面。我尝试了各种方法来使用 .appendpage(template) 循环,但我无法追加然后编辑同一页面。
有什么关于如何从这里继续前进的建议吗?
在与 hummus-recipe 的创建者和其他人交谈后,解决方案变得有些明显。不可能追加一个页面然后修改它,也不可能多次修改同一个页面。
然后解决方案是分两次制作最终的 pdf。首先创建一个 masterPdf,其中模板附加在 for 循环中,保存此文件,然后编辑每个页面。
我已经创建了一个工作代码,如下所示。我已经使函数异步,因为我需要在 lambda 上 运行 它需要对 returns 等进行控制。这样也可以在 AWS S3 上保存 tmp 文件和最终 pdf。
下面的代码大约需要 60 秒才能从 1.6mb 的模板创建 200 页的 pdf。任何优化想法将不胜感激。
const HummusRecipe = require('hummus-recipe');
const template = 'input/input.pdf';
const recipients = [
{name: 'John Doe', address: "My Streetname 23"},
{name: 'Jane Doe', address: "Another Streetname 44"},
//...etc.
]
async function createMasterPdf(recipientsLength) {
const key = `${(Date.now()).toString()}.pdf`;
const filePath = `output/tmp/${key}`;
const pdfDoc = new HummusRecipe(template, filePath)
for (i = 1; i < recipientsLength; i++) {
pdfDoc
.appendPage(template)
.endPage()
}
pdfDoc.endPDF();
return(filePath)
}
async function editMasterPdf(masterPdf, recipientsLength) {
const key = `${(Date.now()).toString()}.pdf`;
const filePath = `output/final/${key}`;
const pdfDoc = new HummusRecipe(masterPdf, filePath)
for (i = 0; i < recipientsLength; i++) {
pdfDoc
.editPage(i+1)
.text(recipients[i].name, 75, 100)
.text(recipients[i].address, 75, 115)
.endPage()
}
pdfDoc.endPDF()
return('Finished file: ' + filePath)
}
const run = async () => {
const masterPdf = await createMasterPdf(recipients.length);
const editMaster = await editMasterPdf(masterPdf, recipients.length)
console.log(editMaster)
}
run()
我正在尝试制作一个简单的邮件合并,其中将收件人信息插入到模板 pdf 之上。
模板为1页,结果可达数百页。
我有数组对象中的所有收件人,但需要找到一种方法来遍历它并为每个收件人创建一个唯一的页面。
我不确定 hummus-recipe 是否是正确的工具,因此非常感谢任何关于如何执行此操作的意见。
我的演示是这样的
const HummusRecipe = require('hummus-recipe')
const recepients = [
{name: "John Doe", address: "My Streetname 23", zip: "23456", city: "My City"},
{name: "Jane Doe", address: "Another Streetname 56 ", zip: "54432", city: "Her City"}
//'.......'
]
const template = 'template.pdf';
const pdfDoc = new HummusRecipe(template, 'output.pdf');
function createPdf(){
pdfDoc
.editPage(1)
.text(recepients[0].name, 30, 60)
.text(recepients[0].address, 30, 75)
.text(recepients[0].zip + ' ' + recepients[0].city, 30, 90)
.endPage()
//. appendpage(template) - tried versions of this in loops etc., but can't get it to work.
.endPDF();
}
createPdf();
这显然只创建了一个包含收件人[0] 的页面。我尝试了各种方法来使用 .appendpage(template) 循环,但我无法追加然后编辑同一页面。
有什么关于如何从这里继续前进的建议吗?
在与 hummus-recipe 的创建者和其他人交谈后,解决方案变得有些明显。不可能追加一个页面然后修改它,也不可能多次修改同一个页面。
然后解决方案是分两次制作最终的 pdf。首先创建一个 masterPdf,其中模板附加在 for 循环中,保存此文件,然后编辑每个页面。
我已经创建了一个工作代码,如下所示。我已经使函数异步,因为我需要在 lambda 上 运行 它需要对 returns 等进行控制。这样也可以在 AWS S3 上保存 tmp 文件和最终 pdf。
下面的代码大约需要 60 秒才能从 1.6mb 的模板创建 200 页的 pdf。任何优化想法将不胜感激。
const HummusRecipe = require('hummus-recipe');
const template = 'input/input.pdf';
const recipients = [
{name: 'John Doe', address: "My Streetname 23"},
{name: 'Jane Doe', address: "Another Streetname 44"},
//...etc.
]
async function createMasterPdf(recipientsLength) {
const key = `${(Date.now()).toString()}.pdf`;
const filePath = `output/tmp/${key}`;
const pdfDoc = new HummusRecipe(template, filePath)
for (i = 1; i < recipientsLength; i++) {
pdfDoc
.appendPage(template)
.endPage()
}
pdfDoc.endPDF();
return(filePath)
}
async function editMasterPdf(masterPdf, recipientsLength) {
const key = `${(Date.now()).toString()}.pdf`;
const filePath = `output/final/${key}`;
const pdfDoc = new HummusRecipe(masterPdf, filePath)
for (i = 0; i < recipientsLength; i++) {
pdfDoc
.editPage(i+1)
.text(recipients[i].name, 75, 100)
.text(recipients[i].address, 75, 115)
.endPage()
}
pdfDoc.endPDF()
return('Finished file: ' + filePath)
}
const run = async () => {
const masterPdf = await createMasterPdf(recipients.length);
const editMaster = await editMasterPdf(masterPdf, recipients.length)
console.log(editMaster)
}
run()