Vue实现网页转PDF方法流程详解

目录
  • 需求背景
  • 功能要求
  • 功能实现过程
    • window.print()方法
    • 使用html2canvas+jspdf实现

需求背景

我们平台在发货的时候需要打一张发货单,这张发货单上面需要显示客户的收货地址、发货地址、商品的特征信息和库存,以及订单金额等等内容。

功能要求

要求在页面中的订单详情页面点击某一个按钮,然后下载一个写好样式的PDF。

功能实现过程

window.print()方法

使用这个方法可以调起浏览器自带的打印方法,这个方法比较省事,直接写一个方法,然后绑定给按钮就完事。还能预览和选择打印的纸张大小简直yyds。但是不能高兴的太早,这样会将浏览器的整个内容都打印下来。作为发货使用肯定是不合适的,我们在网购时收到的发货单也没有带着页面菜单和页脚的,所以这个方案行不通。

function print(){
	window.print();
}

使用html2canvas+jspdf实现

既然是第三方的库还是要免不了的要安装,安装使用如下语句:

npm i --save html2canvas jspdf

操作方法是首先使用html2canvas将页面中选定的元素转换成图片,然后将图片插入到pdf中,接着再下载下来。

使用import导入到项目中以后就能直接使用了。

在这里使用

    print(orderNo) {
      // 当下载pdf时,若不在页面顶部会造成PDF样式不对,所以先回到页面顶部再下载
      let top = this.$refs.wrap;
      if (top != null) {
        top.scrollIntoView();
        top = null;
      }
      html2canvas(this.$refs.wrap, {
        allowTaint: true,
      }).then(function (canvas) {
        const pageData = canvas.toDataURL("image/jpeg", 1.0);
        //p表示纵向,l表示横向,px是单位 ,[宽,长]->[x,y]
        const PDF = new JsPdf("p", "px", [2550, 3100]);
        PDF.addImage(pageData, "JPEG", 0, 0, 2550, 3100);
        PDF.save(orderNo + ".pdf");
      });
    },

需要注意的是这里的尺寸,因为我们尺寸已经定死了。所以我这里就直接写死,JsPdf这个构造函数默认使用的尺寸是A4的,打印多页的时候还要计算高度,分页,这些可以参考下面的代码

    print(orderNo) {
      // 当下载pdf时,若不在页面顶部会造成PDF样式不对,所以先回到页面顶部再下载
      let top = this.$refs.wrap;
      if (top != null) {
        top.scrollIntoView();
        top = null;
      }
      html2canvas(this.$refs.wrap, {
        allowTaint: true,
      }).then(function (canvas) {
        const contentWidth = canvas.width;
        const contentHeight = canvas.height;
        //一页pdf显示html页面生成的canvas高度;
        let pageHeight = (contentWidth / 592.28) * 841.89;
        //未生成pdf的html页面高度
        let leftHeight = contentHeight;
        //页面偏移
        let position = 0;
        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
        let imgWidth = 595.28;
        let imgHeight = (592.28 / contentWidth) * contentHeight;
        let pageData = canvas.toDataURL("image/jpeg", 1.0);
        const PDF = new jsPDF("", "pt", "a4");
        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
        //当内容未超过pdf一页显示的范围,无需分页
        if (leftHeight < pageHeight) {
          PDF.addImage(pageData, "JPEG", 0, 0, imgWidth, imgHeight);
        } else {
          while (leftHeight > 0) {
            PDF.addImage(pageData, "JPEG", 0, position, imgWidth, imgHeight);
            leftHeight -= pageHeight;
            position -= 841.89;
            //避免添加空白页
            if (leftHeight > 0) {
              PDF.addPage();
            }
          }
        }
        // const pageData = canvas.toDataURL("image/jpeg", 1.0);
        // //p表示纵向,l表示横向,px是单位 ,[宽,长]->[x,y]
        // const PDF = new JsPdf("p", "px", [2550, 3100]);
        // PDF.addImage(pageData, "JPEG", 0, 0, 2550, 3100);
        PDF.save(orderNo + ".pdf");
      });
    },

HTML:

只需要在warp中写好要相应的模版,然后先请求相关数据渲染。之后调用上面的print打印内容。

然后将内容进行隐藏,编写css代码:

