[web教学] vue 预览 word

[复制链接]
查看1164 | 回复0 | 2023-8-23 11:53:22 | 显示全部楼层 |阅读模式 来自 中国北京
最近做的项目要求实现预览word, pdf,png等文件功能,pdf以及png都很简单,轻松百度搞定,但是word预览研究了很久,以是特此记载分享。
  前端实现预览word分为两种,一种是上传前预览(也就是前端利用input或者组件等选择文件后直接预览,此时还没有上传给后端,我界说为纯前端预览),一种是上传后预览(就是文档已经上传到后端,通过后端给的文件流实现预览)
  
  一、先说第一种的实现方式:
  起首下载安装docx-preview,引入
  1. npm install xlsx docx-preview --save
复制代码
  1. import { defaultOptions, renderAsync } from "docx-preview";
  2. var docxx = require("docx-preview");
复制代码
我这里利用的是element ui 上传组件
                       
  1. <el-upload
  2.      class="upload-demo"
  3.       action=""
  4.       :http-request="myUpload"
  5.       :show-file-list="false"
  6.       >
  7.       <span class = "uploadEnclosure">上传附件</span>
  8.     </el-upload>
复制代码
选择文件以后
                                                                                                                   
  1. myUpload(content){
  2.       console.log(content);
  3.       const downUrl = URL.createObjectURL(content.file)
  4.       const a = document.createElement('a');
  5.       this.$refs.selectFileNameBox.innerHTML = "";
  6.       this.$refs.selectFileNameBox.append(a);
  7.       a.innerHTML = content.file.name;
  8.       a.href = downUrl
  9.       a.download = content.file.name;
  10.       a.target = '_blank';
  11.       const addTypeArray = content.file.name.split(".");
  12.       const addType = addTypeArray[addTypeArray.length - 1];
  13.       console.log(addType);
  14.       
  15.       this.uploadFileName = content.file.name;
  16.       this.uploadFileObj = content.file;
  17.       if (addType === "pdf") {
  18.         const url = URL.createObjectURL(content.file);
  19.         console.log(url);
  20.         this.xzbjPreviewIframeSrc = url;
  21.         this.xzbjIframeIsShow = true;
  22.         this.xzbjDialogPreviewDiv = false;
  23.         this.xzbjPreviewImgUrl = "";
  24.         this.xzbjDocPreviewFlag = false;
  25.       
  26.         this.previewBoxStyle = "height:400px;position: relative;overflow:hidden;"
  27.         
  28.       }
  29.       else if(addType === "doc" || addType === "docx" || addType === "word"){
  30.         console.log("word文件预览")
  31.         this.xzbjPreviewImgUrl = "";
  32.         this.xzbjPreviewIframeSrc = "";
  33.         this.xzbjDialogPreviewDiv = false;
  34.         this.xzbjDocPreviewFlag = true;
  35.         this.xzbjIframeIsShow = false;
  36.         // 将file转为buffer
  37.         let fr = new FileReader();
  38.         fr.readAsArrayBuffer(content.file);
  39.         fr.addEventListener("loadend",(e) => {
  40.             console.log("loadend---->", e)
  41.             let buffer = e.target.result;
  42.             this.docxRender(buffer);
  43.         },false);
  44.       
  45.         
  46.       
  47.       }
  48.       //".rar, .zip, .doc, .docx, .xls, .txt, .pdf, .jpg,  .png, .jpeg,"
  49.       else if (["png", "jpg", "jpeg","bmp"].includes(addType)) {
  50.         this.xzbjPreviewIframeSrc = "";
  51.         this.xzbjIframeIsShow = false;
  52.         this.xzbjDocPreviewFlag = false;
  53.         this.imgPreview(content.file);
  54.         
  55.         this.previewBoxStyle = "height:400px;position: relative;overflow:auto;"
  56.         
  57.       } else if (addType === "rar" || addType === "zip" || addType === "7z") {
  58.         this.filePreviewInfo = "请下载附件进行查看"
  59.         this.xzbjPreviewImgUrl = "";
  60.         this.xzbjPreviewIframeSrc = "";
  61.         this.xzbjDocPreviewFlag = false;
  62.         this.xzbjDialogPreviewDiv = true;
  63.         this.$message({
  64.           message: "该文件类型暂不支持预览",
  65.           type: "warning",
  66.         });
  67.         return false;
  68.       }else{
  69.         this.filePreviewInfo = "该文件类型暂不支持预览"
  70.         this.xzbjPreviewIframeSrc = "";
  71.         this.xzbjIframeIsShow = false;
  72.         this.xzbjDialogPreviewDiv = true;
  73.         this.xzbjPreviewImgUrl = "";
  74.         this.xzbjDocPreviewFlag = false;
  75.         this.$message({
  76.           message: "请仅允许上传后缀为pdf、doc、docx、word、jpg、png、bmp、rar、zip、7z的附件",
  77.           type: "warning",
  78.         });
  79.       }
  80.     }
