首页 > 其他分享 >vue 页面导出为pdf与word

vue 页面导出为pdf与word

时间:2023-09-11 12:23:26浏览次数:45  
标签:vue word 导出 let error pdf docxtemplater

vue 页面导出为pdf与word

一.导出为word

 基于 docxtemplater 来导出word文档的方法

1.安装引用依赖

// 安装 docxtemplater
npm install docxtemplater pizzip  --save
// 安装 jszip-utils
npm install jszip-utils --save 
// 安装 jszip
npm install jszip --save
// 安装 FileSaver
npm install file-saver --save

2.创建word模板(按自己所需最后导出的样式),放到该vue项目public文件夹下,word文档模板具体的写法可以参考 docxtemplater demo 上的例子

数据定义使用

  • js中定义变量:
{value:'测试'}
  • word模板中使用语法:
{value}

 

图片定义使用

  • js中定义变量:
{img:'文件路径'}
  • word模板中使用语法:
{%img}

3.导出word文档实现:

js引入:

import docxtemplater from 'docxtemplater'
import JSZipUtils from 'jszip-utils'
import { saveAs } from 'file-saver'
import PizZip from 'pizzip'

 

  // 导出word
    async exportWord() {
      //这里要引入处理图片的插件,下载docxtemplater后,引入的就在其中了
      var ImageModule = require('docxtemplater-image-module-free')
      var self = this
      //这里是我的Word路径
      JSZipUtils.getBinaryContent('word.docx', function (error, content) {
        if (error) {
          throw error
        }
        let opts = {}
        opts.centered = true
        opts.fileType = 'docx'
        opts.getImage = (tag) => {
          return self.base64DataURLToArrayBuffer(tag)
        }
        opts.getSize = () => {
          return [550, 200] //输出的图片宽和高
        }
        let zip = new PizZip(content)
        let doc = new docxtemplater()
        doc.attachModule(new ImageModule(opts))
        doc.loadZip(zip)
        doc.setData({
          ...self.data, //我的最外层包裹一切要导出的数据名称
        })
        try {
          doc.render()
        } catch (error) {
          var e = {
            message: error.message,
            name: error.name,
            stack: error.stack,
            properties: error.properties,
          }
          console.log(
            JSON.stringify({
              error: e,
            })
          )
          throw error
        }
        var out = doc.getZip().generate({
          type: 'blob',
          mimeType:
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
        })
        saveAs(out, '导出文件的名称.docx')
      })
    },

 

导出后的文件与模板一致,如下图所示,导出后可自行修改内容。

 

 

二.导出为pdf

原理:使用html2canvas将DOM生成canvas,然后生成对应的图片,将图片生成pdf

注意:页面pdf导出有时候会因为屏幕分辨率出现内容分割问题,只需要固定宽即可!

1.安装引入依赖

npm i html2canvas 
npm i jspdf

2.在utils文件夹下新建exportPdf.js文件

文件内容如下:

// 导出页面为PDF格式
import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf'

export function getPdf(title, id) {
  html2Canvas(document.querySelector(`#${id}`), {
    allowTaint: true
  }).then(function (canvas) {
    let contentWidth = canvas.width
    let contentHeight = canvas.height
    let pageHeight = contentWidth / 592.28 * 841.89
    let leftHeight = contentHeight
    let position = 0
    let imgWidth = 595.28
    let imgHeight = 592.28 / contentWidth * contentHeight
    let pageData = canvas.toDataURL('image/jpeg', 1.0)
    let PDF = new JsPDF('', 'pt', 'a4')
    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()
        }
      }
    }
    PDF.save(title + '.pdf')
  })
}

3.使用(在需要的页面导入exportPdf.js文件)

<!-- id="pdfHtml"内所有内容就是PDF导出的内容 -->
 <el-button type="primary"
                 size="mini"
                 @click="exportPDF">导出pdf文件</el-button>
