使用vue2实现打印在线word文件,文件流形式打印在线word,预览打印

需要使用的三个插件

  1. docx-preview      (npm install docx-preview) 安装

  2. jszip                    (npm install jszip)安装

  3. print-js                 (npm install print-js)安装

 html部分

<div ref="word" class="print-main"></div>

js部分

import printJS from 'print-js'



methods:{

downFile(url, parameter) {
  return axios({
    url: url,
    params: parameter,
    method: 'get',
    responseType: 'blob'
  })
}

    async handlePrint({ printFile }) {
      try {
        this.focuser = setInterval(() => window.dispatchEvent(new Event('focus')), 500) //聚焦监听关闭打印
        this.hide = this.$message.loading('加载中..', 0)
        const docx = require('docx-preview')
        const blob = await this.downFile(printFile) //获取文件流
        docx
          .renderAsync(
            blob, //Blob | ArrayBuffer | Uint8Array, 可以是 JSZip.loadAsync 支持的任何类型
            this.$refs.word, // HTMLElement 渲染文档内容的元素
          )
          .then(
            setTimeout(() => {
              this.print(document.getElementsByClassName('docx')[0]) //需要打印的div
              setTimeout(this.hide) //关闭加载中
            }, 1000)
          )
      } catch (e) {
        setTimeout(this.hide) //关闭加载中
        console.log(e)
      }
    },
    print(ref, title, style, type, jsonData, borderHeadStyle, gridStyle, css) {
      printJS({
        printable: ref,
        header: title || null,
        type: type || 'html',
        headerStyle: 'font-size:6px;font-weight:600;text-align:center;padding:15px 0 10px 0;', //标题设置
        properties: jsonData || [], //json数据元
        gridHeaderStyle:
          borderHeadStyle ||
          'font-size:6px;font-weight:400;height:40px;line-height:40px;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json格式表头样式
        gridStyle:
          gridStyle ||
          'font-size:1px;font-weight:200;border: 1px solid #ccc;padding:3px 5px 3px 5px;text-align:center;', //json各式表格样式
        scanStyles: false, //不使用默认样式
        repeatTableHeader: false, //打印json表头只显示在第一页
        style: style || '@page{size:auto;size: a4;margin: 0cm 1cm ;}', //去除页眉页脚,A4纸
        css: css || null, //css url
        onPrintDialogClose: () => {
          this.$nextTick(() => {
            clearInterval(this.focuser)
            console.log('打印窗口关闭了')
            // 删除打印元素
            var parentElement = this.$refs.word
            while (parentElement.firstChild) {
              parentElement.removeChild(parentElement.firstChild)
            }
          })
        }
      })
    },
}

 css部分

.print-main {
  position: fixed;
  top: -10000px;  //不在页面上显示
  /deep/.docx-wrapper {
    background: none;
  }
  /deep/.docx-wrapper > section.docx {
    margin-bottom: 0;
  }
}

 注意:

  1. blob如果是docx格式的就不需要额外处理

  2.  this.print(需要打印的div) 传入的元素不正确可能导致有上下横线等问题

  3. onPrintDialogClose只能监听到关闭了打印窗口不知道是确定打印了还是取消打印了,需要开启dispatchEvent才能监听到

Vue2中实现在线预览Word文档的方法如下: 1. 首先,你需要调取接口获取后端传回的Word文档。这可以通过调用接口的方法来完成,接口返回的文档通常存储在res.data.data中。你可以使用axios或其他HTTP请求库来发送请求并接收响应。 2. 在Vue模板中,你可以创建一个按钮,通过点击按钮来触发预览Word文档的操作。按钮可以使用Element UI库的el-button组件或其他自定义的按钮组件。在按钮的点击事件处理函数中,调用接口方法并将返回的文档作为参数传递给渲染函数。 3. 在Vue组件中引入docx-preview库,并使用其提供的renderAsync方法来渲染Word文档。你可以在组件的script标签中通过require语法引入docx-preview库,并在方法中使用docxx.renderAsync方法来渲染文档。渲染函数需要传递两个参数,第一个参数是接口返回的文档,第二个参数是一个DOM元素的引用,用于指定渲染文档的位置。 下面是一个示例代码,演示了如何在Vue2中实现在线预览Word文档: ```html <template> <div> <el-button @click="previewWord">预览Word文档</el-button> <div ref="wordContainer"></div> </div> </template> <script> import { getWordDocument } from "@/api/documents"; var docxx = require("docx-preview"); export default { methods: { previewWord() { getWordDocument() // 调用接口获取文档 .then((res) => { docxx.renderAsync(res.data.data, this.$refs.wordContainer); }) .catch((error) => { this.$message.error(error); }); }, }, }; </script> ``` 请注意,上述示例代码中的getWordDocument方法是一个示例接口调用方法,你需要根据实际情况替换为适用于你的项目的接口调用方法。此外,你还需要根据实际情况对代码进行调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [vue实现预览word文档(处理文档)](https://blog.csdn.net/weixin_45294459/article/details/126997364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue实现pdf文档在线预览功能](https://download.csdn.net/download/weixin_38590784/13681693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值