当前位置: 首页 > backend >正文

前端将多个PDF链接的内容拼接成一个后返回出一个链接进行打开

1、引用了 “pdf-lib”库,它提供了一组丰富的功能,可以在客户端和服务器端中对PDF文件进行各种操作。

要对应 node 版本进行下载对应 “pdf-lib”库的依赖(直接问下AI);

node:v18.20.4

pdf-lib:"^1.17.1"

这是我这边的版本,如果一样的话可以直接下载依赖

安装命令:

yarn add pdf-lib
//指定版本
yarn add pdf-lib@1.17.1

2、安装完在需要的页面进行引用

import { PDFDocument } from 'pdf-lib';

3、思路:

  • 创建一个空白的PDF文档
  • 遍历即将合并的PDF文档,获取二进制数据
  • 依次将数据写入到空白文档中(如果单个PDF中有多页,需要一次一页往新建空白PDF中添加)
  • 将合并后的PDF文档保存为Blob对象
  • 创建URL并返回

4、具体代码实现:

// 将多个PDF链接的内容拼接成一个后返回出一个链接进行打开
const pdfLinkPrint = async (links: string[]) => {async function mergePDFs(links) {try {// 创建一个新的空白PDF文档const mergedPdfDoc = await PDFDocument.create();for (const pdfUrl of links) {// 获取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: any) => mergedPdfDoc.addPage(page));}// 将合并后的PDF保存为Blob对象const mergedPdfBytes = await mergedPdfDoc.save();const mergedPdfBlob = new Blob([mergedPdfBytes], { type: 'application/pdf' });return URL.createObjectURL(mergedPdfBlob);} catch {}}if (!links.length) return;const url = links.length === 1 ? links[0] : await mergePDFs(links);const newWindow = window.open(url);//判断新窗口是否已打开if (newWindow) {newWindow.onload = () => {setTimeout(() => {URL.revokeObjectURL(urls); // 释放 Blob URL}, 1000);};}
};

 5、最终的实现效果:

http://www.xdnf.cn/news/13716.html

相关文章:

  • 一起学习swin-transformer(一)
  • STM32开发GCC常用编译选项
  • 计组刷题日记(1)
  • 快速熟悉公司的服务器开发环境需要系统
  • 软件测试之APP测试要点(包含Monkey基础使用)
  • 如何创建vue工程?以及遇到问题的解决方法
  • vue3提供的hook和通常的函数有什么区别
  • Python直接访问Windows API库之pywin32使用详解
  • mysql递归查询所有父节点拼接父节点名称
  • 使用Gradle打包springboot项目为JAR包教程
  • 蓝凌EKP产品:低门槛、可扩展、可视化公式引擎应用示例
  • 功能化组件编码流程-2(延续上一章)
  • 《HarmonyOSNext属性动画实战手册:让UI丝滑起舞的魔法指南》
  • 人工智能新范式:从大模型到智能体的演化逻辑
  • 语音信号处理三十——高效多相抽取器(Polyphase+Noble)
  • Java并发编程实战 Day 18:线程池深度剖析与自定义实现
  • 工业自动化网关在饮料行业中的应用:DeviceNet转Modbus RTU协议转换网关案例
  • sssssssssssss
  • 电子电路原理第十八章(有源滤波器)
  • 【C#如何计算从某一个日期到今天过了多少天】2022-4-24
  • 94. 评论日记
  • Linux CPU 亲和性
  • ARM架构下安装mysql8.0
  • Dagster软件定义资产(SDA)完全指南:从概念到落地实践
  • 研发效能提升--质量改进完美闭环
  • TTS走向拟人化时代:数据堂高质量语音资源全面支撑模型升级
  • 库架一体式货架:重塑现代仓储空间的智能解决方案
  • 简单的五子棋实现简介
  • 【【大模型训练】中短序列attention 和MOE层并行方式】(三)
  • 从编辑到安全设置: 如何满足专业文档PDF处理需求