<div id="pdfHtml">
测试导出pdf内容
</div>
import html2Canvas from 'html2canvas'
import { getPdf } from '@/utils/exportPdf.js'
// 导出PDF
    exportPDF() {
      getPdf('导出文件的名称', 'pdfHtml')//pdfHtml为导出内容的ID
},

 

页面展示效果:

 导出为pdf后效果:

 

最好多测试几遍,有时候情况特殊的会出现内容被分割的问题。

 

标签:vue,word,导出,let,error,pdf,docxtemplater
From: https://www.cnblogs.com/luckybaby519/p/17692907.html

相关文章

  • 使用Github Action在Github Pages上部署vue页面
    GithubAction部分:name:NodeJSon:push:branches:["master"]#SetspermissionsoftheGITHUB_TOKENtoallowdeploymenttoGitHubPagespermissions:contents:write#Allowonlyoneconcurrentdeployment,skippingrunsqueuedbetwee......
  • Vue2x的自定义指令
    在某些情况下,我们需要对底层DOM进行操作,而内置的指令不能满足需求,就需要自定义指令。一个自定义指令由一个包含类似组件的生命周期的钩子的对象来定义,钩子函数会接收到指令所绑定的元素作为参数。定义指令常用两种方式进行自定义指令,一种是全局定义,另一种在当前组件中定义//局......
  • Java并发编程的艺术-PDF下载-firebook-书火网
    Java并发编程的艺术-PDF下载-firebook-书火网资源链接:https://pan.baidu.com/s/19vG6Dd3YBr69i6D2NHeCaQ提取码:wv4f第1章介绍Java并发编程的挑战,会向读者说明可能会遇到哪些问题,以及如何解决。第2章Java并发编程的底层实现原理,从CPU和JVM2个层面剖析。第3章详细深入介绍了Ja......
  • vue兄弟组件传参
    实现兄弟组件之间的参数传递可以通过以下方法:使用共同的父组件来传递参数。在父组件中定义一个数据属性,用于保存需要传递给兄弟组件的参数。Copyexportdefault{data(){return{message:'Hello',};},};在父组件的模板中引用两个兄弟组......
  • vue2打包组件发布到npm
    1.使用vuecreateprojectName新建一个项目2.将src的文件夹名称改为example,便于我们调试代码3.增加packages文件夹,其下面的index.js代码如下importpanelfrom'./panel/index.vue'constcomponents=[panel]constinstall=function(Vue){if(install.i......
  • vue3下载文件
    constdow=async(url:string,fileName:string)=>{mulSelUrls.value=[]mulSelUrls.value.push(urlasnever)constrequests=mulSelUrls.value.map(url=>axios.get(url,{responseType:'blob'}));try{constresponses=aw......
  • vue项目成功引入element组件的具体步骤
    1、首先要确保vue项目能够成功在浏览器访问2、一般使用的是vue3那么,需要注意的是,element组件在vue3里面,需要使用的是element-plus命令:npminstallelement-plus--save--legacy-peer-deps下载完成之后,需要在main.js里面对element组件进行引入:importElementPlusfrom'ele......
  • vue使用富文本编辑器vue-quill-editor,含拖拽图片,调整默认高度
    这两天的工作用到了vue\-quill-editor,来记录一下使用心得/踩过的坑供大家参考。1、安装npminstall vue-quill-editornpminstallquill2、引入main.js里样式也记得引入:importVueQuillEditorfrom'vue-quill-editor'import'quill/dist/quill.core.css'import'quill/dist/qu......
  • 运行vue项目一直报错的问题的解决
    问题描述(上图为网图,自己的没来得及截图)问题解决第一个原因:vue版本过低;使用下面的语句进行版本升级:[email protected]但是我试了没啥用;第二个原因:node版本过低;使用下面的语句进行版本升级:--若是已经有更高级的版本,可以直接更换:nvmlistnvmuse版本--若是没有,就自己......
  • Vue组件传值方法
    使用propsprops是用于向子组件传递数据的一种方式。父组件可以将数据传递给子组件的props属性,子组件则可以通过props来访问这些数据。父组件:<template><div><child-component:message="message"></child-component></div></template>子组件:<template><div>{......