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

前端使用pdf-lib库实现pdf合并,window.open预览合并后的pdf

最近出差开了好多发票,写了一个pdf合并网站,用于把多张发票pdf合并成一张,方便打印

使用pdf-lib这个库实现的pdf合并功能,预览使用的是浏览器自身查看pdf功能
源码

网页地址 https://zqy233.github.io/PDF-merge/

<!DOCTYPE html>
<html><head><title>PDF合并</title><script src="https://cdn.jsdelivr.net/npm/pdf-lib@1.17.1/dist/pdf-lib.min.js"></script></head><body><input type="file" id="fileInput" multiple /><button onclick="previewMergePDF()">预览合并的PDF</button><button onclick="downloadMergePDF()">下载合并的PDF</button><script>async function previewMergePDF() {const fileInput = document.getElementById("fileInput");const files = fileInput.files;if (files.length < 2) {alert("请至少选择两个PDF文件进行合并!");return;}// 创建一个新的PDF文档const mergedPdf = await PDFLib.PDFDocument.create();// 遍历选择的每个文件for (let i = 0; i < files.length; i++) {const file = files[i];const reader = new FileReader();// 读取文件内容const fileContents = await new Promise((resolve, reject) => {reader.onload = function (event) {resolve(event.target.result);};reader.onerror = function (event) {reject(new Error("文件读取错误。"));};reader.readAsArrayBuffer(file);});// 将PDF文件添加到合并的PDF文档中const pdf = await PDFLib.PDFDocument.load(fileContents);const copiedPages = await mergedPdf.copyPages(pdf,pdf.getPageIndices());copiedPages.forEach((page) => {mergedPdf.addPage(page);});}// 使用浏览器自带预览功能,预览合并后的PDFconst mergedPdfBytes = await mergedPdf.save();const mergedPdfBlob = new Blob([mergedPdfBytes], {type: "application/pdf",});const fileURL = URL.createObjectURL(mergedPdfBlob);window.open(fileURL);}async function downloadMergePDF() {const fileInput = document.getElementById("fileInput");const files = fileInput.files;if (files.length < 2) {alert("请至少选择两个PDF文件进行合并!");return;}const mergedPdf = await PDFLib.PDFDocument.create();for (let i = 0; i < files.length; i++) {const file = files[i];const reader = new FileReader();const fileContents = await new Promise((resolve, reject) => {reader.onload = function (event) {resolve(event.target.result);};reader.onerror = function (event) {reject(new Error("文件读取错误。"));};reader.readAsArrayBuffer(file);});const pdf = await PDFLib.PDFDocument.load(fileContents);const copiedPages = await mergedPdf.copyPages(pdf,pdf.getPageIndices());copiedPages.forEach((page) => {mergedPdf.addPage(page);});}const mergedPdfFile = await mergedPdf.saveAsBase64();const downloadLink = document.createElement("a");downloadLink.href = "data:application/pdf;base64," + mergedPdfFile;downloadLink.download = "merged.pdf";downloadLink.click();}</script></body>
</html>
http://www.lryc.cn/news/94390.html

相关文章:

  • 计算机网络相关知识点总结(二)
  • Redmine与Gitlab整合(实战版)
  • (3)深度学习学习笔记-简单线性模型
  • pytorch3d 安装报错 RuntimeError: Not compiled with GPU support pytorch3d
  • spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?
  • 使用 Zabbix 监控 RocketMQ列举监控项和触发器
  • uniApp:路由与页面跳转及传参
  • Java中操作文件(二)
  • springboot+vue在线考试系统(java项目源码+文档)
  • 样式方案:在 Vite 中接入现代化的 CSS 工程化方案
  • C#获取根目录实现方法汇总
  • vue获取当前坐标并通过天地图逆转码为省市区
  • 【MySQL】事务及其隔离性/隔离级别
  • 计算机由于找不到d3dx9_35.dll,无法启动软件游戏的三个修复方法
  • 第三章 模型篇:模型与模型的搭建
  • 深度学习一些简单概念的整理笔记
  • Vue3中引入Element-plus
  • 如何查看 Facebook 公共主页的广告数量上限?
  • U-Boot移植 (2)- LCD 驱动修改和网络驱动修改
  • Ubuntu 23.10 现在由Linux内核6.3提供支持
  • Python 学习之NumPy(一)
  • Nftables栈溢出漏洞(CVE-2022-1015)复现
  • 【C++】 Qt-事件(上)(事件、重写事件、事件分发)
  • k8s部署springboot
  • 备战秋招002(20230704)
  • 游泳买耳机买什么的比较好,列举几款实战性好的游泳耳机
  • 【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
  • Java基础-多线程JUC-生产者和消费者
  • day2 QT按钮与容器
  • JPA 批量插入较大数据 解决性能慢问题