Vue3实现将页面转成PDF并下载或直接打印

2023-11-07

步骤一:安装依赖包

npm i html2canvas
npm i jspdf

步骤二:在utils文件夹下新建htmlToPdf.js文件

// 页面导出为pdf格式
import html2Canvas from 'html2canvas';
import jsPDF from 'jspdf';

const htmlToPdf = {
  getPdf(title, loading) {
    // loading = true;
    console.log(loading);
    html2Canvas(document.querySelector('#pdfDom'), {
      allowTaint: false,
      taintTest: false,
      logging: false,
      useCORS: true,
      dpi: window.devicePixelRatio * 4, //将分辨率提高到特定的DPI 提高四倍
      scale: 4, //按比例增加分辨率
    }).then((canvas) => {
      var pdf = new jsPDF('p', 'mm', 'a4'); //A4纸,纵向
      var ctx = canvas.getContext('2d'),
        a4w = 190,
        a4h = 272, //A4大小,210mm x 297mm,四边各保留10mm的边距,显示区域190x277
        imgHeight = Math.floor((a4h * canvas.width) / a4w), //按A4显示比例换算一页图像的像素高度
        renderedHeight = 0;

      while (renderedHeight < canvas.height) {
        var page = document.createElement('canvas');
        page.width = canvas.width;
        page.height = Math.min(imgHeight, canvas.height - renderedHeight); //可能内容不足一页

        //用getImageData剪裁指定区域,并画到前面创建的canvas对象中
        page
          .getContext('2d')
          .putImageData(
            ctx.getImageData(
              0,
              renderedHeight,
              canvas.width,
              Math.min(imgHeight, canvas.height - renderedHeight),
            ),
            0,
            0,
          );
        pdf.addImage(
          page.toDataURL('image/jpeg', 1.0),
          'JPEG',
          10,
          10,
          a4w,
          Math.min(a4h, (a4w * page.height) / page.width),
        ); //添加图像到页面,保留10mm边距

        renderedHeight += imgHeight;
        if (renderedHeight < canvas.height) {
          pdf.addPage(); //如果后面还有内容,添加一个空页
        }
        // delete page;
      }
      //保存文件
      pdf.save(title + '.pdf');
      // loading = false;
      console.log(loading);
    });
  },
};

export default htmlToPdf;

步骤三:来到需要将vue转成pdf的页面

...
<!-- 按钮 -->
<el-button size="mini" type="primary" @click="pdfFunc" :loading="loading">
  转成pdf
</el-button>
...
<div id="pdfDom">
	<!-- 此处是希望转成pdf的部分的内容,用一个大div盒子包起来 -->
</div>
<script setup>
// 导入htmlToPdf.js
import htmlToPdf from '../utils/htmlToPdf';
const pdfFunc = () => {
	 loading.value = true;
	 // 调用htmlToPdf工具函数
     htmlToPdf.getPdf('文档名称');
     // 定时器模拟按钮loading动画的时间
      setTimeout(() => {
        loading.value = false;
        ElMessage.success('打印成功!');
      }, 1000);
}
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3实现将页面转成PDF并下载或直接打印 的相关文章

