js实现word转换为html

前言

最近接到一个需求,实现上传一个word文档,然后将该word转换成html丢给服务端存上。进行技术调研后发现有三种方法可以实现这个功能:ActiveXObjectdocx2htmlmammoth

IE的 ActiveXObject

    var oWordApp=new   ActiveXObject("Word.Application");      
    var oDocument=oWordApp.Documents.Open("C://test.doc");      
    oDocument.SaveAs("C://test.html", 10)     

缺点:只有IE才有这个东西

docx2html

Git地址:https://github.com/lalalic/docx2html

使用方法:

// html 部分
<input type="file" @change="handleFileSelect">
<textarea id="text"></textarea>

// js部分
handleFileSelect(event){
	require("docx2html")(event.target.files[0]).then(function(converted){
		console.log(converted)
		document.querySelector('textarea').value=converted.toString()
	})
}

缺点:只能将简单的docx文件转化成html,复杂点的就报错了,如图:

mammoth.js

Git地址:https://github.com/mwilliamson/mammoth.js

中文文档地址:https://www.helplib.com/GitHub/article_106969

使用方法:

    //html:部分
    <div class="container">
      <input id="document" type="file" @change="handleFileSelect" />
      <div class="row">
        <div class="span8">
          <div id="output" class="well">
          </div>
        </div>
        <div class="span4">
          <h3>Messages</h3>
          <div id="messages">
          </div>
        </div>
    </div>
	</div>
 //js:部分
     handleFileSelect(event) {
        this.readFileInputEventAsArrayBuffer(event,  (arrayBuffer) => {
            mammoth.convertToHtml({arrayBuffer: arrayBuffer})
                .then(this.displayResult)
                .done();
        });
    },

    displayResult(result) {
		console.log(result)
        document.getElementById("output").innerHTML = result.value;

        var messageHtml = result.messages.map((message) => {
            return '<li class="' + message.type + '">' + this.escapeHtml(message.message) + "</li>";
        }).join("");

        document.getElementById("messages").innerHTML = "<ul>" + messageHtml + "</ul>";
    },

    readFileInputEventAsArrayBuffer(event, callback) {
        var file = event.target.files[0];

        var reader = new FileReader();

        reader.onload = function(loadEvent) {
            var arrayBuffer = loadEvent.target.result;
            callback(arrayBuffer);
        };

        reader.readAsArrayBuffer(file);
    },

    escapeHtml(value) {
        return value
            .replace(/&/g, '&amp;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;');
    },

缺点:只支持docx的word文档,并且转换后的标题没有居中,如图:

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Word 文档转换HTML 有多种方法,其中一种常用的方法是使用 Microsoft Office 自带的 “另存为” 功能。然后,可以使用 JavaScript 将生成的 HTML 文件加载到 Web 页面中进行在线预览。 下面是一个使用 JSZip 和 Docxtemplater 库将 Word 文档转换HTML 的示例代码: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Word to HTML Converter</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.5.0/jszip.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/docxtemplater/3.5.0/docxtemplater.js"></script> </head> <body> <input type="file" id="file-input"> <div id="preview-container"></div> <script> // 获取文件输入元素和预览容器元素 const fileInput = document.getElementById('file-input'); const previewContainer = document.getElementById('preview-container'); // 监听文件选择事件 fileInput.addEventListener('change', event => { // 获取选中的文件 const file = event.target.files[0]; // 创建读取文件的 FileReader 对象 const reader = new FileReader(); // 监听文件读取完成事件 reader.addEventListener('load', async () => { // 将读取的文件内容转换为二进制数组 const buffer = reader.result; // 使用 JSZip 解压缩文件 const zip = await JSZip.loadAsync(buffer); // 获取文档主体内容 const documentXml = await zip.file('word/document.xml').async('string'); // 使用 Docxtemplater 渲染文档 const doc = new Docxtemplater(); doc.loadZip(zip); doc.setData({}); doc.render(); // 将渲染结果转换HTML const renderedHtml = doc.getZip().file('word/document.xml').asText(); const html = await convertToHtml(renderedHtml); // 显示预览结果 previewContainer.innerHTML = html; }); // 读取文件内容 reader.readAsArrayBuffer(file); }); // 将渲染结果转换HTML async function convertToHtml(renderedXml) { // 创建虚拟 DOM const domParser = new DOMParser(); const xmlDoc = domParser.parseFromString(renderedXml, 'application/xml'); const virtualDom = document.createElement('div'); // 遍历文档节点,将节点转换HTML 元素 for (const node of xmlDoc.childNodes) { const element = convertNodeToElement(node); virtualDom.appendChild(element); } // 返回 HTML 字符串 return virtualDom.innerHTML; } // 将文档节点转换HTML 元素 function convertNodeToElement(node) { // 如果是文本节点,则返回文本元素 if (node.nodeType === Node.TEXT_NODE) { return document.createTextNode(node.textContent); } // 如果是元素节点,则创建对应的 HTML 元素并添加子元素 if (node.nodeType === Node.ELEMENT_NODE) { const element = document.createElement(node.nodeName); for (const attribute of node.attributes) { element.setAttribute(attribute.nodeName, attribute.nodeValue); } for (const childNode of node.childNodes) { const childElement = convertNodeToElement(childNode); element.appendChild(childElement); } return element; } return null; } </script> </body> </html> ``` 这个示例代码将文件输入元素和预览容器元素添加到 HTML 页面中,并使用 JSZip 和 Docxtemplater 库将 Word 文档转换HTML,并使用 JavaScript 将渲染结果转换HTML 元素,最后将结果显示在预览容器中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值