前端实现多个PDF文件合并为一个PDF文件

最近遇到一个功能: 即将多个文件服务器中的PDF文件合并为一个PDF文件进行下载打印操作。

话不多说开搞

思路

我们需要使用到pdf-lib这个库,它提供了一组丰富的功能,可以在客户端和服务器端中对PDF文件进行各种操作.

首先需要安装这个库

js 复制代码
npm i pdf-lib
  1. 创建一个空白PDF文档。
  2. 遍历即将合并的PDF文档,获取二进制数据。
  3. 依次将数据写入到空白文档中。(如果单个PDF中有多页,需要一次一页往新建空白PDF中添加)
  4. 将合并后的PDF文档保存Blob对象
  5. 创建下载链接并且触发下载

实操

好的,根据上面的思路我们开始实现这个功能。

js 复制代码
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>
  );
}

实际效果

下面是简单效果展示

相关推荐
明月_清风2 分钟前
三件套快速上手 + 第一个可安装的 PWA(HTTPS + Manifest + 基础 Service Worker)
前端·pwa
菜鸟小芯3 分钟前
【GLM-5 陪练式前端新手入门】第三篇:网页导航栏 —— 搭建个人主页的 “指路牌”
前端
明月_清风8 分钟前
PWA 到底是什么?它在 2026 年解决了哪些真实痛点?
前端·pwa
甲枫叶23 分钟前
【claude产品经理系列13】核心功能实现——需求的增删改查全流程
java·前端·人工智能·python·产品经理·ai编程
蓝帆傲亦41 分钟前
Vue.js 大数据处理全景解析:从加载策略到渲染优化的完全手册
前端·vue.js·flutter
不会敲代码141 分钟前
React组件通信实战:从Todo应用彻底搞懂父子、子父、兄弟通信
前端·react.js
SuperEugene41 分钟前
字符串处理实战:模板字符串、split/join、正则的 80% 用法
前端·javascript·面试
wuhen_n42 分钟前
前端构建工具:从Rollup到Vite
前端
钟智强42 分钟前
深度剖析CVE-2023-41064与CVE-2023-4863:libwebp堆溢出漏洞的技术解剖与PoC构建实录
前端·后端
钟智强43 分钟前
MySQL客户端惊现高危漏洞CVE-2023-21980,可导致远程代码执行
前端·后端