Mailmerge PDF в nodejs и хумус-рецепт - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь сделать простое слияние, где информация о получателях вставляется поверх шаблона pdf.

Шаблон состоит из 1 страницы, но результат может содержать до нескольких сотен страниц.

У меня есть все получатели в объектах массива, но мне нужно найти способ обойти это и создатьуникальная страница для каждого получателя.

Я не уверен, является ли хумус-рецепт правильным инструментом, поэтому буду очень признателен за любой вклад в то, как это сделать.

Моя демонстрация выглядит следующим образом

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 (шаблон), но не могу добавить и затем отредактировать ту же страницу.

Любой совет, как двигаться дальше отсюда?

1 Ответ

0 голосов
/ 13 ноября 2019

После разговора с создателем хумус-рецепта и другими, решение стало несколько очевидным. Невозможно добавить страницу и затем изменить ее, и невозможно изменить одну и ту же страницу несколько раз.

Решение состоит в том, чтобы сделать окончательный PDF в два прохода. Сначала создайте masterPdf, где шаблон добавляется в цикл for, сохраните этот файл и затем отредактируйте каждую из этих страниц.

Я создал рабочий код, как показано ниже. Я сделал функции асинхронными, так как мне нужно, чтобы он запускался на лямбде, требовался сом-контроль над возвратами и т. Д. Также можно сохранить как tmp-файл, так и конечный pdf на AWS S3.

Код нижеСоздание 60-страничного PDF-файла из шаблона объемом 1,6 Мб занимает около 60 секунд. Будем весьма благодарны за любые идеи по оптимизации.

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()
...