.print {
  position: fixed;
  background-color: #fff;
  height: 0px;
  // width: 0px;
  overflow: hidden;
  .header {
    padding: 20px;
    text-align: right;
  }
  .wrap {
    // display: none;
    padding: 186px 107px 114px 107px;
    // overflow: scroll;
  }
  .slip {
    display: flex;
    flex-direction: column;
    padding: 81px;
    border: 2px solid #000000;
    position: relative;
    width: 2336px;
    height: 3000px;
    .title {
      display: block;
      padding: 0px 20px;
      position: absolute;
      top: -60px;
      left: 50%;
      transform: translateX(-50%);
      font-style: normal;
      font-weight: 600;
      font-size: 112px;
      line-height: 131px;
      color: #000000;
      background-color: #fff;
    }
   }
  }

将将父盒子的height设置为零,overflow设置为hidden,然后在讲内容提取到一个vue文件当中,父组件中应用这个打印组件,并绑定一个ref,在父父组件中使用this.$refs.xxx.print()来打印,当点击打印按钮的时候,只需要调用这个方法,如果需要从服务端获取数据,就需要先执行请求数据的操作,然后再掉用打印数据的操作。

如下所示:

调用:还可以传递参数,这里我传递了订单号,首先会先通过订单号请求相关的数据,然后打印内容。

