Puppeteer 从多个 HTML 字符串生成 PDF
Puppeteer Generate PDF from multiple HTML strings
我正在使用 Puppeteer 从 HTML 字符串生成 PDF 文件。
阅读文档,我发现了两种生成PDF文件的方法:
首先,传递一个url并调用goto
方法如下:
page.goto('https://example.com');
page.pdf({format: 'A4'});
第二种,也就是我的情况,调用方法setContent
如下:
page.setContent('<p>Hello, world!</p>');
page.pdf({format: 'A4'});
问题是我从客户端发送了 3 个不同的 HTML 字符串,我想生成一个包含 3 页的 PDF 文件(以防我有 3 个 HTML 字符串) .
我想知道是否存在使用 Puppeteer 执行此操作的方法?我接受其他建议,但我需要使用 chrome-headless.
我可以通过执行以下操作来做到这一点:
使用 puppeteer 生成 3 个不同的 PDF。您可以选择将文件保存在本地或将其存储在变量中。
我将文件保存在本地,因为我发现的所有 PDF 合并插件都只接受 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!');
})
我能够从以下代码的多个 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()
});
});
};
运行命令:节点index.js
pdf-merger-js 是另一种选择。 page.setContent
应该与下面 page.goto
的直接替代品一样工作:
const PDFMerger = require("pdf-merger-js"); // 3.4.0
const puppeteer = require("puppeteer"); // 14.1.1
const urls = [
"https://news.ycombinator.com",
"https://en.wikipedia.org",
"https://www.example.com",
// ...
];
const filename = "merged.pdf";
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
const merger = new PDFMerger();
for (const url of urls) {
await page.goto(url);
merger.add(await page.pdf());
}
await merger.save(filename);
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
我正在使用 Puppeteer 从 HTML 字符串生成 PDF 文件。 阅读文档,我发现了两种生成PDF文件的方法:
首先,传递一个url并调用goto
方法如下:
page.goto('https://example.com');
page.pdf({format: 'A4'});
第二种,也就是我的情况,调用方法setContent
如下:
page.setContent('<p>Hello, world!</p>');
page.pdf({format: 'A4'});
问题是我从客户端发送了 3 个不同的 HTML 字符串,我想生成一个包含 3 页的 PDF 文件(以防我有 3 个 HTML 字符串) .
我想知道是否存在使用 Puppeteer 执行此操作的方法?我接受其他建议,但我需要使用 chrome-headless.
我可以通过执行以下操作来做到这一点:
使用 puppeteer 生成 3 个不同的 PDF。您可以选择将文件保存在本地或将其存储在变量中。
我将文件保存在本地,因为我发现的所有 PDF 合并插件都只接受 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!');
})
我能够从以下代码的多个 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()
});
});
};
运行命令:节点index.js
pdf-merger-js 是另一种选择。 page.setContent
应该与下面 page.goto
的直接替代品一样工作:
const PDFMerger = require("pdf-merger-js"); // 3.4.0
const puppeteer = require("puppeteer"); // 14.1.1
const urls = [
"https://news.ycombinator.com",
"https://en.wikipedia.org",
"https://www.example.com",
// ...
];
const filename = "merged.pdf";
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
const merger = new PDFMerger();
for (const url of urls) {
await page.goto(url);
merger.add(await page.pdf());
}
await merger.save(filename);
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;