使用pdf-lib.js實(shí)現(xiàn)拼接兩個(gè)pdf文件并添加水印
安裝依賴
npm install --save pdf-lib
代碼中導(dǎo)入及使用
import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'
// 拼接已上傳的封面pdf 和 pdfmake制作的pdf
const mergedPdf = await PDFDocument.create()
// 封面測(cè)試.pdf文件在public文件夾下,也可以使用url
const bytes1 = await this.readFileAsync('封面測(cè)試.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]
// 獲取當(dāng)前頁寬高
const { width, height } = page.getSize()
// 要渲染的文字內(nèi)容
// 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
})
}
}
}
// 序列化為字節(jié),并下載到本地
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()
}
到此這篇關(guān)于使用pdf-lib.js實(shí)現(xiàn)拼接兩個(gè)pdf文件并添加水印的文章就介紹到這了,更多相關(guān)pdf-lib拼接文件并添加水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Bootstrap滾動(dòng)監(jiān)聽(Scrollspy)插件詳解
滾動(dòng)監(jiān)聽插件是用來根據(jù)滾動(dòng)條所處在的位置自動(dòng)更新導(dǎo)航項(xiàng)目, 顯示導(dǎo)航項(xiàng)目高亮顯示。這篇文章主要介紹了Bootstrap滾動(dòng)監(jiān)聽(Scrollspy)插件的相關(guān)資料,需要的朋友可以參考下2016-04-04
JavaScript常用驗(yàn)證函數(shù)實(shí)例匯總
這篇文章主要介紹了JavaScript常用驗(yàn)證函數(shù),實(shí)例匯總了如字符串驗(yàn)證、表單驗(yàn)證及js常用特效等諸多js常用驗(yàn)證函數(shù)及相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11
簡單對(duì)比分析JavaScript中的apply,call與this的使用
簡單的說call,apply都屬于Function.prototype的一個(gè)方法,它是JavaScript引擎內(nèi)在實(shí)現(xiàn)的,因?yàn)閷儆贔unction.prototype,所以每個(gè)Function對(duì)象實(shí)例(就是每個(gè)方法)都有call,apply屬性。既然作為方法的屬性,那它們的使用就當(dāng)然是針對(duì)方法的了,這兩個(gè)方法是容易混淆的2015-12-12
Js實(shí)現(xiàn)動(dòng)態(tài)添加刪除Table行示例
這篇文章主要介紹了Js動(dòng)態(tài)添加刪除Table行的具體實(shí)現(xiàn),需要的朋友可以參考下2014-04-04
深入理解JavaScript系列(35):設(shè)計(jì)模式之迭代器模式詳解
這篇文章主要介紹了深入理解JavaScript系列(35):設(shè)計(jì)模式之迭代器模式詳解,迭代器模式(Iterator):提供一種方法順序一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象內(nèi)部表示,需要的朋友可以參考下2015-03-03
JS字符串統(tǒng)計(jì)操作示例【遍歷,截取,輸出,計(jì)算】
這篇文章主要介紹了JS字符串統(tǒng)計(jì)操作,結(jié)合實(shí)例形式分析了javascript字符串的遍歷,截取,輸出,計(jì)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-03-03