复制代码
  1. // 渲染docx
  2.     docxRender(buffer) {
  3.       let bodyContainer = document.getElementById("demoDocContainer");
  4.       renderAsync(
  5.           buffer, // Blob | ArrayBuffer | Uint8Array, 可以是 JSZip.loadAsync 支持的任何类型
  6.           bodyContainer, // HTMLElement 渲染文档内容的元素,
  7.           null, // HTMLElement, 用于呈现文档样式、数字、字体的元素。如果为 null,则将使用 bodyContainer。
  8.           this.docxOptions // 配置
  9.       ).then(res => {
  10.           console.log("res---->", res)
  11.       })
  12.     },
复制代码
下面是图片预览焦点代码
  1. imgPreview(file) {
  2.       // 看支持不支持FileReader
  3.       if (!file || !window.FileReader) return;
  4.       // console.log(/^image/.test(file.type), "---/^image/.test(file.type)")
  5.       if (/^image/.test(file.type)) {
  6.         // 创建一个reader
  7.         let reader = new FileReader();
  8.         // 将图片将转成 base64 格式
  9.         reader.readAsDataURL(file);
  10.         // 读取成功后的回调
  11.         reader.onload = ({ target }) => {
  12.           this.xzbjDialogPreviewDiv = false;
  13.           this.xzbjPreviewImgUrl = target.result; //将img转化为二进制数据
  14.           // console.log("target:", target);
  15.         };
  16.       }
  17.     },
复制代码
如许就实现了纯前端预览word功能
  
  二、接下来实现 共同后端预览word
  根据后端返回的流预览word
                       
  1. request({
  2.     method: "get",
  3.     url: "/notice/noticeFileView",
  4.     responseType: 'blob',
  5.     params:{
  6.     id:row.id
  7.     },
  8.     headers: {
  9.     "Content-Type": 'application/json'
  10.     },
  11.     }).then(res=>{
  12.     console.log(res,"---文件预览");
  13.    
  14.     if(row.suffix.includes("pdf")){
  15.     this.previewPdfFn(res);
  16.     // let blob = new Blob([res],{
  17.     //   type: 'application/pdf'
  18.     // })
  19.     // let url = window.URL.createObjectURL(blob);
  20.     this.xqPreviewImgUrl =  "";
  21.     this.xqPreviewPdfUrl = this.previewPdfFn(res);
  22.     this.xqPdfPreviewFlag = true;
  23.     this.xqDocPreviewFlag = false;
  24.     this.xqPerviewStyle = "height:600px;position: relative;overflow:hidden"
  25.     }else if(row.suffix.includes("docx") || row.suffix.includes("doc")|| row.suffix.includes("word")){
  26.     console.log("预览word")
  27.     this.xqDocPreviewFlag = true;
  28.     let blob = new Blob([res],{
  29.       type: 'application/pdf'
  30.     })
  31.     this.$nextTick(()=>{
  32.       console.log(this.$refs.xqDocContainer,"---this.$refs.xqDocContainer")
  33.       docxx.renderAsync(blob, this.$refs.xqDocContainer)
  34.     })
  35.    
  36.     } else if (row.suffix === ".rar" || row.suffix === ".zip" || row.suffix === "7z") {
  37.     this.xqDocPreviewFlag = false;
  38.     this.xzbjPreviewImgUrl = "";
  39.     this.xzbjPreviewIframeSrc = "";
  40.     this.$message({
  41.       message: "该文件类型暂不支持预览",
  42.       type: "warning",
  43.     });
  44.       return false;
  45.     }else if([".png", ".jpg", ".jpeg",".bmp"].includes(row.suffix)){
  46.     let blob = new Blob([res],{
  47.       type: 'application/pdf'
  48.     })
  49.     console.log(blob,"---blob")
  50.     let url = window.URL.createObjectURL(blob);
  51.     this.xqPreviewImgUrl =  url;
  52.     this.xqPdfPreviewFlag = false;
  53.     this.xqDocPreviewFlag = false;
  54.     this.xqPreviewPdfUrl = "";
  55.     this.xqPerviewStyle = "height:600px;position: relative;overflow:auto"
  56.     }
  57.    
  58.     this.xqDialogPreviewDiv = false;
  59.     }).catch(err=>{
  60.     console.log(err,"--文件预览失败")
  61.     })
