使用pdf-lib.js實現(xiàn)拼接兩個pdf文件并添加水印
更新時間:2024年11月17日 11:21:58 作者:米芝芝
這篇文章主要為大家詳細介紹了如何使用pdf-lib.js實現(xiàn)拼接兩個pdf文件并添加水印,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
安裝依賴
npm install --save pdf-lib
代碼中導(dǎo)入及使用
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] // 獲取當(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實現(xiàn)拼接兩個pdf文件并添加水印的文章就介紹到這了,更多相關(guān)pdf-lib拼接文件并添加水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Bootstrap滾動監(jiān)聽(Scrollspy)插件詳解
滾動監(jiān)聽插件是用來根據(jù)滾動條所處在的位置自動更新導(dǎo)航項目, 顯示導(dǎo)航項目高亮顯示。這篇文章主要介紹了Bootstrap滾動監(jiān)聽(Scrollspy)插件的相關(guān)資料,需要的朋友可以參考下2016-04-04簡單對比分析JavaScript中的apply,call與this的使用
簡單的說call,apply都屬于Function.prototype的一個方法,它是JavaScript引擎內(nèi)在實現(xiàn)的,因為屬于Function.prototype,所以每個Function對象實例(就是每個方法)都有call,apply屬性。既然作為方法的屬性,那它們的使用就當(dāng)然是針對方法的了,這兩個方法是容易混淆的2015-12-12深入理解JavaScript系列(35):設(shè)計模式之迭代器模式詳解
這篇文章主要介紹了深入理解JavaScript系列(35):設(shè)計模式之迭代器模式詳解,迭代器模式(Iterator):提供一種方法順序一個聚合對象中各個元素,而又不暴露該對象內(nèi)部表示,需要的朋友可以參考下2015-03-03JS字符串統(tǒng)計操作示例【遍歷,截取,輸出,計算】
這篇文章主要介紹了JS字符串統(tǒng)計操作,結(jié)合實例形式分析了javascript字符串的遍歷,截取,輸出,計算等相關(guān)操作技巧與注意事項,需要的朋友可以參考下2017-03-03