web-dev-qa-db-fra.com

Puppeteer Generate PDF à partir de plusieurs HTMLS

J'utilise Puppeteer pour générer des fichiers PDF à partir de chaînes HTML. En lisant la documentation, j'ai trouvé deux façons de générer les fichiers PDF:

Tout d'abord, en passant une URL et appelez la méthode goTo comme suit

page.goto('https://example.com');
page.pdf({format: 'A4'});

La seconde, c'est mon cas, appelle la méthode setContent comme suit

page.setContent('<p>Hello, world!</p>');
page.pdf({format: 'A4'});

Le fait est que j'ai 3 chaînes HTML différentes qui sont envoyées par le client et je veux générer un seul fichier PDF avec 3 pages (au cas où j'aurais 3 HTMLS).

Je me demande s'il existe un moyen de le faire avec un marionnettiste? J'accepte d'autres suggestions, mais je dois utiliser chrome-headless.

Merci d'avance.

7
jprivillaso

J'ai pu le faire en procédant comme suit:

  1. Générez 3 PDF différents avec le marionnettiste. Vous avez la possibilité d'enregistrer le fichier localement ou de le stocker dans une variable.

  2. J'ai enregistré les fichiers localement, car tous les plugins PDF Merge que j'ai trouvés n'acceptent que les URL et n'acceptent pas les tampons par exemple. Après avoir généré les PDF de manière synchrone localement, je les ai fusionnés en utilisant - PDF Easy Merge .

Le code est comme ceci:

const page1 = '<h1>HTML from page1</h1>';
const page2 = '<h1>HTML from page2</h1>';
const page3 = '<h1>HTML from page3</h1>';

const browser = await puppeteer.launch();
const tab = await browser.newPage();
await tab.setContent(page1);
await tab.pdf({ path: './page1.pdf' });

await tab.setContent(page2); 
await tab.pdf({ path: './page2.pdf' });

await tab.setContent(page3);
await tab.pdf({ path: './page3.pdf' });

await browser.close();

pdfMerge([
  './page1.pdf',
  './page2.pdf',
  './page3.pdf',
],
path.join(__dirname, `./mergedFile.pdf`), async (err) => {
  if (err) return console.log(err);
  console.log('Successfully merged!');
})
2
jprivillaso

J'ai pu générer plusieurs PDF à partir de plusieurs URL à partir du code ci-dessous:

package.json

{
 ............
 ............

 "dependencies": {
    "puppeteer": "^1.1.1",
    "easy-pdf-merge": "0.1.3"
 }

 ..............
 ..............
}

index.js

const puppeteer = require('puppeteer');
const merge = require('easy-pdf-merge');

var pdfUrls = ["http://www.google.com","http://www.yahoo.com"];

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  var pdfFiles=[];

  for(var i=0; i<pdfUrls.length; i++){
    await page.goto(pdfUrls[i], {waitUntil: 'networkidle2'});
    var pdfFileName =  'sample'+(i+1)+'.pdf';
    pdfFiles.Push(pdfFileName);
    await page.pdf({path: pdfFileName, format: 'A4'});
  }

  await browser.close();

  await mergeMultiplePDF(pdfFiles);
})();

const mergeMultiplePDF = (pdfFiles) => {
    return new Promise((resolve, reject) => {
        merge(pdfFiles,'samplefinal.pdf',function(err){

            if(err){
                console.log(err);
                reject(err)
            }

            console.log('Success');
            resolve()
        });
    });
};

Commande RUN: node index.js

5
Haresh Chhelana