资讯详情

资讯详情

mammoth.js 完全指南:将 Word .docx 文档转换为干净 HTML 的实战手册

文档开发工具【免费下载链接】mammoth.jsConvert Word documents (.docx files) to HTML项目地址https://gitcode.com/gh_mirrors/ma/mammoth.js点击查看免费下载导读mammoth.js 是一款专用于把.docx文档Microsoft Word、Google Docs、LibreOffice 生成的均可转换为 HTML 的 JavaScript 库。与“像素级还原”的转换器不同mammoth.js 的核心设计是利用文档中的语义信息如标题样式、列表、脚注生成简洁的 HTML并忽略字体、字号、颜色等纯视觉细节。读完本文你将掌握通过 CLI 一键转换文档、在 Node.js 与浏览器中以库的方式调用 API、自定义 Word 样式到 HTML 的映射规则style map、自定义图片处理、文档变换document transform以及安全注意事项并能从源码层面理解这些能力的实现原理。本文以仓库根目录的 README.md 为主体展开并结合 lib/options-reader.js、lib/style-reader.js、lib/document-to-html.js 等源码文件进行纵深解析。设计理念语义转换而非样式复制mammoth.js 的目标不是把 Word 文档“画”成 HTML而是把文档的语义结构翻译成 HTML 结构。最典型的例子文档中任何使用了Heading 1样式的段落都会被转换为h1元素而不会去复制该标题的字体、字号、颜色等视觉样式。这种取舍源于一个客观事实.docx的内部结构与 HTML 的结构之间存在巨大差异对于复杂文档转换不可能做到完美。因此mammoth.js 的最佳实践前提是你只使用样式对文档进行语义化标记例如用“Heading 1”标记标题而不是手动把字号调大。只要遵循这一前提转换结果会非常理想。目前支持的功能包括标题Headings列表Lists可自定义的 Word 样式 → HTML 映射例如通过一条样式映射把WarningHeading转换为h1.warning表格Tables表格自身的格式如边框会被忽略但表格内文本的处理方式与文档其余部分一致脚注与尾注Footnotes / endnotes图片Images粗体、斜体、下划线、删除线、上标、下标链接Links换行Line breaks文本框Text boxes文本框内容被当作独立段落处理出现在包含该文本框的段落之后批注Comments安装与快速上手npm 安装在 Node.js 项目中安装npm install mammoth根据 package.json当前仓库版本为1.13.0要求 Node.js12.0.0依赖xmldom/xmldom、argparse、jszip、underscore、xmlbuilder等核心包argparse用于解析 CLI 参数jszip用于读取 docx 内部的 zip 结构。网页演示Web demo最快的体验方式是使用仓库自带的浏览器演示克隆本仓库运行make setup该命令会执行npm install并构建mammoth.browser.min.js见 makefile用浏览器打开browser-demo/index.html。演示页面加载mammoth.browser.js与 browser-demo/demo.jsdemo.js 通过FileReader.readAsArrayBuffer读取用户选择的文件再调用mammoth.convertToHtml({arrayBuffer: arrayBuffer})把生成的 HTML 直接注入页面、把转换消息渲染到消息区——这是浏览器端arrayBuffer输入的典型示例。其他语言平台mammoth 还有 Python、WordPress、Java/JVM、.NET 等官方移植版本README 中给出了各自仓库与发行渠道链接本项目仓库是 JavaScript 版本。CLI 命令行用法安装后即可使用mammoth命令bin配置见 package.json入口脚本为 bin/mammoth。基本转换mammoth document.docx output.html第一个参数是.docx源文件路径必填第二个参数是输出文件路径可选如果不指定输出会写到 stdout--output-dir与输出路径互斥在 bin/mammoth 中二者被声明为 mutually exclusive group。注意两点输出是 HTML 片段fragment而非完整 HTML 文档编码为 UTF-8由于片段中未显式声明编码如果浏览器不默认使用 UTF-8直接打开输出文件时 Unicode 字符可能显示错误。重要安全提示mammoth 不对源文档做任何净化sanitisation处理处理不可信的用户输入时必须极度谨慎。详见下文“安全注意事项”一节。图片输出默认情况下图片会以 data URI 内联在输出 HTML 中。如果指定了--output-dir图片会被写成独立文件mammoth document.docx --output-diroutput-dir已有文件会被覆盖。其实现逻辑见 lib/main.jsCLI 会根据path.basename(docxPath, .docx)生成源文件名.html并依次把图片命名为1.png、2.png等序号 按contentType推断的扩展名然后通过自定义的convertImage把图片写入输出目录、在img的src中引用文件名。自定义样式映射文件通过--style-map从文件读取自定义样式映射mammoth document.docx output.html --style-mapcustom-style-map其中custom-style-map文件内容类似p[style-nameAside Heading] div.aside h2:fresh p[style-nameAside Text] div.aside p:fresh样式映射的完整语法见下文“编写样式映射”一节。--style-map的内容会被整体作为字符串传入options.styleMap见 lib/main.js 的readStyleMap。Markdown 输出已弃用mammoth document.docx --output-formatmarkdown注意Markdown 支持已被弃用deprecated。官方建议生成 HTML 后用独立的 HTML→Markdown 转换库处理效果通常更好。--output-format的合法取值只有html与markdown默认html见 bin/mammoth。在 Node.js 与浏览器中以库的方式使用引入方式Node.js 中常规引入var mammoth require(mammoth);也可以使用独立打包文件mammoth.browser.js包含 mammoth 及其全部依赖。它会自动适配当前环境加载的模块系统例如 CommonJS 下var mammoth require(mammoth/mammoth.browser);如果环境中没有任何模块系统mammoth会被挂载为 window 全局变量。该文件在开发期由make setup生成见 makefile 中的 browserify 构建命令。基础转换convertToHtmlvar mammoth require(mammoth); mammoth.convertToHtml({path: path/to/document.docx}) .then(function(result){ var html result.value; // 生成的 HTML var messages result.messages; // 转换过程中的消息如警告 }) .catch(function(error) { console.error(error); });mammoth.convertToHtml返回的是一个Promise。从 lib/index.js 可以看到转换主流程是unzip.openZip(input)打开 docxzip→docxStyleMap.readStyleMap读取文档内嵌样式映射 →docxReader.read解析文档 → 应用transformDocument→ 由DocumentConverter生成 HTML。提取纯文本extractRawTextmammoth.extractRawText({path: path/to/document.docx}) .then(function(result){ var text result.value; // 纯文本 var messages result.messages; }) .catch(function(error) { console.error(error); });extractRawText会忽略文档中所有格式每个段落后面跟两个换行符。其底层实现见 lib/raw-text.js文本节点直接取valuetab转为制表符段落追加\n\n后缀。自定义样式映射Custom style map传入方式与优先级默认情况下mammoth 会把常见的 Word 样式映射到 HTML 元素例如样式名为Heading 1的段落会转换为h1。你可以通过给convertToHtml的第二个参数传入带styleMap属性的 options 对象来覆盖默认行为。例如希望样式名Section Title的段落变成h1、Subsection Title变成h2var mammoth require(mammoth); var options { styleMap: [ p[style-nameSection Title] h1:fresh, p[style-nameSubsection Title] h2:fresh ] }; mammoth.convertToHtml({path: path/to/document.docx}, options);为了方便把样式映射存放在文本文件中styleMap也可以是一个字符串每一行视为一条独立映射空行和以#开头的行会被忽略var options { styleMap: p[style-nameSection Title] h1:fresh\n p[style-nameSubsection Title] h2:fresh };优先级规则用户定义的样式映射优先于默认样式映射如果想完全停用默认样式映射设置options.includeDefaultStyleMap为falsevar options { styleMap: [ p[style-nameSection Title] h1:fresh, p[style-nameSubsection Title] h2:fresh ], includeDefaultStyleMap: false };默认样式映射与合并机制从源码 lib/options-reader.js 可以看到默认样式映射_defaultStyleMap的具体内容包括各级标题p.Heading1 h1:fresh至p.Heading6 h6:fresh以及按样式名匹配的Heading 1~Heading 6含小写变体、Apple Pages 的Heading字符样式r[style-nameStrong] strong脚注/尾注/批注相关的段落与引用样式含 LibreOffice 的Footnote、Endnote变体多级有序/无序列表p:unordered-list(1) ul li:fresh、p:ordered-list(1) ol li:fresh以及深达 5 级的嵌套列表写法r[style-nameHyperlink] 空 HTML 路径即仅保留子内容p[style-nameNormal] p:fresh与 Apple Pages 的p.Body。readOptions在合并时遵循这样的顺序readStyleMap函数先取customStyleMap若includeEmbeddedStyleMap为真则拼接文档内嵌样式映射embeddedStyleMap若includeDefaultStyleMap为真再拼接默认映射。这也是“用户定义 内嵌 默认”优先级顺序的由来。另外在 lib/index.js 中可以看到mammoth.styleMapping()这个旧 API 已被移除并抛错提示改用原始字符串写法如p[style-nameTitle] h1。字符级样式控制粗体Bold默认情况下粗体文本被包裹在strong标签中。通过为b添加样式映射可以改变行为例如改为emvar options { styleMap: [ b em ] };斜体Italic默认斜体文本包裹在em中。为i添加映射可改变行为例如改为strongvar options { styleMap: [ i strong ] };下划线Underline默认情况下下划线会被忽略因为 HTML 文档中下划线容易与链接混淆。可以通过为u添加映射来改变。例如源文档用下划线表示强调则下面配置会把显式加下划线的文本包进emvar options { styleMap: [ u em ] };注意在 1.0.0 之前的版本中曾存在convertUnderline选项现已被移除统一改用样式映射控制见下文升级指南。删除线Strikethrough默认删除线文本包裹在s标签中。通过为strike添加映射可改变例如改为delvar options { styleMap: [ strike del ] };批注Comments默认情况下批注会被忽略。要把它包含进生成的 HTML需要为comment-reference添加样式映射var options { styleMap: [ comment-reference sup ] };批注会追加在文档末尾并用上述样式映射包装指向批注的链接。源码实现在 lib/document-to-html.js文档转换器会把commentReference转换为带href与id的锚点#comment-xxx/#comment-ref-xxx并把批注渲染成dl dt dd结构每个批注附带回跳链接↑。自定义图片处理器Custom image handlers默认情况下图片被转换为img元素图片源内联在src属性中data URI。可以通过设置convertImage选项为一个image converter来改变这一行为。例如以下配置复刻了默认行为var options { convertImage: mammoth.images.imgElement(function(image) { return image.read(base64).then(function(imageBuffer) { return { src: data: image.contentType ;base64, imageBuffer }; }); }) };mammoth.images.imgElement(func)会为 docx 中的每张图片创建一个img元素。func接收一个参数image它是正在被转换的图片元素具有以下属性/方法contentType图片的内容类型如image/pngreadAsArrayBuffer()将图片读取为ArrayBuffer返回 PromisereadAsBuffer()将图片读取为Buffer返回 Promise浏览器中除非使用了 Buffer polyfill否则不支持readAsBase64String()将图片读取为 base64 编码字符串返回 Promiseread([encoding])已弃用按指定编码读取指定编码返回字符串 Promise不指定则返回 Buffer Promise。func应返回一个对象或对象的 Promise作为img元素的属性至少应包含src。如果图片带有 alt 文本会被自动加入元素属性。源码见 lib/images.jsimgElement会把element.altText自动放入attributes.alt再与func的返回值合并而mammoth.images.dataUri正是默认的图片转换器内部用readAsBase64String拼接data:URI。CLI 的--output-dir模式之所以能把图片落盘本质上也是向convertImage注入了自定义处理器。API 完整参考mammoth.convertToHtml(input, options)将源文档转换为 HTML。input描述源文档的对象。Node.js 支持{path: path}path为.docx文件路径{buffer: buffer}buffer为包含.docx文件的 Node.js Buffer。浏览器支持{arrayBuffer: arrayBuffer}arrayBuffer为包含.docx文件的 ArrayBuffer。options可选转换选项。可能包含以下属性属性说明styleMap控制 Word 样式到 HTML 的映射。字符串时按行拆分忽略空行与#开头行数组时每个元素是一条映射字符串。语法见“编写样式映射”。includeEmbeddedStyleMap默认true若文档内含嵌入式样式映射则与默认样式映射合并。设为false可忽略任何内嵌样式映射。includeDefaultStyleMap默认truestyleMap传入的映射与默认样式映射合并。设为false可完全停用默认映射。externalFileAccess默认false源文档可能引用文档外部的文件默认禁止访问这些外部文件转换受信任文档时设为true以启用。convertImage默认把图片转换为内联src的img。设为一个 image converter 可覆盖默认行为。ignoreEmptyParagraphs默认true忽略空段落。设为false则保留空段落。idPrefix加到所有生成的 ID如书签、脚注、尾注 ID前面的字符串默认为空字符串。transformDocument若设置该函数会在转 HTML 之前应用于从 docx 读取的文档。此 API 视为不稳定见“文档变换”。返回值包含结果的 Promise。结果对象属性value生成的 HTMLmessages转换过程中产生的消息如错误与警告。mammoth.convertToMarkdown(input, options)Markdown 支持已弃用。行为与convertToHtml相同只是结果的value属性是 Markdown 而非 HTML。从 lib/index.js 可以看出它本质上只是把outputFormat置为markdown后调用同一个convert。mammoth.extractRawText(input)提取文档纯文本忽略所有格式每个段落以两个换行符结尾。input支持形式与convertToHtml相同。返回 Promise结果对象含value纯文本与messages。mammoth.embedStyleMap(input, styleMap)给定一个已有 docx 文件embedStyleMap会生成一个内嵌了样式映射的新 docx 文件。之后 mammoth 读取该新文件时会自动使用内嵌样式映射。input同前支持{path}、{buffer}Node.js与{arrayBuffer}浏览器styleMap要内嵌的样式映射返回 Promise对 Promise 中的值调用toArrayBuffer()得到新文档的ArrayBuffer调用toBuffer()得到Buffer。示例mammoth.embedStyleMap({path: sourcePath}, p[style-nameSection Title] h1:fresh) .then(function(docx) { fs.writeFile(destinationPath, docx.toBuffer(), callback); });实现细节见 lib/docx/style-map.js内嵌样式映射被写入 docx 内的mammoth/style-map路径并同步更新word/_rels/document.xml.rels新增rMammothStyleMap关系与[Content_Types].xml新增text/prs.mammoth.style-map内容类型读取时则检查mammoth/style-map是否存在。测试数据 test/test-data/embedded-style-map.docx 即用于验证该机制。Messages消息每条消息具有以下属性type消息类型字符串如warning或errormessage实际消息文本error可选导致该消息的异常对象若有。在 lib/document-to-html.js 中可以见到消息的典型来源当段落/文本块的样式在样式映射中找不到对应项时会生成形如Unrecognised paragraph style: xxx (Style ID: xxx)的警告。编写样式映射Writing style maps样式映射style map由若干条**样式映射规则style mapping**以换行分隔组成空行与#开头的行被忽略。每条映射有两个部分箭头左侧文档元素匹配器document element matcher箭头右侧HTML 路径HTML path。转换每个段落时mammoth 会找到第一条“匹配当前段落的文档元素匹配器”所对应的映射然后确保对应的 HTML 路径被满足。解析器实现见 lib/style-reader.js基于lop解析组合子与 lib/styles/parser/tokeniser.js 的词法分析匹配逻辑见 lib/styles/document-matchers.js。新鲜度Freshness理解映射语义前必须先理解 mammoth 的“新鲜度fresh”概念生成 HTML 时mammoth只有在必要时才关闭 HTML 元素否则会复用已有元素。例如假设映射为p[style-nameHeading 1] h1不带:fresh遇到第一个Heading 1段落时生成一个h1如果下一个段落也是Heading 1其文本会被追加到已有的h1元素里而不是新建一个h1。大多数情况下你可能希望新建元素此时使用:fresh修饰符p[style-nameHeading 1] h1:fresh两个连续的Heading 1段落随后会被转换为两个独立的h1元素。元素复用适合生成更复杂的 HTML 结构。例如docx 中包含多个“aside”区块每个 aside 有标题和正文并应包在同一个div.aside里p[style-nameAside Heading] div.aside h2:fresh p[style-nameAside Text] div.aside p:freshdiv.aside被复用不标记:fresh而h2、p标记为:fresh从而让标题与正文归入同一个容器。底层行为对应 lib/styles/html-paths.js 中Element.prototype.matchesElement与document-to-html.js的findStyle/htmlPathForParagraph逻辑。文档元素匹配器Document element matchers段落、文本块run与表格匹配任意段落p匹配任意 run文本块对应 Word 中的字符级格式片段r匹配任意表格table按样式名匹配段落、run 或表格样式名即 Microsoft Word 或 LibreOffice 中显示的名称。例如匹配样式名为Heading 1的段落p[style-nameHeading 1]也支持按前缀匹配样式名。例如匹配样式名以Heading开头的段落p[style-name^Heading]还可以按style ID匹配——这是 docx 文件内部使用的 ID。在匹配器后追加.加 style ID 即可例如匹配 style ID 为Heading1的段落p.Heading1注意0.3.0 之前的版本只支持这种 ID 匹配方式现在更推荐按样式名匹配详见升级指南。style ID 与 style name 的区别是ID 是内部标识name 是 Word/LibreOffice 界面显示的名称。粗体b注意只匹配显式应用了粗体的文本不会匹配因段落或 run 样式而变粗的文本。斜体i只匹配显式应用斜体的文本。下划线u只匹配显式应用下划线的文本。删除线strike只匹配显式应用删除线的文本。全大写All capsall-caps只匹配显式应用全大写的文本。小型大写Small capssmall-caps只匹配显式应用小型大写的文本。高亮Highlighthighlight只匹配显式应用高亮的文本。也可以匹配特定颜色例如黄色高亮highlight[coloryellow]常用颜色集合black blue cyan green magenta red yellow white darkBlue darkCyan darkGreen darkMagenta darkRed darkYellow darkGray lightGray忽略文档元素使用!忽略某个文档元素。例如忽略任何样式为Comment的段落p[style-nameComment] !在源码中!对应的 HTML 路径是 lib/styles/html-paths.js 里的htmlPaths.ignore其wrap直接返回空数组而document-to-html.js中findHtmlPath(reference, htmlPaths.ignore)也把忽略作为注释引用的默认行为。HTML 路径HTML paths单个元素最简单的 HTML 路径是指定单个元素例如h1为元素添加 CSS 类追加.加类名h1.section-title添加属性使用类似 CSS 属性选择器的方括号写法p[langfr]要求元素是新鲜的使用:freshh1:fresh修饰符必须按正确顺序书写先元素名再类/属性最后:freshh1.section-title:fresh解析器见 lib/style-reader.js 的styleElementRule依次捕获 tag names、属性/类、fresh、separator。分隔符Separators使用:separator(分隔字符串)指定“被合并到一起的段落内容之间”的分隔符。例如文档中有一段代码每行代码是一个样式为Code Block的段落。可以写p[style-nameCode Block] pre由于pre没有标记:fresh连续的pre元素会合并但结果所有代码会挤在同一行。用:separator在每行代码之间插入换行p[style-nameCode Block] pre:separator(\n)转义序列\n、\r、\t在解析时被解码见 lib/style-reader.js 中的escapeSequences。嵌套元素使用指定嵌套元素。例如指定div.aside中的h2div.aside h2元素可以嵌套任意深度。列表匹配器补充虽然 README 的匹配器章节未单独列出但默认样式映射中实际使用了p:unordered-list(1)、p:ordered-list(2)这类列表匹配器ordered-list/unordered-list加括号内的层级数字它们被解析为{isOrdered, levelIndex}并最终在 lib/styles/document-matchers.js 的isList中与段落的numbering.level、numbering.isOrdered比对。这也是自定义样式时处理列表类文档可参考的写法。文档变换Document transforms该 API 被视为不稳定可能在任何版本之间变化。如果依赖此行为应锁定 mammoth.js 的具体版本并在升级前仔细测试。mammoth 允许文档在转换之前被变换。例如文档没有做语义标记但你已知“所有居中对齐的段落都应该是标题”可以通过transformDocument参数修改文档function transformElement(element) { if (element.children) { var children _.map(element.children, transformElement); element {...element, children: children}; } if (element.type paragraph) { element transformParagraph(element); } return element; } function transformParagraph(element) { if (element.alignment center !element.styleId) { return {...element, styleId: Heading2}; } else { return element; } } var options { transformDocument: transformElement };transformDocument的返回值会被用于 HTML 生成阶段。上述写法可以用辅助函数mammoth.transforms.paragraph写得更简洁function transformParagraph(element) { if (element.alignment center !element.styleId) { return {...element, styleId: Heading2}; } else { return element; } } var options { transformDocument: mammoth.transforms.paragraph(transformParagraph) };再比如把“显式使用等宽字体的段落”识别为代码块const monospaceFonts [consolas, courier, courier new]; function transformParagraph(paragraph) { var runs mammoth.transforms.getDescendantsOfType(paragraph, run); var isMatch runs.length 0 runs.every(function(run) { return run.font monospaceFonts.indexOf(run.font.toLowerCase()) ! -1; }); if (isMatch) { return { ...paragraph, styleId: code, styleName: Code }; } else { return paragraph; } } var options { transformDocument: mammoth.transforms.paragraph(transformParagraph), styleMap: [ p[style-nameCode] pre:separator(\n) ] };辅助函数清单mammoth.transforms.paragraph(transformParagraph)返回一个可作为transformDocument的函数对每个段落元素应用transformParagraphtransformParagraph应返回新的段落。mammoth.transforms.run(transformRun)同上但作用于每个 run 元素。mammoth.transforms.getDescendants(element)获取元素的所有后代。mammoth.transforms.getDescendantsOfType(element, type)获取元素中指定类型的所有后代例如var runs mammoth.transforms.getDescendantsOfType(paragraph, run);这些辅助函数的实现见 lib/transforms.jsparagraph/run基于elementsOfType递归遍历元素树getDescendants通过visitDescendants深度优先收集后代。安全注意事项Securitymammoth 不对源文档做任何净化处理处理不可信输入时必须极度谨慎。README 明确列出了三类风险javascript:链接源文档可以包含javascript:目标的链接。如果允许用户上传源文档、自动转成 HTML 并直接嵌入网站而不净化可能产生点击即可执行任意 JavaScript 的链接。外部文件引用源文档可能引用文档外部的文件。如果允许用户上传 docx 到服务器、在服务器上自动转换并嵌入网页可能造成服务器上的任意文件被读取并外泄。为避免该问题默认禁止访问此类外部文件仅在转换受信任文档时设置options.externalFileAccess为true默认值见 lib/options-reader.js 的standardOptions。病态性能pathological performance很可能可以构造出导致高 CPU 或内存占用的源文档。根据应用性能约束与收到不可信输入的可能性应考虑隔离对 mammoth 的调用例如在独立线程中带超时运行以防拒绝服务攻击。升级指南Upgrading to later versions升级到 1.13.0bluebird Promise 已被替换为原生 Promise。依赖 bluebird Promise 的调用方可用bluebird.Promise.resolve()将返回的 Promise 转换回 bluebird Promise。升级到 1.0.0convertUnderline选项不再受支持请改用样式映射控制下划线的处理方式如u em。升级到 0.3.0若定义了自定义样式映射或使用了文档变换使用方式可能需要微调否则可继续像以前一样使用 mammoth。自定义样式映射0.3.0 之前使用 style ID 匹配 docx 段落例如p.Heading1。这些 ID 是 docx 格式内部使用的、与样式名称Word/LibreOffice 显示的名称不同。虽然 mammoth 仍支持按 ID 匹配但推荐按样式名匹配。例如将p.AsideHeading h1改为p[style-nameAside Heading] h1文档变换0.3.0 之前 mammoth容易误导地把 style ID 赋给了一个名为styleName的属性。现在 style ID 被赋给更合适的styleId属性styleName属性则设为样式名称。要保持旧行为现有文档变换需按下面两种方式之一改写设置styleId属性而不是styleName属性把styleName属性设为样式名称而不是 ID。升级到 0.2.0函数mammoth.style()已更名为mammoth.styleMapping()该函数在当前版本中已被进一步废弃直接改用字符串写法见 lib/index.js。深入阅读从源码理解转换流水线最后把 README 提到的各个概念落到仓库源码上方便你继续深入转换入口与 Promise 流程lib/index.jsconvertToHtml/convertToMarkdown/extractRawText/embedStyleMapCLI 参数解析bin/mammoth、lib/main.js选项合并与默认样式映射lib/options-reader.js样式映射语法解析lib/style-reader.js、lib/styles/parser/tokeniser.js文档匹配器与 HTML 路径lib/styles/document-matchers.js、lib/styles/html-paths.js文档 → HTML 核心转换lib/document-to-html.js段落、run、表格、脚注/尾注、批注、图片、书签等各元素转换器图片处理lib/images.js纯文本提取lib/raw-text.js文档变换辅助lib/transforms.js内嵌样式映射读写lib/docx/style-map.js测试用例仓库 test 目录覆盖了样式映射、CLI、图片、Markdown 输出、文档变换等几乎所有功能例如 test/style-reader.tests.js、test/document-to-html.tests.js、test/main.tests.js并附有hello.zip、tables.docx、footnotes.docx、comments.docx、tiny-picture.docx等真实测试文档可供参考。结语mammoth.js 的价值在于“语义优先”的转换哲学它不追求还原 Word 的每一个像素而是把样式语义翻译成语义化的 HTML。掌握 CLI 用法、styleMap映射语法、图片处理器与文档变换这四类能力你就可以把任意符合“样式即语义”约定的 docx 文档稳定、可控地转换为 HTML同时牢记其“不做净化”的安全边界在面向不可信输入时务必做好隔离与消毒。赞分享文档开发工具【免费下载链接】mammoth.jsConvert Word documents (.docx files) to HTML项目地址https://gitcode.com/gh_mirrors/ma/mammoth.js点击查看免费下载相关推荐如何高效使用Mammoth.js一键将Word文档转换为纯净HTML的完整指南 如何高效使用Mammoth.js一键将Word文档转换为纯净HTML的完整指南 Mammoth.js是一款强大的文档转换工具专门用于将.docx文件文档开发工具Mammoth.js轻松将Word文档转换为HTML的完美解决方案Mammoth.js轻松将Word文档转换为HTML的完美解决方案 还在为Word文档的在线展示而烦恼吗Mammoth.js正是你需要的强大工具这个轻量级文档开发工具Deepfake Offensive Toolkit与碳中和软件开发流程绿色CI/CD实践Deepfake Offensive Toolkit与碳中和软件开发流程绿色CI/CD实践 Deepfake Offensive Toolkit简称dot人工智能计算机视觉渗透测试应用安全上一篇G-Helper终极指南华硕笔记本轻量级控制中心完全手册下一篇G-Helper华硕笔记本终极轻量级控制中心告别臃肿官方软件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →