前端通过 jspdf 和 html2canvas 工具将网页生成 pdf

由于 html2canvas 的性能问题,该方案对于页数比较多的场景生成的非常慢,可以试着使用 modern-screenshot 工具看是否性能会得到提升。

javascript 复制代码
import html2canvas from 'html2canvas'
import { jsPDF } from 'jspdf'

async function exportPdf(){
  const pages = document.querySelectorAll('.report-page')
  if (!pages.length) return
  const doc = new jsPDF({
    orientation: pageConfig.pageDirection as // 页面方向
      | 'p'
      | 'portrait'
      | 'l'
      | 'landscape'
      | undefined,
    format: pageConfig.pageSize, // 页面大小,例如 'A4'
    unit: 'mm',
  })
  for (const [i, page] of pages.entries()) {
    curPage.value = i + 1 // 当前页码
    if (i !== 0) {
      doc.addPage(
        pageConfig.pageSize,
        pageConfig.pageDirection as
          | 'p'
          | 'portrait'
          | 'l'
          | 'landscape'
          | undefined,
      )
    }
    page.style.border = 'none'
    const canvas = await html2canvas(page, {
      scale: 5,
    })
    const isNormalPage = pageConfig.value.pageDirection === 'p'
    doc.addImage({
      imageData: canvas.toDataURL('image/jpeg'),
      format: 'JPEG',
      x: 0,
      y: 0,
      width: isNormalPage
        ? pageConfig.pageWidth
        : pageConfig.pageHeight,
      height: isNormalPage
        ? pageConfig.pageHeight
        : pageConfig.pageWidth,
    })
  }
  const rawdata = doc.output('datauristring')
  window.pdfData = rawdata
  doc.save(`${pageConfig.name || '预览'}.pdf`)
}

执行完 doc.save 后会自动触发浏览器下载。

相关推荐
小羊没烦恼!8 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
Highcharts.js9 小时前
AI图表开发工具Highcharts Assist|自然语言生成图表代码
javascript·人工智能·highcharts·开发神器
志尊宝9 小时前
Vue3 零基础每日笔记(087):Vue3 高频面试题(下)
前端·javascript·vue.js·笔记·ecmascript·#vue.js
const_qiu11 小时前
第二章 2.6:初始化 NestJS 服务端 —— TypeScript 后端框架体验
前端·javascript·typescript
miofly12 小时前
GitHub 今日推荐|sweety-handdraw-video:文章转手绘口播视频
javascript·开源·github
ydjs678899-bot12 小时前
如何在Java中打印pdf静默打印和打印对话框选择
java·python·pdf
用户831348593069813 小时前
Vue3 事件:常用用法与开发高频坑点
前端·javascript·vue.js
漫步人生走在路上13 小时前
用小语种SEO突破外贸B2B天花板:法语、德语市场的实测数据
开发语言·前端·javascript·人工智能·搜索引擎·ecmascript
SamChan9014 小时前
PDF 翻译后 1,250 变成 1.250,是错了吗?用 Python 核对数字格式
python·pdf·ocr·数据校验·文档翻译
ydjs678899-bot14 小时前
您的Next.js中间件匹配器配置可能会跳过您认为它保护的路由
开发语言·javascript·中间件