You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 16:27:03