您现在的位置是:首页 > 技术教程 正文

vue 预览 word

admin 阅读: 2024-03-30
后台-插件-广告管理-内容页头部广告(手机)

最近做的项目要求实现预览word, pdf,png等文件功能,pdf以及png都很简单,轻松百度搞定,但是word预览研究了好久,所以特此记录分享。

前端实现预览word分为两种,一种是上传前预览(也就是前端使用input或者组件等选择文件后直接预览,此时还没有上传给后端,我定义为纯前端预览),一种是上传后预览(就是文档已经上传到后端,通过后端给的文件流实现预览)

一、先说第一种的实现方式:

首先下载安装docx-preview,引入

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. this.uploadFileName = content.file.name;
  15. this.uploadFileObj = content.file;
  16. if (addType === "pdf") {
  17. const url = URL.createObjectURL(content.file);
  18. console.log(url);
  19. this.xzbjPreviewIframeSrc = url;
  20. this.xzbjIframeIsShow = true;
  21. this.xzbjDialogPreviewDiv = false;
  22. this.xzbjPreviewImgUrl = "";
  23. this.xzbjDocPreviewFlag = false;
  24. this.previewBoxStyle = "height:400px;position: relative;overflow:hidden;"
  25. }
  26. else if(addType === "doc" || addType === "docx" || addType === "word"){
  27. console.log("word文件预览")
  28. this.xzbjPreviewImgUrl = "";
  29. this.xzbjPreviewIframeSrc = "";
  30. this.xzbjDialogPreviewDiv = false;
  31. this.xzbjDocPreviewFlag = true;
  32. this.xzbjIframeIsShow = false;
  33. // 将file转为buffer
  34. let fr = new FileReader();
  35. fr.readAsArrayBuffer(content.file);
  36. fr.addEventListener("loadend",(e) => {
  37. console.log("loadend---->", e)
  38. let buffer = e.target.result;
  39. this.docxRender(buffer);
  40. },false);
  41. }
  42. //".rar, .zip, .doc, .docx, .xls, .txt, .pdf, .jpg, .png, .jpeg,"
  43. else if (["png", "jpg", "jpeg","bmp"].includes(addType)) {
  44. this.xzbjPreviewIframeSrc = "";
  45. this.xzbjIframeIsShow = false;
  46. this.xzbjDocPreviewFlag = false;
  47. this.imgPreview(content.file);
  48. this.previewBoxStyle = "height:400px;position: relative;overflow:auto;"
  49. } else if (addType === "rar" || addType === "zip" || addType === "7z") {
  50. this.filePreviewInfo = "请下载附件进行查看"
  51. this.xzbjPreviewImgUrl = "";
  52. this.xzbjPreviewIframeSrc = "";
  53. this.xzbjDocPreviewFlag = false;
  54. this.xzbjDialogPreviewDiv = true;
  55. this.$message({
  56. message: "该文件类型暂不支持预览",
  57. type: "warning",
  58. });
  59. return false;
  60. }else{
  61. this.filePreviewInfo = "该文件类型暂不支持预览"
  62. this.xzbjPreviewIframeSrc = "";
  63. this.xzbjIframeIsShow = false;
  64. this.xzbjDialogPreviewDiv = true;
  65. this.xzbjPreviewImgUrl = "";
  66. this.xzbjDocPreviewFlag = false;
  67. this.$message({
  68. message: "请仅允许上传后缀为pdf、doc、docx、word、jpg、png、bmp、rar、zip、7z的附件",
  69. type: "warning",
  70. });
  71. }
  72. }
  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. <script>
  2. import { defaultOptions, renderAsync } from "docx-preview";
  3. console.log(defaultOptions);
  4. export default {
  5. name: 'DocxPreview',
  6. data () {
  7. return {
  8. docxOptions: {
  9. className: "kaimo-docx-666", // string:默认和文档样式类的类名/前缀
  10. inWrapper: true, // boolean:启用围绕文档内容的包装器渲染
  11. ignoreWidth: false, // boolean:禁用页面的渲染宽度
  12. ignoreHeight: false, // boolean:禁止渲染页面高度
  13. ignoreFonts: false, // boolean:禁用字体渲染
  14. breakPages: true, // boolean:在分页符上启用分页
  15. ignoreLastRenderedPageBreak: true, // boolean:在 lastRenderedPageBreak 元素上禁用分页
  16. experimental: false, // boolean:启用实验功能(制表符停止计算)
  17. trimXmlDeclaration: true, // boolean:如果为true,解析前会从​​ xml 文档中移除 xml 声明
  18. useBase64URL: false, // boolean:如果为true,图片、字体等会转为base 64 URL,否则使用URL.createObjectURL
  19. useMathMLPolyfill: false, // boolean:包括用于 chrome、edge 等的 MathML polyfill。
  20. showChanges: false, // boolean:启用文档更改的实验性渲染(插入/删除)
  21. debug: false, // boolean:启用额外的日志记录
  22. }
  23. };
  24. },
  25. methods: {
  26. getFile(){
  27. this.handlePreview()
  28. },
  29. handlePreview() {
  30. let file = document.getElementById("file").files[0];
  31. console.log(file);
  32. // 将file转为buffer
  33. let fr = new FileReader();
  34. fr.readAsArrayBuffer(file);
  35. fr.addEventListener("loadend",(e) => {
  36. console.log("loadend---->", e)
  37. let buffer = e.target.result;
  38. this.docxRender(buffer);
  39. },false);
  40. },
  41. // 渲染docx
  42. docxRender(buffer) {
  43. let bodyContainer = document.getElementById("bodyContainer");
  44. renderAsync(
  45. buffer, // Blob | ArrayBuffer | Uint8Array, 可以是 JSZip.loadAsync 支持的任何类型
  46. bodyContainer, // HTMLElement 渲染文档内容的元素,
  47. null, // HTMLElement, 用于呈现文档样式、数字、字体的元素。如果为 null,则将使用 bodyContainer。
  48. this.docxOptions // 配置
  49. ).then(res => {
  50. console.log("res---->", res)
  51. })
  52. }
  53. },
  54. };
  55. script>

结束啦,每天进步一点点,早日成为大神。啦啦啦

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索