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

vue pc端/手机移动端 — 下载导出当前表格页面pdf格式

一、需求:在手机端/pc端实现一个表格页面(缴费单/体检报告单等)的导出功能,便于用户在本地浏览打印。

二、实现:之前在pc端做过预览打印的功能,使用的是print.js之类的方法让当前页面直接唤起打印机的打印预览功能,但是手机端这种方式不太友好,所以采用如下方式实现:

1.将要打印的页面转换成图片( 用到的组件 html2canvas );

2.然后将图片导出成PDF( 用到的组件 jspdf )。

  • 安装依赖:
npm install --save html2canvas  // 页面转图片
npm install jspdf --save  // 图片转pdf
  • 在utils文件夹创建一个pdf.js文件,实现页面转图片导出成A4纸大小的pdf文件;
import html2canvas from "html2canvas";
import jsPDF from "jspdf";/*** 导出pdf * @param {*} page 要打印的区域* @param {*} name 下载导出的名字*/
export const downloadPDF = (page, name) => {html2canvas(page).then(function (canvas) {canvas2PDF(canvas, name);});
};//图片转pdf
const canvas2PDF = (canvas, name) => {let contentWidth = canvas.width;let contentHeight = canvas.height;//a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高let imgWidth = 595.28;let imgHeight = (592.28 / contentWidth) * contentHeight;// 第一个参数: l:横向  p:纵向// 第二个参数:测量单位("pt","mm", "cm", "m", "in" or "px")let pdf = new jsPDF("p", "pt");pdf.addImage(canvas.toDataURL("image/jpeg", 1.0),"JPEG",0,0,imgWidth,imgHeight);pdf.save(name + "报告单.pdf");
};
  • 在要打印的页面触发这个下载导出的方法;
<template><div class="referralDetail"><van-nav-bartitle="报告单"left-arrowclass="blue-bar"@click-left="toBack"></van-nav-bar><!-- ref="print" 设置要打印的区域 --><div class="drawerBody" id="print" ref="print"><h1 class="formTitle">{{ infoObj.fromHospitalName || "" }}报告单</h1><span class="zzCode">报告编码:{{ infoObj.twrCode }}</span><div class="formContent"><div v-for="item in titleArr" :key="item.label" class="contentItem"><div class="itemTitle"><span>{{ item.label }}</span></div><div class="itemContent"><span>{{ infoObj[item.value] }}</span></div></div></div></div><van-tabbar class="content-tabbar"><div class="content-tabbar-block"><van-buttonsize="normal"color="#3378E0"@click="handleExport(infoObj.fromHospitalName)">导出</van-button></div></van-tabbar></div>
</template>
<script>
import { downloadPDF } from "@/utils/pdf.js"; // 工具方法,导出操作
export default {name: "referralDetail",data() {return {infoObj: {},titleArr: [{ value: "xxx", label: "患者姓名"},{ value: "xxx", label: "身份证号"},{ value: "xxx", label: "性别"},{ value: "xxx", label: "联系方式"},{ value: "xxx", label: "转入机构"},{ value: "xxx", label: "转诊类型"},{ value: "xxx", label: "审批医生"},{ value: "xxx", label: "接收科室"},{ value: "xxx", label: "转出机构"},{ value: "xxx", label: "转出科室"},{ value: "xxx", label: "转出医生"},{ value: "xxx", label: "申请日期"},{ value: "xxx", label: "转诊状态"},{ value: "xxx", label: "医保类型"},{ value: "xxx", label: "主要诊断"},{ value: "xxx", label: "病情等级"}],};},created() {if (this.$route.query) {this.infoObj = this.$route.query.infoData;}},methods: {// 导出handleExport(name) {//调用打印方法(打印区域,导出名称)downloadPDF(this.$refs.print, name);},// 倒退toBack() {this.$router.go(-1);},},
};
</script><style lang="less" scoped></style>
  • 界面效果如下: 

  •  点击导出按钮得到的pc端查看效果如下:

http://www.lryc.cn/news/176143.html

相关文章:

  • 125. 验证回文串 【简单题】
  • 描述性统计分析
  • Visual Studio2019 C++ 编程问题集锦
  • 链表的回文判断
  • 281_JSON_两段例子的比较,哪一段更简洁、易懂、没有那么多嵌套
  • 想要精通算法和SQL的成长之路 - 最长递增子序列 II(线段树的运用)
  • java用easyexcel按模版导出
  • Servlet执行流程生命周期方法介绍体系结构、Request和Response的功能详解
  • 软件工程之总体设计
  • 监控员工电脑文件拷贝记录:电脑怎么看员工复制文件的历史记录
  • vue中request.js中axios请求和(若依)文件通用下载方法封装
  • 【大数据存储与处理】1. hadoop单机伪分布安装和集群安装
  • linux通过time命令统计代码编译时间
  • logback日志是怎么保证多线程输出日志线程安全的
  • 2022年统计用区划代码表SQL 01
  • EM@基本初等函数@幂和根式@指数函数
  • 时序预测 | MATLAB实现NGO-GRU北方苍鹰算法优化门控循环单元时间序列预测
  • element 二次确认框,内容自定义处理
  • 【软件设计师-中级——刷题记录4(纯干货)】
  • 9.24 校招 实习 内推 面经
  • 第二章:25+ Python 数据操作教程(第二十五节用 PYTHON 和 R 制作祝福圣诞节)持续更新
  • 你是怎么理解自动化测试的?理解自动化测试的目的和本质
  • 二十六、MySQL并发事务问题:脏读/不可重复读/幻读
  • RK3588平台开发系列讲解(项目篇)视频监控之RTMP推流
  • http基础教程(超详细)
  • Vue3 <script setup> 单文件组件 组合式 API 相关语法
  • 为什么说网络安全是IT行业最后的红利?是风口行业?
  • DD5 进制转换
  • 操作系统权限提升(二十七)之数据库提权-MySQL MOF提权
  • springcloud:四、nacos介绍+启动+服务分级存储模型/集群+NacosRule负载均衡