Estoy tratando de hacer una combinación de correspondencia simple donde la información de los destinatarios se inserta en la parte superior de una plantilla en PDF.

La plantilla es de 1 página, pero el resultado puede tener varios cientos de páginas.

Tengo todos los destinatarios en objetos de matriz, pero necesito encontrar una manera de recorrerlos y crear una página única para cada destinatario.

No estoy seguro de si la receta de hummus es la herramienta adecuada, por lo que agradecería mucho cualquier comentario sobre cómo hacer esto.

Mi demo se ve así

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

Obviamente, esto solo crea una única página con el destinatario [0]. He intentado todo tipo de formas de recorrer usando .appendpage (plantilla), pero no puedo agregar y luego editar la misma página.

¿Algún consejo sobre cómo seguir adelante desde aquí?

0
Simon 28 oct. 2019 a las 15:16

1 respuesta

La mejor respuesta

Después de conversar con el creador de la receta de hummus y otros, la solución se volvió algo obvia. No es posible agregar una página y luego modificarla, y no es posible modificar la misma página varias veces.

La solución entonces es hacer el pdf final en dos pasadas. Primero cree un masterPdf donde la plantilla se adjunta en un bucle for, guarde este archivo y luego edite cada una de esas páginas.

He creado un código de trabajo como se muestra a continuación. He hecho las funciones asincrónicas ya que necesito ejecutarlo en lambda y necesito un control som sobre las devoluciones, etc. También de esta manera es posible guardar tanto el archivo tmp como el pdf final en AWS S3.

El siguiente código tarda unos 60 segundos en crear un pdf de 200 páginas a partir de una plantilla de 1,6 MB. Cualquier idea de optimización será muy apreciada.

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()
0
Simon 13 nov. 2019 a las 09:08