点击按钮导出textarea文本为DOCX失败:mammoth.convertText未找到
问题:使用mammoth导出文本为DOCX时报错
TypeError: mammoth.convertText is not a function 我需要实现点击按钮时,将textarea(outputTextElem)中的文本导出为DOCX文档,但现有代码无法正常运行。已引入mammoth.browser.min.js,执行时触发如下报错:
script.js:216 Error converting text to DOCX: TypeError: mammoth.convertText is not a function at HTMLButtonElement.<anonymous> (script.js:205:36)
相关代码
JavaScript实现代码
const downloadBtn = document.querySelector("#download-btn"); downloadBtn.addEventListener("click", async (e) => { const outputText = outputTextElem.value; const outputLanguage = outputLanguageDropdown.querySelector(".selected").dataset.value; if (outputText) { try { const result = await mammoth.convertText({ arrayBuffer: outputText }, { ignoreEmptyParagraphs: true }); const blob = new Blob([result.value], { type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.download = `translated-to-${outputLanguage}.docx`; a.href = url; a.click(); } catch (error) { console.error("Error converting text to DOCX:", error); } } });
引入的脚本
<script src="https://cdnjs.cloudflare.com/ajax/libs/mammoth/1.4.2/mammoth.browser.min.js"></script>
问题原因
- mammoth库的用途理解错误:mammoth的核心功能是解析已有的DOCX文档,将其转换为HTML或纯文本,而非反向生成DOCX。
mammoth.convertText这个方法根本不存在,属于误用API。 - DOCX格式认知错误:直接把纯文本包装成Blob并设置DOCX的MIME类型无效,DOCX是复杂的ZIP压缩包,内部包含特定结构的XML文件,不是简单的文本文件。
解决方案
要实现纯文本转DOCX,需要使用专门的生成类库,或手动构建符合DOCX规范的文件结构,以下是两种可行方案:
方案1:使用docx.js库生成DOCX
docx.js是专门用于生成DOCX文档的库,使用简单且功能完善:
- 引入docx.js库
<script src="https://unpkg.com/docx@8.5.0/build/index.js"></script>
- 修改JavaScript代码
const downloadBtn = document.querySelector("#download-btn"); downloadBtn.addEventListener("click", async (e) => { const outputText = outputTextElem.value; const outputLanguage = outputLanguageDropdown.querySelector(".selected").dataset.value; if (outputText) { try { // 创建DOCX文档实例,将文本拆分为段落 const doc = new docx.Document({ sections: [{ children: outputText.split("\n").map(line => new docx.Paragraph({ children: [new docx.TextRun(line)], spacing: { after: 100 } }) ) }] }); // 生成Blob并触发下载 const blob = await docx.Packer.toBlob(doc); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.download = `translated-to-${outputLanguage}.docx`; a.href = url; a.click(); URL.revokeObjectURL(url); // 释放浏览器资源 } catch (error) { console.error("Error converting text to DOCX:", error); } } });
方案2:手动生成简单DOCX(依赖JSZip)
DOCX本质是ZIP压缩包,可通过构建基础XML结构并压缩实现:
- 引入JSZip库
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
- 修改JavaScript代码
const downloadBtn = document.querySelector("#download-btn"); downloadBtn.addEventListener("click", async (e) => { const outputText = outputTextElem.value; const outputLanguage = outputLanguageDropdown.querySelector(".selected").dataset.value; if (outputText) { try { const zip = new JSZip(); // 添加DOCX必需的核心文件结构 zip.file("[Content_Types].xml", `<?xml version="1.0" encoding="UTF-8"?> <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> <Default Extension="xml" ContentType="application/xml"/> <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/> </Types>`); // 生成包含文本内容的文档XML const contentXml = `<?xml version="1.0" encoding="UTF-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> ${outputText.split("\n").map(line => `<w:p><w:r><w:t>${line}</w:t></w:r></w:p>`).join("")} </w:body> </w:document>`; zip.folder("word").file("document.xml", contentXml); // 生成ZIP包并触发下载 const blob = await zip.generateAsync({ type: "blob" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.download = `translated-to-${outputLanguage}.docx`; a.href = url; a.click(); URL.revokeObjectURL(url); } catch (error) { console.error("Error converting text to DOCX:", error); } } });
内容的提问来源于stack exchange,提问作者user221117
相关产品推荐
相关产品推荐

