使用pdf-lib.js实现拼接两个pdf文件并添加水印

 更新时间:2024年11月17日 11:21:58   作者:米芝芝  
这篇文章主要为大家详细介绍了如何使用pdf-lib.js实现拼接两个pdf文件并添加水印,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

安装依赖

npm install --save pdf-lib

代码中导入及使用

import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'
// 拼接已上传的封面pdf 和 pdfmake制作的pdf
const mergedPdf = await PDFDocument.create()
// 封面测试.pdf文件在public文件夹下,也可以使用url
const bytes1 = await this.readFileAsync('封面测试.pdf')
const pdf1 = await PDFDocument.load(bytes1)

// Add a font to the doc
const helveticaFont = await pdf1.embedFont(StandardFonts.Helvetica)

const pdfDocGenerator = await pdfMake.createPdf(docDefinition)

// 获取pdfmake制作的pdf的arraybuffer
await pdfDocGenerator.getBuffer(async buffer => {
  const pdf2 = await PDFDocument.load(buffer)

  const copiedPagesA = await mergedPdf.copyPages(pdf1, pdf1.getPageIndices())
  copiedPagesA.forEach((page) => {
    // 封面添加名称信息
    page.drawText('Cover Name: 111', {
      x: page.getWidth() / 2 - (helveticaFont.widthOfTextAtSize('Cover Name: 111', 32) / 2),// 使文字居中
      y: 580,
      size: 32,
      font: helveticaFont,
      color: rgb(0, 0.53, 0.71)
    })
    mergedPdf.addPage(page)
  })
  const copiedPagesB = await mergedPdf.copyPages(pdf2, pdf2.getPageIndices())
  copiedPagesB.forEach((page) => mergedPdf.addPage(page))

  const mergedPdfFile = await mergedPdf.save()
  
  // 下载到本地
  const url = window.URL.createObjectURL(new Blob([mergedPdfFile.buffer]))
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', 'test.pdf')
  document.body.appendChild(link)
  link.click()
})
// 获取文件arraybuffer
readFileAsync(file_url) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest()
    xhr.open('get', file_url, true)
    xhr.responseType = 'blob'
    xhr.onload = function() {
      if (this.status === 200) {
        const reader = new FileReader()
        reader.onload = () => {
          resolve(reader.result)
        }
        reader.onerror = reject
        reader.readAsArrayBuffer(this.response)
      }
    }
    xhr.send()
  })
},

每一页加水印

修改上面的代码

// const mergedPdfFile = await mergedPdf.save()

// 加水印、下载
this.addCanvasWatermark(mergedPdf, '水印water', filename)
// 下载到本地
// const url = window.URL.createObjectURL(new Blob([mergedPdfFile.buffer]))
// const link = document.createElement('a')
// link.href = url
// link.setAttribute('download', filename + '.pdf')
// document.body.appendChild(link)
// link.click()
// 添加  水印
async addCanvasWatermark(pdfDoc, text, filename) {
  // 加载自定义字体,这里用的是pdfmake中自定义的字体
  const fonturl = require('pdfmake/examples/fonts/FZYTK.ttf')
  const fontBytes = await fetch(fonturl).then((res) => res.arrayBuffer())

  // 自定义字体挂载
  pdfDoc.registerFontkit(fontkit)
  const customFont = await pdfDoc.embedFont(fontBytes)

  // 为每页pdf添加文字水印
  const pages = pdfDoc.getPages()
  // 文字渲染配置
  const drawTextParams = {
    lineHeight: 50,
    font: customFont, // 这里使用的是自定义字体
    size: 12,
    color: rgb(0.46, 0.53, 0.6), // rgb(0.08, 0.08, 0.2),
    rotate: degrees(15),
    opacity: 0.2
  }
  for (let i = 0; i < pages.length; i++) {
    const page = pages[i]

    // 获取当前页宽高
    const { width, height } = page.getSize()

    // 要渲染的文字内容
    // const text = 'water 121314'

    for (let ix = 1; ix < width; ix += 230) { // 水印横向间隔
      let lineNum = 0
      for (let iy = 50; iy <= height; iy += 110) { // 水印纵向间隔
        lineNum++

        page.drawText(text, {
          x: lineNum & 1 ? ix : ix + 70,
          y: iy,
          ...drawTextParams
        })
      }
    }
  }
  
  // 序列化为字节,并下载到本地
  const pdfBytes = await pdfDoc.save()
  this.download(pdfBytes, filename)
},
// 下载到本地
download(mergedPdfFile, filename) {
  const url = window.URL.createObjectURL(new Blob([mergedPdfFile.buffer]))
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', filename + '.pdf')
  document.body.appendChild(link)
  link.click()
}

到此这篇关于使用pdf-lib.js实现拼接两个pdf文件并添加水印的文章就介绍到这了,更多相关pdf-lib拼接文件并添加水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Bootstrap滚动监听(Scrollspy)插件详解

    Bootstrap滚动监听(Scrollspy)插件详解

    滚动监听插件是用来根据滚动条所处在的位置自动更新导航项目, 显示导航项目高亮显示。这篇文章主要介绍了Bootstrap滚动监听(Scrollspy)插件的相关资料,需要的朋友可以参考下
    2016-04-04
  • JavaScript常用验证函数实例汇总

    JavaScript常用验证函数实例汇总

    这篇文章主要介绍了JavaScript常用验证函数,实例汇总了如字符串验证、表单验证及js常用特效等诸多js常用验证函数及相关技巧,非常具有实用价值,需要的朋友可以参考下
    2014-11-11
  • 谈谈JavaScript中的垃圾回收机制

    谈谈JavaScript中的垃圾回收机制

    这篇文章主要介绍了JavaScript中的垃圾回收机制,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下
    2020-09-09
  • 简单对比分析JavaScript中的apply,call与this的使用

    简单对比分析JavaScript中的apply,call与this的使用

    简单的说call,apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例(就是每个方法)都有call,apply属性。既然作为方法的属性,那它们的使用就当然是针对方法的了,这两个方法是容易混淆的
    2015-12-12
  • Js实现动态添加删除Table行示例

    Js实现动态添加删除Table行示例

    这篇文章主要介绍了Js动态添加删除Table行的具体实现,需要的朋友可以参考下
    2014-04-04
  • asp.net+js实现金额格式化

    asp.net+js实现金额格式化

    这篇文章主要介绍了asp.net+js实现金额格式化的相关资料,需要的朋友可以参考下
    2015-02-02
  • 深入理解JavaScript系列(35):设计模式之迭代器模式详解

    深入理解JavaScript系列(35):设计模式之迭代器模式详解

    这篇文章主要介绍了深入理解JavaScript系列(35):设计模式之迭代器模式详解,迭代器模式(Iterator):提供一种方法顺序一个聚合对象中各个元素,而又不暴露该对象内部表示,需要的朋友可以参考下
    2015-03-03
  • JS字符串统计操作示例【遍历,截取,输出,计算】

    JS字符串统计操作示例【遍历,截取,输出,计算】

    这篇文章主要介绍了JS字符串统计操作,结合实例形式分析了javascript字符串的遍历,截取,输出,计算等相关操作技巧与注意事项,需要的朋友可以参考下
    2017-03-03
  • Javascript获取表单名称(name)的方法

    Javascript获取表单名称(name)的方法

    这篇文章主要介绍了Javascript获取表单名称(name)的方法,涉及javascript操作表单的技巧,需要的朋友可以参考下
    2015-04-04
  • js中typeof的用法汇总

    js中typeof的用法汇总

    这篇文章主要是对js中typeof的用法进行了详细的汇总介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12

最新评论