到此这篇关于Vue实现网页转PDF方法流程详解的文章就介绍到这了,更多相关Vue网页转PDF内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue3如何实现PDF文件在线预览功能

    目录 概述 正文 创建 vue3 项目 添加 PDF 预览插件 总结 概述 之前我们用 Reactjs + React-PDF 实现了 React 版的 PDF 文件预览,今天我们用 Vue3 + Vue-PDF 实现 Vue 版本的 PDF 文件在线预览功能. 我们先来看看完成后效果 正文 创建 vue3 项目 我们先创建一个的 Vue3 项目, 在终端中输入命令 pnpm create vite vue-pdf-preview 选择 vue-ts 回车,cd 进入项目根目录,执行 pnpm

  • vue中如何使用embed标签PDF预览

    目录 使用embed标签PDF预览 embed的四个属性 使用vue-pdf预览开发正常,打包报错work.js404 解决方式 使用embed标签PDF预览 embed的四个属性 <el-row type="flex" class="row-bg" justify="space-between"> <el-col :span="12"> <embed :src='srcSourceLan' ty

  • 基于Vue实现HTML转PDF并导出

    目录 前言 方案一 问题 解决方案 方案二 使用 问题及解决方案 方案三(推荐) 总结 前言 近期公司提出了一个新需求,希望前端能够根据UI设计绘制运动报告界面,完成数据展示,包括图标展示,并且能够将HTML页面转为PDF并实现下载.基于公司需求,查询了很多资料,最后选定了三种技术方案,并完成Demo,当然三种方案都有优缺点,所以还需要老大根据效果选定最终实现方案. 方案一 window.print浏览器打印是一个非常成熟的东西,直接调用window.print或者document.execCo

  • Vue页面生成PDF的最佳方法推荐

    目录 前言 安装依赖 页面转图片 图片转PDF A4打印适配 总结 前言 最近项目有个需求,将系统统计的数据生成分析报告,然后可以导出成PDF. 这种方法可以有两种,一种是直接调用打印,用户通过浏览器提供的打印页面手动选择导出PDF.当然这种方式兼容性差,且体验不好,显然不是我们想要的效果. 那么第二种方法的实现思路是什么呢? 首先生成报告页面,也就是常规页面: 然后将页面转换成图片( 用到的组件 html2canvas ): 最后将图片导出成PDF( 用到的组件 jspdf ). 安装依赖 n

  • vue实现pdf文件发送到邮箱功能的示例代码

    需求: vue实现pdf文件发送到邮箱功能 <!-- 弹窗 --> <van-popup v-model="showEmail" closeable class="contactTel" :close-on-click-overlay="false" @close="closeEmail"> <div class="popup-header fontSize36"> 发送

  • Vue实现网页转PDF方法流程详解

    目录 需求背景 功能要求 功能实现过程 window.print()方法 使用html2canvas+jspdf实现 需求背景 我们平台在发货的时候需要打一张发货单,这张发货单上面需要显示客户的收货地址.发货地址.商品的特征信息和库存,以及订单金额等等内容. 功能要求 要求在页面中的订单详情页面点击某一个按钮,然后下载一个写好样式的PDF. 功能实现过程 window.print()方法 使用这个方法可以调起浏览器自带的打印方法,这个方法比较省事,直接写一个方法,然后绑定给按钮就完事.还能预览和

  • vue cli实现项目登陆页面流程详解

    目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css(css.txt) 2.3 配置路由 2.4 在Login组件中将提交按键调整为100%宽度 2.5 运行效果 3. 后台交互 3.1 引入axios 3.2 axios/qs/vue-axios安装与使用 3.2.1 安装axios 3.2.2 发送get请求 3.2.3 发送post请求 3.2.4 简化axios使

  • Vue.js框架路由使用方法实例详解

    Vue.js框架路由使用方法实例详解 html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name='viewport' content='width=device-width,initial-

  • vue全局使用axios的方法实例详解

    在vue项目开发中,我们使用axios进行ajax请求,很多人一开始使用axios的方式,会当成vue-resoure的使用方式来用,即在主入口文件引入import VueResource from 'vue-resource'之后,直接使用Vue.use(VueResource)之后即可将该插件全局引用了,所以axios这样使用的时候就报错了,很懵逼. 仔细看看文档,就知道axios 是一个基于 promise 的 HTTP 库,axios并没有install 方法,所以是不能使用vue.us

  • Vue多环境代理配置方法思路详解

    背景: 多人协作模式下,修改代理比较麻烦,而且很容易某个开发人员会修改了vue.config.js文件后提交了. 第一,很容易引起冲突. 第二,很容易出现代理错误,需要排查.而且现在微服务盛行,在生产环境下有网关配置,不会出错,但是在本地调试会造成麻烦,如修改了代理地址需要同步修改代理中的地址,很麻烦也很容易出错. 解决思路: 1.开发中定义常量js文件,例如constants.js.用户存放各个服务需要代理的服务名. let api = "" let loginServer = &q

  • vue父子组件的通信方法(实例详解)

    一.父组件向子组件传递数据 1.首先形成父子组件关系 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/vue.js"></script> </head> <body>

  • vue 动态表单开发方法案例详解

    本文实例讲述了vue 动态表单开发方法.分享给大家供大家参考,具体如下: 概要 动态表单指的是我们的表单不是通过vue 组件一个个编写的,我们的表单是根据后端生成的vue模板,在前端通过vue构建出来的.主要的思路是,在后端生成vue的模板,前端通过ajax的方式加载后端的表单模板,权限数据和表单数据,在前端使用vue进行构建出来. 表单渲染过程. 实现步骤 1.在前端开发表单组件,比如用户组件,文本输入组件. 在平台中我们可以看到我们开发的组件. 组件的开发在第三篇有介绍. 我们定义的组件和后

  • Vue登录功能的实现流程详解

    目录 Vue项目中实现登录大致思路 安装插件 创建store 封装axios qs vue 插件 api.js的作用 路由拦截 登录页面实际使用 Vue项目中实现登录大致思路 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个token 3.前端拿到token,将token存储到localStorage和vuex中,并跳转路由页面 4.前端每次跳转路由,就判断 localStroage 中有无 token ,没有就跳转到登

  • Vue openLayers实现图层数据切换与加载流程详解

    目录 openlayers介绍 一.实现效果预览 二.代码实现 openlayers介绍 OpenLayers是一个用于开发WebGIS客户端的JavaScript包.OpenLayers 支持的地图来源包括Google Maps.Yahoo. Map.微软Virtual Earth 等,用户还可以用简单的图片地图作为背景图,与其他的图层在OpenLayers 中进行叠加,在这一方面OpenLayers提供了非常多的选择.OpenLayers采用面向对象方式开发. OpenLayers 是一个专

  • Vue echarts模拟后端数据流程详解

    目录 KOA2的使用 安装 Koa app.js入口文件 KOA2的使用 KOA2是由Express 原班人马打造. 环境依赖 Node v7.6.0 及以上. 支持 async 和 await 洋葱模型的中间件 写响应函数(中间件) 响应函数是通过use的方式才能产生效果, 这个函数有两个参数, ctx :上下文, 指的是请求所处于的Web容器,我们可以通过 ctx.request 拿到请求对象, 也可 以通过 ctx.response 拿到响应对象 next :内层中间件执行的入口 模拟服务

随机推荐