随机推荐

  • TP5.0: 显示错误信息

    在TP5中 我们运行的代码有错误无法执行时 只显示页面错误 而不显示错误信息 对我我来讲是无法接受滴 毕竟我还是个小渣渣 查看了百度 解决方案是 在application config php中找到 我们把false改成true即可 然后我
  • CUDA Samples: heat conduction(模拟热传导)

    以下CUDA sample是分别用C 和CUDA实现的模拟热传导生成的图像 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第七章 各个文件内容如下 funset cpp include funs
  • 【计算机视觉

    文章目录 一 分割 语义相关 12篇 1 1 MeViS A Large scale Benchmark for Video Segmentation with Motion Expressions 1 2 Likelihood Based
  • SCAU-OJ教材习题

    第三章 1 分期还款 加强版 从银行贷款金额为d 准备每月还款额为p 月利率为r 请编写程序输入这三个数值 计算并输出多少个月能够还清贷款 输出时保留1位小数 如果无法还清 请输出 God 计算公式如下 输入格式 三个数 分别为货款金额 每
  • 史上最全的Websocket入门教程

    websocket简介 websocket是什么 答 它是一种网络通信协议 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议 为什么需要websocket 疑问 我们已经有了 HTTP 协议 为什么还需要另一个协议
  • 【力扣】96. 不同的二叉搜索树 <动态规划>

    力扣 96 不同的二叉搜索树 给你一个整数 n 求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种 返回满足题意的二叉搜索树的种数 示例 1 输入 n 3 输出 5 示例 2 输入 n 1 输出 1 提示 1 l
  • Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!

    1 Lombok 使用演示 Lombok 使 同时使 Data 和 Builder 构建无参构造器报错 编译不通过 如下图 Lombok 使 Data 可以自动 成 参构造和类 所有属性的 getter setter 法 可以简化我们代码的
  • 【Matlab显示空间不足 help memory——已解决 + Matlab上保存的数据太大,导致保存的数据显示只有1KB——已解决】

    Matlab显示空间不足 help memory 已解决 Matlab上保存的数据太大 导致保存的数据显示只有1KB 已解决 问题描述 问题一 方案一 问题一 方案二 问题二 方案 问题描述 1 当处理一些matlab矩阵数据时会出现一些错
  • Flutter LayoutBuilder组件

    文章目录 Flutter LayoutBuilder组件 简书 使用 Flutter LayoutBuilder组件 简书 可以借助LayoutBuilder组件根据不同的屏幕尺寸显示不同的效果 如竖屏和横屏显示的样式不一样 屏幕尺寸介绍
  • 数据分析之非参数检验与二元逻辑回归结果不一致的原因

    在对两组数据进行非参数检验时 各项属性间无统计学差异 但以分类变量作为因变量使用二元逻辑回归进行分析时 其中存在属性p值小于0 05 即该变量对因变量的影响具有显著性 导致该情况的原因 可能是由于两个检验方法所用的假设和检验策略不同所致 非
  • 菜鸟电子面单打印

    一 首先开通电子面单服务 然后自己编辑一个模板 地址 https cloudprint cainiao com print 提示 这里不再详细说明 网上随便找了一个模板地址 如果不会 下面我会提供一个 没有关系 二 需要一台打印机 我的打印
  • 使用 Python 的ChatGPT API 的简单指南

    OpenAI 刚刚发布了 ChatGPT API 这是一个调用 GPT 3 5 Turbo 的 API 与 ChatGPT 产品中使用的模型相同 对于那些已经熟悉 Python 中的 OpenAI API 的人来说 学习如何使用 ChatG
  • Git安装和配置

    Git Gitee 官网安装配置教程 https gitee com help articles 4104 本文是以官网教程为基础而展开的实践笔记 初学者可以以本文为引入 但建议最终以官方文档为最终深入学习的参考 一 下载和安装Git 1
  • 关于scsi锁的故事

    最后更新2021 11 01 一不小心 已经11月了 冬天围着火锅烤串喝啤酒的好日子 scsi锁的出发点很正确 谁用谁锁 用后开锁 目的是避免并行访问的时候有其它不知情的访问变更了数据 更狠毒的是变更了meta数据 整体存储数据结构就乱掉了
  • 微信小程序卖货收费吗?企业公司商家要知道的

    有些小伙伴想做一个微信小程序卖货 就会咨询相关问题 例如微信小程序卖货收费吗 那么下面就和大家探探下这个问题 答案是 收费的 微信小程序卖货收费主要大致有三个地方 一 认证费用 在申请微信小程序账号的时候 要给小程序账号做认证 费用是300
  • 《TensorFlow深度学习》笔记

    import tensorflow as tf from tensorflow import keras from tensorflow keras import datasets import numpy as np import mat
  • phpstudy的mysql服务启动又停止

    前面装了一个MySQL 试了看到的各种方法都不行 试了一下phpmyadmin phpmyadmin通过点击上面的数据库工具打开 发现可以了
  • mongodb常用操作

    只显示某一字段 db extra third 2 2 find name 1 删除字段 db extra third 2 2 remove name null 导出某一个collection usr local app mongodb bi
  • linux永久自动挂载

    给sdb先分两个区 fdisk dev sdb vi etc fstab 永久挂载文件 第1列 挂载设备 想挂谁就写谁 第2列 挂载点 boot 想要永久挂载到根下d1或d2 在这里就写根下d1或d2 第3列 文件系统类型 xfs 格式化成
  • Vue3实现将页面转成PDF并下载或直接打印

    步骤一 安装依赖包 npm i html2canvas npm i jspdf 步骤二 在utils文件夹下新建htmlToPdf js文件 页面导出为pdf格式 import html2Canvas from html2canvas im