前端实现word文档预览和内容提取的详细过程

 更新时间:2024年05月25日 11:52:37   作者:crazyXB  
在前端直接读取并原样展示Word文档是一个相对复杂的任务,因为Word文档的格式(如.doc或.docx)与Web技术栈使用的格式(HTML、CSS)不兼容,下面这篇文章主要给大家介绍了关于前端实现word文档预览和内容提取的详细过程,需要的朋友可以参考下

需求

上一篇写了excel文档解析,顺便就看看word文档。

解决问题

1.前端在浏览器预览word文档。

2.可以直接提取word文档内容

利用技术

预览文档--docx-preview

    <script src="https://cdn.jsdelivr.net/npm/docx-preview@0.1.15/dist/docx-preview.js"></script>

提取文档内容--mammoth

    <script src="https://cdn.bootcdn.net/ajax/libs/mammoth/1.6.0/mammoth.browser.min.js"></script>

预览文档实现过程

// HTML
<div id="preview"></div>

实现预览功能

renderAsync接收四个参数

1.document: 数据格式可以为Blob | ArrayBuffer | Uint8Array, // could be any type that supported by JSZip.loadAsync

2.bodyContainer: 渲染的区域

3.styleContainer: 通常用于指定一个HTML元素,该元素将用于包含和管理渲染文档所需的样式信息,包括字体、颜色、布局等。

4.options:{} 具体参数看文档

// JavaScript
const onWord = (event) => {
    let reader = new FileReader();
    let file = event.target.files[0];
    let options = { inWrapper: false, ignoreWidth: true, ignoreHeight: true }
    docx.renderAsync(file, document.getElementById("preview"), null, options)
}

提取word文档实现过程

1.extractRawText--转文字;

2.convertToHtml--转HTML;

3.convertToMarkdown--转Markdown 文档

const onWord = (event) => {
    let reader = new FileReader();
    let file = event.target.files[0];
    if (file) {
        reader.onload = function (e) {
            const data = e.target.result;
            // 转文字
            mammoth.extractRawText({ arrayBuffer: data }).then(function (displayResult) {
                wordData.value = displayResult.value
            }).done();
            // 转HTML
            mammoth.convertToHtml({ arrayBuffer: data }).then(function (displayResult) {
                console.log(displayResult);
            }).done();
            // 转Markdown 文档。
            mammoth.convertToMarkdown({ arrayBuffer: data }).then(function (displayResult) {
                console.log(displayResult);
            }).done();
        };
        reader.readAsArrayBuffer(file);
    }
}

word预览

效果预览

完整代码如下

<!DOCTYPE html>
<html lang="en">

<head>
    <title>上传word文件</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .container {
            padding: 0 50px;
        }

        .operation {
            padding: 20px;
        }

        .btn {
            min-width: 50px;
            font-size: 20px;
            color: #fff;
            background: #118ee9;
            margin: 0 20px 0 0;
            padding: 8px;
            border: none;
            border-radius: 4px;
            box-sizing: border-box;
        }

        .item {
            width: 350px;
            box-sizing: border-box;
            padding: 4px 14px 4px 14px;
            color: #000;
            font-size: 12px;
            background: #fff;
        }

    </style>

    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/mammoth/1.6.0/mammoth.browser.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/docx-preview@0.1.15/dist/docx-preview.js"></script>

</head>

<body>
    <div class="container" id="app">
        <div class="operation">
            <button class="btn" @click="uploadFile">上传word文件</button>
        </div>
        <br>
        <div v-if="wordData">{{wordData}}</div>
        <br>
        <div id="preview"></div>
    </div>
    <script>
        const { createApp, ref, onMounted } = Vue
        createApp({
            setup() {
                let wordData = ref('')
                const uploadFile = (mark) => {
                    let inputEle = document.createElement('input')
                    inputEle.type = 'file'
                    inputEle.accept = '.doc,.docx,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document'
                    inputEle.click()
                    inputEle.addEventListener('input', (event) => {
                        onWord(event)
                    })
                };
                const onWord = (event) => {
                    let reader = new FileReader();
                    let file = event.target.files[0];
                    let options = { inWrapper: false, ignoreWidth: true, ignoreHeight: true }
                    docx.renderAsync(file, document.getElementById("preview"),null, options)
                    let fileName = file.name
                    if (file) {
                        reader.onload = function (e) {
                            const data = e.target.result;
                            // 转文字
                            mammoth.extractRawText({ arrayBuffer: data }).then(function (displayResult) {
                                wordData.value = displayResult.value
                            }).done();
                            // 转HTML
                            mammoth.convertToHtml({ arrayBuffer: data }).then(function (displayResult) {
                                console.log(displayResult);
                            }).done();
                            // 转Markdown 文档。
                            mammoth.convertToMarkdown({ arrayBuffer: data }).then(function (displayResult) {
                                console.log(displayResult);
                            }).done();
                        };
                        reader.readAsArrayBuffer(file);
                    }
                }

                return {
                    wordData,
                    uploadFile,
                    onWord,
                }
            }
        }).mount('#app')
    </script>
</body>

</html>

总结 

到此这篇关于前端实现word文档预览和内容提取的文章就介绍到这了,更多相关前端word文档预览和内容提取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 原生JS实现不断变化的标签

    原生JS实现不断变化的标签

    这篇文章主要介绍了原生JS实现不断变化的标签,可以上下浮动,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • js返回顶部实例分享

    js返回顶部实例分享

    本文主要分享了js返回顶部的实例代码。可复制直接运行,方便快捷。有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • 一个奇葩的最短的 IE 版本判断JS脚本

    一个奇葩的最短的 IE 版本判断JS脚本

    这篇文章主要介绍了一个奇葩的最短的 IE 版本判断JS脚本,非常酷的一段代码,需要的朋友可以参考下
    2014-05-05
  • JavaScript实现经典排序算法之冒泡排序

    JavaScript实现经典排序算法之冒泡排序

    这篇文章主要介绍了JavaScript实现经典排序算法之冒泡排序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JS跳转手机站url的若干注意事项

    JS跳转手机站url的若干注意事项

    去年年底开发了一个手机站平台,遇到了很多坎,今天小编给大家分享下使用JS跳转手机站url的若干注意事项,需要的朋友参考下吧
    2017-10-10
  • JavaScript保存并运算页面中数字类型变量的写法

    JavaScript保存并运算页面中数字类型变量的写法

    这篇文章主要介绍了JavaScript保存并运算页面中数字类型变量的写法,当你在页面中需要不停运算一个数字变量时非常有用,普通的写法不能正常运算,使用本文方法就可以,需要的朋友可以参考下
    2015-07-07
  • Javascript Worker子线程代码实例

    Javascript Worker子线程代码实例

    这篇文章主要介绍了Javascript Worker子线程代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • blob文件流前端显示pdf三种方法

    blob文件流前端显示pdf三种方法

    这篇文章主要给大家介绍了关于blob文件流前端显示pdf的三种方法,困扰我一个晚上的问题,终于解决了,文中给出了详细的代码示例,需要的朋友可以参考下
    2024-04-04
  • 常见表单重复提交问题整理及解决方法

    常见表单重复提交问题整理及解决方法

    常见的重复提交问题如点击提交按钮两次、点击刷新按钮等等,下面为大家整理了防止表单重复提交的方法,感兴趣的朋友可以参考下
    2013-11-11
  • layer弹窗插件操作方法详解

    layer弹窗插件操作方法详解

    这篇文章主要介绍了layer弹窗插件操作方法,结合实例形式详细分析了layer弹窗插件的下载、调用、设置等具体步骤与操作技巧,需要的朋友可以参考下
    2017-05-05

最新评论