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

vue2使用pdfjs-dist和jsPDF生成pdf文件

vue2使用pdfjs-dist和jsPDF生成pdf文件

1、安装依赖

npm install pdfjs-dist@2.6.347

2、引入依赖

import { jsPDF } from 'jspdf'
// 使用require方式导入pdfjs-dist v2.5.207,高版本报错(import导入会报错:GlobalWorkerOptions undefined)
this.pdfjsLib = require('pdfjs-dist/build/pdf')
this.pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.js'// 将pdfjs-dist/build/pdf.worker.js文件复制到public下

3、使用

/**
 * 使用pdfjs-dist将每一页pdf转为图片(canvas->图片数据url)
 * 使用jspdf将图片合并为新的pdf(pdf-lib不支持图片直接转为pdf页面)
 */
const pdfDoc = await this.pdfjsLib.getDocument(pdfBytes).promise
const outputPdf = new jsPDF(true)
let i = 1
for (i = 1; i <= pdfDoc.numPages; i++) {
  const page = await pdfDoc.getPage(i)

  const viewport = page.getViewport({ scale: 1.9 })
  const canvas = document.createElement('canvas')
  const context = canvas.getContext('2d')
  canvas.width = viewport.width
  canvas.height = viewport.height

  // Render PDF page into canvas
  await page.render({ canvasContext: context, viewport }).promise

  // Add canvas as image to PDF
  const imgData = canvas.toDataURL('image/png')
  if (i > 1) {
    outputPdf.addPage()
  }
  outputPdf.addImage(imgData, 'PNG', 0, 0, 210, 297, undefined, 'FAST') // A4 size

  canvas.remove() // Clean up
}

// Save the new PDF
const pdfblob = outputPdf.output('blob')
const url = window.URL.createObjectURL(pdfblob)

// 下载到本地
// const url = window.URL.createObjectURL(new Blob([mergedPdfFile.buffer]))
const link = document.createElement('a')
link.href = url
link.setAttribute('download', 'test.pdf')
document.body.appendChild(link)
link.click()

4、注意
1)pdfjs-dist安装低版本,高版本报错
2)如需压缩图片

new jsPDF(true)
outputPdf.addImage(imgData, ‘PNG’, 0, 0, 210, 297, undefined, ‘FAST’)

3)如果将多个图像添加到一个文档中,请使用

outputPdf.addImage(imgData, 'PNG', 0, 0, 210, 297, undefined, 'FAST')

而不是

outputPdf.addImage(imgData, 'PNG', 0, 0, 210, 297, '', 'FAST')

否则第一张图片将替换所有其他图片


http://www.kler.cn/a/457469.html

相关文章:

  • 启航数据结构算法之雅舟,悠游C++智慧之旅——线性艺术:顺序表之细腻探索
  • MySQL 08 章——聚合函数
  • ROS导航使用贝塞尔曲线对全局路径进行平滑处理
  • Flutter中的网络请求图片存储为缓存,与定制删除本地缓存
  • QQ长截屏
  • 二、AI知识(神经网络)
  • 多显卡服务器如何设置使用集成显卡输出信号?
  • 从零开始开发纯血鸿蒙应用之UI封装
  • HarmonyOS NEXT应用开发实战:一分钟写一个网络接口,JsonFormat插件推荐
  • java开发配置文件集合
  • E6 中的 扩展运算符(Spread) 和 剩余运算符(Rest)
  • 游戏陪玩系统:国际版JAVA游戏陪玩系统源码陪练APP源码H5源码电竞系统源码支持Android+IOS+H5
  • 最新常见的图数据库对比,选型,架构,性能对比
  • 大数据技术-Hadoop(二)HDFS的介绍与使用
  • 深度学习笔记(6)——循环神经网络RNN
  • 折腾日记:如何让吃灰笔记本发挥余热——搭建一个相册服务
  • 工程师如何平衡工作和生活?
  • redis开发与运维-redis04-redis客户端Jedis与连接池及客户端异常模拟
  • python学习笔记——类和对象
  • 道路倒角 三角网 两侧偏移
  • 2025最新植物大战僵尸杂交版3.0.2版本
  • 埃斯顿机器人程序案例多个点位使用变量
  • 微服务架构与 Spring Cloud 相关技术解读
  • 程序猿成长之路之设计模式篇——结构型设计模式
  • C 中如何在For中生成不重复的随机数
  • 【Chrome】浏览器提示警告Chrome is moving towards a new experience