下载依赖
import { PDFDocument } from 'pdf-lib'
import axios from 'axios'
import Buffer from 'vue-buffer'
逻辑代码
// 循环方法
async beginMerge() {
if (this.errMergeList.length > 0) {
let i = 0
let isnext = true
do {
isnext = false
await this.handleMerge(this.errMergeList[i]).then(() => {
i++
isnext = true
}).catch(() => {
i++
isnext = true
})
} while (i < this.errMergeList.length && isnext)
}
},
handleMerge(v) {
// 此注释避免eslint报错
// eslint-disable-next-line no-async-promise-executor
return new Promise(async(resolve, reject) => {
const mlist = v.files.filter(j => { return j.file_dir.indexOf('.pdf') > -1}).map(j => { return this.baseUrl + j.file_dir })
await this.mergePdf(mlist).then(res => {
// 可将合并后的pdf上传至服务器
// const formData = new FormData()
// formData.append('hs_file', res)
resolve()
})
},
async mergePdf(urlList) {
// eslint-disable-next-line no-async-promise-executor
return new Promise(async(resolve) => {
const promises = []
urlList.map((url) => {
// eslint-disable-next-line no-async-promise-executor
const tmp = new Promise(async(resolve) => {
const response = await axios({
method: 'get',
url,
responseType: 'arraybuffer'
})
resolve(Buffer.from(response.data))
})
promises.push(tmp)
})
const pdfBuffers = await Promise.all(promises)
const newPdf = await PDFDocument.create()
for (const buffer of pdfBuffers) {
const pdfDocument = await PDFDocument.load(buffer)
const contentPages = await newPdf.copyPages(
pdfDocument,
pdfDocument.getPageIndices()
)
for (const page of contentPages) {
newPdf.addPage(page)
}
}
const uint8Array = await newPdf.save()
const mergeBuffer = Buffer.from(uint8Array)
resolve(new Blob([mergeBuffer]))
})
// 只需要合并一次可使用如下进行下载
// const url = window.URL.createObjectURL(new Blob([mergeBuffer]))
// const link = document.createElement('a')
// link.href = url
// link.setAttribute('download', fileName)
// document.body.appendChild(link)
// link.click()
}