NodeJS环境下为已有PDF添加背景图片或背景PDF的方案咨询
NodeJS 环境下为 PDF 添加背景的实现方案
你常用的 pdf-lib 本身就可以实现该需求,无需额外引入其他第三方库,官方文档没有单独标注「背景」配置项,是因为背景可以通过控制绘制层级实现,以下分别对应两种需求场景的实现方法:
方案一:直接嵌入图片作为背景
原理是将图片绘制在 PDF 每一页的最底层,调整尺寸铺满页面即可实现背景效果:
- 安装依赖
npm install pdf-lib
- 示例代码
const { PDFDocument } = require('pdf-lib') const fs = require('fs/promises') async function addImageBackground(inputPdfPath, bgImagePath, outputPath, opacity = 0.2) { // 加载现有PDF const originPdfBytes = await fs.readFile(inputPdfPath) const pdfDoc = await PDFDocument.load(originPdfBytes) // 加载并嵌入背景图片,支持PNG/JPG,JPG请调用embedJpg方法 const bgImgBytes = await fs.readFile(bgImagePath) const bgImage = await pdfDoc.embedPng(bgImgBytes) const pages = pdfDoc.getPages() for (const page of pages) { const { width, height } = page.getSize() // 导出原页面内容,调整绘制层级保证背景在最下方 const originContent = await pdfDoc.embedPage(page) page.resetContent() // 绘制背景 page.drawImage(bgImage, { x: 0, y: 0, width, height, opacity }) // 绘制原有页面内容 page.drawPage(originContent) } // 导出保存 const outputBytes = await pdfDoc.save() await fs.writeFile(outputPath, outputBytes) } // 调用示例 addImageBackground('./原文件.pdf', './背景图.png', './输出文件.pdf')
方案二:使用PDF文件作为背景
如果需要用其他PDF作为背景,同样可以通过pdf-lib实现:
async function addPdfBackground(targetPdfPath, bgPdfPath, outputPath) { const targetPdfBytes = await fs.readFile(targetPdfPath) const targetDoc = await PDFDocument.load(targetPdfBytes) const bgPdfBytes = await fs.readFile(bgPdfPath) const bgDoc = await PDFDocument.load(bgPdfBytes) // 复制背景PDF的所有页面到目标文档 const bgPages = await targetDoc.copyPages(bgDoc, bgDoc.getPageIndices()) const targetPages = targetDoc.getPages() for (let i = 0; i < targetPages.length; i++) { const targetPage = targetPages[i] // 优先取对应页码的背景页,背景PDF页数不足时取最后一页 const bgPage = bgPages[i] || bgPages.at(-1) const { width, height } = targetPage.getSize() const embeddedBg = await targetDoc.embedPage(bgPage) // 导出原目标页内容,调整绘制层级 const originContent = await targetDoc.embedPage(targetPage) targetPage.resetContent() // 先画背景,再画原有内容 targetPage.drawPage(embeddedBg, {x:0, y:0, width, height}) targetPage.drawPage(originContent) } const outputBytes = await targetDoc.save() await fs.writeFile(outputPath, outputBytes) }
轻量替代方案
如果你的服务器环境已经安装了pdftk工具,可以直接调用命令快速实现PDF背景叠加,无需写代码:
# 叠加PDF背景 pdftk 原文件.pdf background 背景文件.pdf output 输出文件.pdf
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

