ToB企服应用市场:ToB评测及商务社交产业平台

标题: React实现在线预览word陈诉/本地选择陈诉预览 [打印本页]

作者: 我可以不吃啊    时间: 2024-6-13 21:21
标题: React实现在线预览word陈诉/本地选择陈诉预览
标题使用的核心技术点是docx-preview,读取到文件的File对象,用File去做文件展示,这里是才用将文件转base64字符串存储到localStorage中

在线预览word陈诉且包含word样式

  1. <link
  2.       href="./docx-preview/bootstrap.min.css"
  3.       rel="stylesheet"
  4.       integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"
  5.       crossorigin="anonymous"
  6.     />
  7.     <script
  8.       src="./docx-preview/bootstrap.bundle.min.js"
  9.       integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
  10.       crossorigin="anonymous"
  11.     ></script>
  12.     <script src="./docx-preview/jszip.min.js"></script>
  13.     <script src="./docx-preview/docx-preview.min.js"></script>
  14.     <script src="./docx-preview/thumbnail.example.js"></script>
  15.     <link href="./docx-preview/thumbnail.example.css" rel="stylesheet" />
  16.     <script crossorigin src="./docx-preview/tiff.js"></script>
  17.     <script src="./docx-preview/tiff-preprocessor.js"></script>
复制代码
4.创建dom去展示对应的docx文件
  1. <body class="vh-100 d-flex flex-column">
  2.     <div class="flex-grow-1 d-flex flex-row" style="height: 0">
  3.       <div
  4.         id="document-container"
  5.         class="overflow-auto flex-grow-1 h-100"
  6.       ></div>
  7.     </div>
  8.   </body>
复制代码
5.创建一个基于Web的文档查看器,用于查看和预览Microsoft Word文档。
1.获取当前文档(currentDocument):通过document.querySelector(‘#document-container’)获取一个用于表现文档内容的HTML元素。
2.设置docx选项:使用Object.assign()方法将docx.defaultOptions与一个包含debug和experimental属性值的对象举行合并。
3.获取加载按钮(loadButton):通过document.querySelector(‘#loadButton’)获取一个用于加载文档的按钮。
4.定义renderDocx函数:一个异步函数,用于渲染Word文档。它接受一个文件参数(file),将其转换为Blob对象,然后使用docx.renderAsync()方法将其渲染到指定的容器中。同时,它还调用renderThumbnails()函数来生成文档的缩略图。
5.处置惩罚加载文档按钮的点击事件:当用户点击加载按钮时,调用renderDocx()函数并传入当前文档
  1. <script>
  2.       let currentDocument = null
  3.       const docxOptions = Object.assign(docx.defaultOptions, {
  4.         debug: true,
  5.         experimental: true
  6.       })
  7.       const container = document.querySelector('#document-container')
  8.       const loadButton = document.querySelector('#loadButton')
  9.       async function renderDocx(file) {
  10.         currentDocument = file
  11.         if (!currentDocument) return
  12.         let docxBlob = preprocessTiff(currentDocument)
  13.         let res = await docx.renderAsync(docxBlob, container, null, docxOptions)
  14.         renderThumbnails(
  15.           container,
  16.           document.querySelector('#thumbnails-container')
  17.         )
  18.       }
  19.     </script>
复制代码
6.读取本地存储的文件base64并展示
  1. <script>
  2.       // base64Data是从后端接收到的Base64字符串
  3.       const base64String = localStorage.getItem('base64String')
  4.       // 将Base64字符串转换为Blob对象
  5.       const byteCharacters = atob(base64String)
  6.       const byteNumbers = new Array(byteCharacters.length)
  7.       for (let i = 0; i < byteCharacters.length; i++) {
  8.         byteNumbers[i] = byteCharacters.charCodeAt(i)
  9.       }
  10.       const byteArray = new Uint8Array(byteNumbers)
  11.       const blob = new Blob([byteArray], { type: 'application/octet-stream' })
  12.       // 将 Blob 对象转换为 File 对象
  13.       const file = new File([blob], 'example.docx', {
  14.         type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  15.       })
  16.       //调用方法
  17.       renderDocx(file)
  18.     </script>
复制代码
7.触发预览按钮的事件
  1.   //预览报告
  2.   function previewReportRequest() {
  3.     setsubmitLoading(true)
  4.     asyncActionCreators.previewReport({ id: ID }).then((response) => {
  5.       setsubmitLoading(false)
  6.       if (response?.data?.code === 0) {
  7.         localStorage.setItem('base64String', response?.data?.data)
  8.         //存好之后,跳转到预览页面
  9.         const htmlFilePath = `${window.location.origin}/docpreview.html`
  10.         openHtmlFileInNewTab(htmlFilePath)
  11.       } else {
  12.         message.warning(response.data.msg || '获取报告失败')
  13.       }
  14.     })
  15.   }
  16.   const openHtmlFileInNewTab = (url) => {
  17.     const anchor = document.createElement('a')
  18.     anchor.href = url
  19.     anchor.target = '_blank'
  20.     anchor.rel = 'noopener noreferrer'
  21.     anchor.click()
  22.   }
复制代码
本地选择文件后预览需做以下改动

1.设一个input选取文件
  1. <input type="file" accept=".docx" onChange={handleLocalFilePreview} />
复制代码
2.添加文件选择方法
  1. const handleLocalFilePreview = (event) => {
  2.     const file = event.target.files[0]
  3.     const reader = new FileReader()
  4.     // 将 Blob 数据编码为 Base64 字符串
  5.     reader.onload = (event) => {
  6.       const base64String = event.target.result
  7.       localStorage.setItem('base64String', base64String)
  8.     }
  9.     reader.readAsDataURL(file)
  10.   }
复制代码
3.预览按钮的事件 openHtmlFileInNewTab同在线预览
  1.   const docxPreview = () => {
  2.     const htmlFilePath = `${window.location.origin}/docpreview.html`
  3.      openHtmlFileInNewTab(htmlFilePath)
  4.   }
复制代码
4.html文件须要改变方法
  1. <script>
  2.       //==========之前的===========
  3.       //获取存储的blob的base64字符串
  4.        const base64String = localStorage.getItem('base64String')
  5.        // 将 Base64 字符串解码为 Blob 对象
  6.        const byteCharacters = atob(base64String?.split(',')?.[1])
  7.        const byteNumbers = new Array(byteCharacters.length)
  8.        for (let i = 0; i < byteCharacters.length; i++) {
  9.          byteNumbers[i] = byteCharacters.charCodeAt(i)
  10.        }
  11.        const byteArray = new Uint8Array(byteNumbers)
  12.        const blob = new Blob([byteArray])
  13.        const file = new File([blob], 'example.docx', {
  14.          type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  15.       })
  16.       // 将 Blob 对象转换为 File 对象
  17.       const file = new File([blob], 'example.docx', {
  18.         type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  19.       })
  20.       //调用方法
  21.       renderDocx(file)
  22.     </script>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4