在 Node Puppeteer 中为 PDF 的每一页添加页眉
Adding Header to Each Page of PDF in Node Puppeteer
我正在尝试将页眉部分打印到生成的 PDF 的每一页。我还使用 pdf-merger 将多个 PDF 合并在一起。现在,当我执行此代码时,生成的 PDF 包含多个文档,正如预期的那样。但是,我添加的 Header
部分似乎只出现在作为完整 PDF 一部分的文档的第 2 和第 5 部分中。我无法通过查看我的代码来判断为什么会这样。我假设 Header
将添加到每个文档中。
第一个问题:为什么我会注意到自己的行为。明白这会帮助我知道要调整什么。第二个问题:如何调整此代码,以便将 Header
添加到文档的每个页面?
这是我将选项传递给 page.pdf()
的部分:
let doc = await page.pdf({
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate: '<span style="font-size: 30px; width: 50px; height: 50px; color:black; margin: 20px;">Header</span>',
});
这里是完整的代码块:
let merger = new PDFMerger();
const browser = await puppeteer.launch();
const page = await browser.newPage();
let recordNum = 1;
for (let r of recordsArr) {
try {
let signatures = [];
signatures = await signatureService.getSignatures({}, [r.guid]);
if (signatures.length) r.signatureBase64Str = signatures[0].value;
} catch (err) {
console.log(err);
return Response.Failure("Error occurred while obtaining signature.", err);
}
r.logoBase64Str = base64Logo;
if (r.goalNotes.length) {
for (const [i, value] of r.goalNotes.entries()) {
value.number = i + 1;
}
}
try {
console.log(`processing record ${recordNum} of ${recordsArr.length}`);
const content = await compile(r);
await page.setContent(content);
await page.emulateMediaType("screen");
let doc = await page.pdf({
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate: '<span style="font-size: 30px; width: 50px; height: 50px; color:black; margin: 20px;">Header</span>',
});
merger.add(doc);
++recordNum;
} catch (error) {
console.log(error);
return Response.Failure("Unable to generate PDF by parameters passed.");
}
}
很难说出您的代码出了什么问题,因为很多函数都未定义,但这里有一个最小的、可运行的示例,它使用与您相同的 PDF 合并包向所有页面添加页眉:
const PDFMerger = require("pdf-merger-js");
const puppeteer = require("puppeteer");
const headerTemplate = `<span style="font-size: 30px; width: 200px; height: 200px; background-color: black; color: white; margin: 20px;">Header</span>`;
const mockContent = Array(10).fill().map((_, i) => `<div>page ${i}</div>`);
const filename = "merged.pdf";
const pdfSettings = {
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate,
margin: {top: "100px", bottom: "100px"},
};
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
const merger = new PDFMerger();
for (const content of mockContent) {
await page.setContent(content);
merger.add(await page.pdf(pdfSettings));
}
await merger.save(filename);
})()
.catch(err => console.error(err))
.finally(async () => await browser.close())
;
我正在尝试将页眉部分打印到生成的 PDF 的每一页。我还使用 pdf-merger 将多个 PDF 合并在一起。现在,当我执行此代码时,生成的 PDF 包含多个文档,正如预期的那样。但是,我添加的 Header
部分似乎只出现在作为完整 PDF 一部分的文档的第 2 和第 5 部分中。我无法通过查看我的代码来判断为什么会这样。我假设 Header
将添加到每个文档中。
第一个问题:为什么我会注意到自己的行为。明白这会帮助我知道要调整什么。第二个问题:如何调整此代码,以便将 Header
添加到文档的每个页面?
这是我将选项传递给 page.pdf()
的部分:
let doc = await page.pdf({
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate: '<span style="font-size: 30px; width: 50px; height: 50px; color:black; margin: 20px;">Header</span>',
});
这里是完整的代码块:
let merger = new PDFMerger();
const browser = await puppeteer.launch();
const page = await browser.newPage();
let recordNum = 1;
for (let r of recordsArr) {
try {
let signatures = [];
signatures = await signatureService.getSignatures({}, [r.guid]);
if (signatures.length) r.signatureBase64Str = signatures[0].value;
} catch (err) {
console.log(err);
return Response.Failure("Error occurred while obtaining signature.", err);
}
r.logoBase64Str = base64Logo;
if (r.goalNotes.length) {
for (const [i, value] of r.goalNotes.entries()) {
value.number = i + 1;
}
}
try {
console.log(`processing record ${recordNum} of ${recordsArr.length}`);
const content = await compile(r);
await page.setContent(content);
await page.emulateMediaType("screen");
let doc = await page.pdf({
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate: '<span style="font-size: 30px; width: 50px; height: 50px; color:black; margin: 20px;">Header</span>',
});
merger.add(doc);
++recordNum;
} catch (error) {
console.log(error);
return Response.Failure("Unable to generate PDF by parameters passed.");
}
}
很难说出您的代码出了什么问题,因为很多函数都未定义,但这里有一个最小的、可运行的示例,它使用与您相同的 PDF 合并包向所有页面添加页眉:
const PDFMerger = require("pdf-merger-js");
const puppeteer = require("puppeteer");
const headerTemplate = `<span style="font-size: 30px; width: 200px; height: 200px; background-color: black; color: white; margin: 20px;">Header</span>`;
const mockContent = Array(10).fill().map((_, i) => `<div>page ${i}</div>`);
const filename = "merged.pdf";
const pdfSettings = {
displayHeaderFooter: true,
format: "A4",
printBackground: true,
headerTemplate,
margin: {top: "100px", bottom: "100px"},
};
let browser;
(async () => {
browser = await puppeteer.launch();
const [page] = await browser.pages();
const merger = new PDFMerger();
for (const content of mockContent) {
await page.setContent(content);
merger.add(await page.pdf(pdfSettings));
}
await merger.save(filename);
})()
.catch(err => console.error(err))
.finally(async () => await browser.close())
;