前端实现Word文档预览与内容提取方案

作者:桌面漫游时间:2026-11-01 02:34:41浏览:544

本文介绍如何在浏览器端实现Word文档的在线预览与内容提取。通过集成docx-preview库完成文档渲染展示,利用mammoth库将文档转换为纯文本、HTML或Markdown格式。文章详细解析了核心API参数及完整代码示例,提供了一套轻量级的前端解决方案。

需求

在上一篇解析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,即任何JSZip.loadAsync支持的数据类型。

2. bodyContainer:指定用于渲染文档的DOM容器区域。

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文档预览和内容提取的方法,更多相关内容可参考本站历史文章或继续浏览后续文章,感谢支持。

作者最新文章