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

news2024/11/27 21:44:41

一、需求:在手机端/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-bar
      title="报告单"
      left-arrow
      class="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-button
          size="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.coloradmin.cn/o/1042193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

win11、win10使用python代码打开和关闭wifi热点的正确方法

问题一 win10、win11&#xff0c;可以在任务栏的WIFI图标启动移动热点&#xff0c;但是无法设置SSID和密码。在网上搜索好久&#xff0c;无解。 万能的网络解决不了&#xff0c;只能自己动手解决了。 问题二 我当前的WiFi驱动程序不支持承载网络&#xff0c;如果我输入netsh…

JMeter+Python 实现异步接口测试

当使用JMeter和Python来实现异步接口测试时&#xff0c;可以按照以下步骤进行操作&#xff1a; 1、安装JMeter和Java Development Kit&#xff08;JDK&#xff09;&#xff1a; 下载并安装JMeter&#xff08;https://jmeter.apache.org/download_jmeter.cgi&#xff09;和适用…

数组06-滑动窗口

目录 LeetCode——209. 长度最小的子数组 分析&#xff1a; LeetCode——844. 比较含退格的字符串 分析&#xff1a; LeetCode——209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续…

Apache Doris 行列转换可以这样玩

行列转换在做报表分析时还是经常会遇到的&#xff0c;今天就说一下如何实现行列转换吧。 行列转换就是如下图所示两种展示形式的互相转换 1. 行转列 我们来看一个简单的例子&#xff0c;我们要把下面这个表的数据&#xff0c;转换成图二的样式 image-20230914151818953.png …

计算机网络补充

未分类文档 CDMA是码分多路复用技术 和CMSA不是一个东西 UPD是只确保发送 但是接收端收到之后(使用检验和校验 除了检验的部分相加 对比检验和是否相等。如果不相同就丢弃。 复用和分用是发生在上层和下层的问题。通过比如时分多路复用 频分多路复用等。TCP IP 应用层的IO多路…

Coupang新手教程,Coupang怎么收款?——站斧浏览器

coupang新手教程 韩国coupang入驻条件很简单&#xff0c;只需要你提供注册四件套就可以了&#xff1b; Coupang的经营模式呢可以说和我们国内的电商比较像&#xff1b; 前期可以做无货源模式&#xff1b;在熟悉平台一段时间后&#xff0c;可以去打造我们自己的精品店铺&…

start()方法源码分析

当我们创建好一个线程之后&#xff0c;可以调用.start()方法进行启动&#xff0c;start()方法的内部其实是调用本地的start0()方法&#xff0c; 其实Thread.java这个类中的方法在底层的Thread.c文件中都是一一对应的&#xff0c;在Thread.c中start0方法的底层调用了jvm.cpp文件…

Python机器学习实战-特征重要性分析方法(4):相关性分析(附源码和实现效果)

实现功能 计算各特征与目标变量之间的相关性。相关性越高的特征越重要。 实现代码 import pandas as pd from sklearn.datasets import load_breast_cancer import matplotlib.pyplot as pltX, y load_breast_cancer(return_X_yTrue) df pd.DataFrame(X, columnsrange(30)…

TLS/SSL(八) 基于ECC椭圆曲线的ECDH协议

一 ECC椭圆曲线的特性 ① DH密钥交换两个问题 1、计算过程含有大量的乘法,运算速度比较慢2、安全性基于大因数分解比较困难,需要比较长的密钥位数说明&#xff1a; 互联网主要使用ECDH的密钥交换协议,是基于DH密钥交换协议的升级备注&#xff1a; ECDH基于ECC椭圆曲线的原…

【咕咕送书第二期】| 计算机网络对于考研的重要性?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言什么是计算机网络&#xff1f;01 为什么计算机专业要学计算机网络02 计算机网络对考研的重要性 …

【二叉树】——链式结构(快速掌握递归与刷题技巧)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

通过Python爬虫代理IP快速增加博客阅读量

前言 Python爬虫代理IP可以让你快速增加博客阅读量&#xff0c;因为它可以让你绕过一些反爬虫限制。本文将分享如何使用Python爬虫代理IP&#xff0c;以及如何使用它们来获取更多的博客阅读量。 一. 什么是代理IP 代理IP是一种在网络环境下使用的IP地址&#xff0c;它可以隐藏…

Renderbus瑞云渲染现在支持3dsMax 2024了

Autodesk于今年3月份发布了最新版本的3ds Max软件&#xff0c;其中包含令人兴奋的新功能和增强功能。3ds Max 2024渲染功能暂时可与V-Ray 6.1.2和corona 10配合使用&#xff0c;直至更多渲染引擎发布更新。而您现在可以在Renderbus瑞云渲染平台使用最新版本的3ds Max 2024。 关…

MybatisPlus两表关联查询MyBatis-Plus-Join

MybatisPlus两表关联查询MyBatis-Plus-Join 介绍 首先&#xff0c;让我们先了解一下MyBatis和MyBatis-Plus。MyBatis是一个流行的Java持久层框架&#xff0c;它提供了一种简单而强大的方式来将数据库操作与Java代码进行绑定。而MyBatis-Plus是基于MyBatis的增强工具&#xff0…

【异常报错】must call Vue.use(Vuex)

这个错误应该是在创建Vuex中出现的 把你main.js中的Vue.use(Vuex)写到store中&#xff0c;这里我的store/index.js中,即完美解决 其实仔细想想也可以发现&#xff0c;import就把整个文件给引入了&#xff0c;而index.js中有创建Store的实例&#xff0c;而在这时我们还没有Vue.…

【JAVA进阶】多线程

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 前言&#xff1a; 什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 public…

使用HHDBCS管理Redis

Redis是一款内存高速缓存数据库&#xff0c;可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。 因此&#xff0c;根据需要&#xff0c;HHDBCS在主页设置了“发布窗口”及“订阅窗口”。 1 连接redis 打开HHDBCS&#xff0c;在数据库类型中选择Redis&#…

MATLAB实战 | 粮食储仓的通风控制问题

粮食储仓的通风控制问题 01、应用实战 【例1】粮食储仓的通风控制问题。在粮食储备中&#xff0c;合适的湿度是保证粮食质量的前提。一般来说&#xff0c;若粮食水分的吸收和蒸发量相等&#xff0c;这个湿度称为平衡点湿度。只有实际湿度处于平衡点湿度以下&#xff0c;粮食质…

SpringMVC-请求与相应

一、环境准备 <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope> //确定范围避免与tomcat冲突</de…

iOS-自定义Intent及ShortCut,能通过快捷指令唤醒APP并跳转到指定页面

1.Xcode->New->File->搜索Intent 2.在新建的intent文件中中New intent 3.完善资料&#xff0c;内容可自定义 4.创建Extension&#xff0c;file -> new -> target , 选择 Intents Extension 即可 创建完成后&#xff0c;在intents文件中勾选以下target&#xff0…