web-dev-qa-db-ja.com

Puppeteer Generate PDF from multiple HTMLS

Puppeteerを使用してPDFファイルを生成しています。ドキュメントを読むと、PDFファイルを生成する方法が2つ見つかりました:

まず、次のようにURLを渡してメソッドgoToを呼び出します

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

2つ目、つまり私の場合、次のようにメソッドsetContentを呼び出します。

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

問題は、クライアントから送信される3つの異なるHTML文字列があり、3つのページを含む単一のPDFファイルを生成することです(3つのHTMLSがある場合))。

人形遣いでこれを行う方法はあるのでしょうか?他の提案を受け入れますが、クロムヘッドレスを使用する必要があります。

前もって感謝します。

7
jprivillaso

これを行うには、次のようにしました。

  1. Puppeteerで3つの異なるPDFを生成します。ファイルをローカルに保存するか、変数に保存するかを選択できます。

  2. 私が見つけたすべてのPDF MergeプラグインはURLのみを受け入れ、たとえばバッファーを受け入れないため、ファイルをローカルに保存しました。PDFをローカルで同期的に生成した後、次を使用してそれらをマージしました- PDF Easy Merge

コードは次のとおりです。

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

以下のコードの複数のURLから複数のPDFを生成することができました:

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

RUNコマンド: node index.js

5
Haresh Chhelana