复制代码

  完毕
  
  下面是参考链接:
  https://www.jianshu.com/p/8e1e90570c52 预览word excel
  https://blog.csdn.net/kaimo313/article/details/127012225 vue里利用docx-preview预览docx文件
  https://volodymyrbaydalka.github.io/docxjs/
  
  末了是一个挚友赠予的组件
  1. <template>
  2.   <div class="docx-preview-wrap">
  3.     <h4>
  4.       <input type="file" id="file" accept=".docx"  @change="getFile"/>
  5.     </h4>
  6.     <div id="bodyContainer"></div>
  7.   </div>
  8. </template>
  9. <script>
  10. import { defaultOptions, renderAsync } from "docx-preview";
  11. console.log(defaultOptions);
  12. export default {
  13.   name: 'DocxPreview',
  14.   data () {
  15.     return {
  16.       docxOptions: {
  17.         className: "kaimo-docx-666", // string:默认和文档样式类的类名/前缀
  18.         inWrapper:  true, // boolean:启用围绕文档内容的包装器渲染
  19.         ignoreWidth: false, // boolean:禁用页面的渲染宽度
  20.         ignoreHeight: false, // boolean:禁止渲染页面高度
  21.         ignoreFonts: false, // boolean:禁用字体渲染
  22.         breakPages: true, // boolean:在分页符上启用分页
  23.         ignoreLastRenderedPageBreak: true, // boolean:在 lastRenderedPageBreak 元素上禁用分页
  24.         experimental: false, // boolean:启用实验功能(制表符停止计算)
  25.         trimXmlDeclaration: true, // boolean:如果为true,解析前会从​​ xml 文档中移除 xml 声明
  26.         useBase64URL: false, // boolean:如果为true,图片、字体等会转为base 64 URL,否则使用URL.createObjectURL
  27.         useMathMLPolyfill: false, // boolean:包括用于 chrome、edge 等的 MathML polyfill。
  28.         showChanges: false, // boolean:启用文档更改的实验性渲染(插入/删除)
  29.         debug: false, // boolean:启用额外的日志记录
  30.       }
  31.     };
  32.   },
  33.   methods: {
  34.     getFile(){
  35.       this.handlePreview()
  36.     },
  37.     handlePreview() {
  38.       let file = document.getElementById("file").files[0];
  39.       console.log(file);
  40.       // 将file转为buffer
  41.       let fr = new FileReader();
  42.       fr.readAsArrayBuffer(file);
  43.       fr.addEventListener("loadend",(e) => {
  44.         console.log("loadend---->", e)
  45.         let buffer = e.target.result;
  46.         this.docxRender(buffer);
  47.       },false);
  48.     },
  49.     // 渲染docx
  50.     docxRender(buffer) {
  51.       let bodyContainer = document.getElementById("bodyContainer");
  52.       renderAsync(
  53.         buffer, // Blob | ArrayBuffer | Uint8Array, 可以是 JSZip.loadAsync 支持的任何类型
  54.         bodyContainer, // HTMLElement 渲染文档内容的元素,
  55.         null, // HTMLElement, 用于呈现文档样式、数字、字体的元素。如果为 null,则将使用 bodyContainer。
  56.         this.docxOptions // 配置
  57.       ).then(res => {
  58.         console.log("res---->", res)
  59.       })
  60.     }
  61.   },
  62. };
  63. </script>
复制代码
竣事啦,每天进步一点点,早日成为大神。啦啦啦

来源:https://blog.csdn.net/qq_37299479/article/details/128814211
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则