公众号:程序员白特,欢迎一起交流学习~
hi,我是白特。
最近看到一个功能,十分感兴趣,也就是我们要将多个
文件服务器中的PDF文件合并为一个
PDF文件并以此进行下载打印操作。
那么直接让我们一起看下它的实现思路吧。
思路
我们需要使用到pdf-lib
这个库,它提供了一组丰富的功能,可以在客户端和服务器端中对PDF文件进行各种操作.
首先需要安装这个库
npm i pdf-lib
创建
一个空白PDF文档;遍历
即将合并的PDF文档,获取二进制
数据;依次
将数据写入
到空白文档中。(如果单个PDF中有多页,需要一次一页往新建空白PDF中添加)
;- 将合并后的PDF文档
保存
为Blob对象
; 创建
下载链接并且触发下载
;
实现
好的,根据上面的思路我们开始实现这个功能。
import React from "react";
import { PDFDocument } from "pdf-lib";
export default function Test() {
async function mergePDFs(pdfUrls) {
// 创建一个新的空白PDF文档
const mergedPdfDoc = await PDFDocument.create();
for (const pdfUrl of pdfUrls) {
// 获取PDF文件的二进制数据
const pdfBytes = await fetch(pdfUrl).then(response => response.arrayBuffer());
// 将获取到的PDF文件添加到新的文档中
const pdfDoc = await PDFDocument.load(pdfBytes);
// 如果单个PDF为多页,则要一页一页往新建的PDF中添加
const copiedPages = await mergedPdfDoc.copyPages(pdfDoc, pdfDoc.getPageIndices());
copiedPages.forEach(page => mergedPdfDoc.addPage(page));
}
// 将合并后的PDF保存为Blob对象
const mergedPdfBytes = await mergedPdfDoc.save();
const mergedPdfBlob = new Blob([mergedPdfBytes], { type: 'application/pdf' });
// 创建下载链接
const downloadLink = document.createElement('a');
downloadLink.href = URL.createObjectURL(mergedPdfBlob);
// 设置下载文件名
downloadLink.download = 'mergedPdf.pdf';
// 触发下载
downloadLink.click();
}
// mergePDFs()的入参为文件服务器中的PDF文件链接,需要手动替换
return (
<div>
<button
onClick={() =>
mergePDFs([
"https://test/01.pdf",
"https://test/02.pdf",
"https://test/03.pdf",
])
}
>
下载
</button>
</div>
);
}
效果
下面是简单效果展示:
你学会了吗?快来试试吧