)
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载本指南围绕 Xberg 仓库中的 Elixir 语言示例 format_docx_equations.md 展开讲解如何通过 Elixir 绑定调用 Xberg 文档智能提取内核把 DOCX 文档中的 Office 数学公式OMML 结构转换为标准 LaTeX 数学表达式并原样保留在 Markdown 输出中。读完本文你将掌握Xberg.ExtractInput的构造方法、output_formatmarkdown配置的作用以及内核中 OMML→LaTeX 转换器的完整工作原理与可验证的测试依据。场景为什么需要公式提取DOCX.docx是 OOXML 格式的 Word 文档其中由 Word 公式编辑器Equation Editor创建的数学公式并不是普通文本而是以OMMLOffice Math Markup Language语法存储在内嵌的 XML 片段中常见结构为m:oMathPara块级公式与m:oMath行内公式。直接把这类 XML 当作纯文本抽取会得到一堆难以阅读的标签碎片无法满足下游 LLM 提示词、RAG 检索或学术排版对数学内容的需求。Xberg 的做法是在解析 DOCX 主文档 XML 时一旦遇到 OMML 子树立即交给专门的转换器将其递归渲染为LaTeX 记号如\frac{a}{b}、\sum_{i1}^{n}{x}随后以公式节点形式写入提取结果当请求 Markdown 输出时这些 LaTeX 表达式会以美元符号$包裹的形式出现在文本流中保证公式在 Markdown 与后续渲染链路中保持结构语义。一段可运行的 Elixir 示例仓库中的关联文档给出了最简调用形式——构造一个指向远程 DOCX 的Xberg.ExtractInput调用异步提取接口并打印首条结果的contentinput_value %Xberg.ExtractInput{filename: equations.docx, kind: uri, mime_type: application/vnd.openxmlformats-officedocument.wordprocessingml.document, uri: https://example.com/docx/equations.docx} result Xberg.extract_async(input_value, {\output_format\:\markdown\}) IO.inspect(Enum.at(result.results, 0).content)逐行拆解这段代码构造输入%Xberg.ExtractInput{...}声明了本次要提取的文档来源。kind: uri表示按 URI 拉取远程文件uri指向文档地址mime_type显式声明为 DOCX 标准 MIME 类型application/vnd.openxmlformats-officedocument.wordprocessingml.document内核据此选择 DOCX 提取器避免依赖 URL 后缀猜测filename: equations.docx用于文档元数据与上下文判断。配置输出格式第二个参数是 JSON 字符串{output_format:markdown}要求结果以 Markdown 形式渲染——这正是公式以 LaTeX 美元符号出现在content中的前提。读取结果返回的results是提取结果列表Enum.at(result.results, 0)取第一个结果.content即文档内容的 Markdown 文本IO.inspect/1打印到终端便于检查。更贴近真实测试的调用形式上述片段中的Xberg.extract_async/2是直接面向底层 NIF 的接口见 native.ex。仓库内的端到端测试则使用更高层的包装函数Xberg.extract/1以 keyword 形式传入input与config返回{:ok, result}元组并同样断言首条结果内容为二进制且包含${:ok, result} Xberg.extract( input: %Xberg.ExtractInput{ filename: equations.docx, kind: uri, mime_type: application/vnd.openxmlformats-officedocument.wordprocessingml.document, uri: $mock_url/docx/equations.docx }, config: {\output_format\:\markdown\} ) assert String.contains?(to_string(Enum.at(result.results, 0).content), $)这段代码来自 format_specific_test.exs它通过 mock server 提供equations.docx测试文档验证提取不报错、内容长度不少于 20 字节、且输出中包含 LaTeX 公式标记符号$。两个断言共同保证了公式确实被转换进了 Markdown 输出而非被丢弃或保留为原始 XML。ExtractInput统一提取入口的数据结构Xberg.ExtractInput是 Elixir 侧所有提取入口共用的输入结构定义见 extract_input.ex字段如下字段类型说明kindXberg.ExtractInputKind.t()输入来源类型常用:uri远程地址与:bytes内存字节流uriString.t() \| nilkind为:uri时使用的文档地址bytesbinary() \| nilkind为:bytes时直接传入的文档二进制内容mime_typeString.t() \| nil文档 MIME 类型决定内核选择哪个提取器filenameString.t() \| nil文件名提示参与格式识别与元数据configXberg.FileExtractionConfig.t() \| nil附带的文件级提取配置注意mime_type的价值在示例中它显式给出 DOCX 的 MIME内核可直接命中 DOCX 提取器无需依赖文件名或内容嗅探。若要提取本地内存中的 DOCX只需把kind换成:bytes并填充bytes字段即可。底层原理OMML 流式解析与 LaTeX 渲染公式提取不是字符串替换而是内核在解析 DOCX 主文档 XML 时流式接管 OMML 子树完成的。整个链路位于 extraction/docx/math 模块模块注释明确写道当流式解析器遇到m:oMathPara或m:oMath时把子树收集为一棵MathNode树再递归渲染为 LaTeX。第一步解析器触发转换DOCX 的流式解析器 parser.rs 在事件循环中遇到以下两个标签时m:oMathPara→ 调用collect_and_convert_omath_para产出**块级display**公式结果存入Run.math_latex: Some((latex, true))m:oMath→ 调用collect_and_convert_omath产出**行内inline**公式标记为(latex, false)。生成的公式随后作为普通Run推入当前段落流之后由 docx.rs 的collect_run_annotations将带math_latex的 Run 提取为math_formulas列表最终以公式节点Formula的形式并入文档元素树随output_formatmarkdown一起渲染成含$...$的 Markdown 文本。第二步递归收集为 MathNode 树collect.rs 负责把 OMML 子树转成内部MathNode枚举树collect_children不断读取 XML 事件直到匹配的结束标签dispatch_omml_tag按标签名分派收集逻辑。OMML 元素与内部节点的对应关系包括OMML 标签语义MathNode 变体m:r文本运行Run(String)m:sSup/m:sSub/m:sSubSup上标 / 下标 / 上下标SSup/SSub/SSubSupm:f分数Frac含 Bar / NoBar / Linear / Skewed 四种样式m:rad根式Rad支持隐藏次数deg_hidem:nary大型运算符求和、积分等Narym:d定界符括号Delimm:func函数名Funcm:acc重音符号如\hatAccm:eqArr公式数组EqArrm:limLow/m:limUpp上下极限LimLow/LimUppm:bar上划线 / 下划线Barm:borderBox边框框BorderBoxm:m矩阵Matrixm:box/m:phant/m:oMath分组容器Groupm:sPre前置上下标SPre值得注意的实现细节未识别的 OMML 标签不会导致整篇文档失败dispatch_omml_tag对未知标签调用skip_to_end直接跳过其子树并返回None同时会精确退还安全预算的enter()计数避免深度泄漏见 collect.rs 中的~keep注释。第三步递归渲染为 LaTeXrender.rs 对MathNode树逐节点拼接 LaTeX 记号例如SSup→base^{sup}render_ssup输出{ base }^{ sup }SSub→base_{sub}文本运行则经render_run_text处理来自 math_symbols.rs负责数学符号与希腊字母的映射如\pi。第四步块级公式的排版细节collect_and_convert_omath_para对m:oMathPara的多个内部子公式使用\\\\LaTeX 换行连接构成多行 display 公式而单一行内m:oMath直接整体渲染。这使得 Word 中公式数组/多行公式能够忠实映射为 LaTeX 的对齐块。转换能力速查单元测试给出的基准输出模块自带的单元测试 math/tests.rs 用大量断言锁定了转换基准以下均是测试中直接断言过的输入→输出映射可作为能力清单数学结构期望 LaTeX希腊字母\pi分数\frac{a}{b}二项式系数\binom{n}{k}平方根 / n 次根\sqrt{x}、\sqrt[3]{x}求和含上下限\sum_{i1}^{n}{x}定积分\int_{0}^{1}{f(x)dx}成对定界符\left(xy\right)、\left[x\right]、\left(a \mid b\right)重音\hat{x}、\overline{x}、\underline{x}边框\boxed{Emc}矩阵\begin{matrix}a b \\ c d\end{matrix}多行公式数组\begin{aligned}x1 \\ y2\end{aligned}函数名\sin{x}上下极限\underset{n\rightarrow \infty }{lim}二次公式组合结构x\frac{-b\pm \sqrt{b^{2}-4ac}}{2a}其中二次公式一例最值得关注它同时覆盖了分数、根式、上下标、加减号\pm的嵌套组合证明转换器具备处理任意深度嵌套表达式的递归能力test_omath_para_display等测试则专门验证m:oMathPara块级路径见 tests.rs。不止 DOCX同一转换器的复用这套 OMML→LaTeX 转换器并非 DOCX 独占。PPTX 的解析器在遇到文本框中内嵌的数学内容时同样调用collect_and_convert_omath_para与collect_and_convert_omath完成公式转换见 pptx/parser.rs。而在 ODT、ODP 与 EPUB 等文档中公式以 MathMLPresentation MathML形式存在内核提供了结构对标的 mathml.rs 转换器模块注释明确说明其设计以docx::math的 OMML 转换器为模型同样先收集为MmlNode树再递归渲染 LaTeX未处理元素降级为其文本内容而不是使整篇文档失败。这意味着从不同办公格式提取出的公式最终都能统一汇入同一种 LaTeX 表示方便下游统一消费。验证与运行方式端到端验证运行e2e/elixir测试套件中的format_docx_equations用例format_specific_test.exs它会通过 mock server 提供测试文档断言结果内容非空且包含$。契约与夹具测试对应的输入/断言定义见 fixtures/format_specific/format_docx_equations.json其中mock_responses指定了/docx/equations.docx的响应 MIME 与文档源assertions包括not_error提取无错误、min_lengthresults[0].content至少 20 字节与contains $输出中出现 LaTeX 公式标记。本地复现将片段中的uri替换为本地可达的 DOCX 地址或改用kind: :bytes直接传入二进制在装有 Xberg Elixir 依赖的 Mix 项目里执行同一调用即可在终端看到包含$...$LaTeX 公式的 Markdown 内容。小结从一段 3 行的 Elixir 调用出发本文完整还原了 DOCX 公式提取的端到端链路Xberg.ExtractInput声明文档来源与 MIME →output_formatmarkdown触发 Markdown 渲染 → 内核流式解析器捕获m:oMathPara/m:oMath→MathNode树递归收集 → LaTeX 记号渲染 → 以公式节点进入文档结构并最终出现在带$包裹的 Markdown 输出中。Xberg 的这套实现既保证了公式的结构语义不丢失也让下游 LLM、检索与排版场景可以直接消费标准 LaTeX。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg C 提取 DOCX 公式OMML 数学转 LaTeX Markdown 的端到端实践xberg C 提取 DOCX 公式OMML 数学转 LaTeX Markdown 的端到端实践 xberg 是一款以 Rust 为核心的跨语言文档智能引擎后端AI 应用NLPxberg C API 实战将 DOCX 文档中的公式提取为 LaTeX 数学标记format_docx_equations 场景解析xberg C API 实战将 DOCX 文档中的公式提取为 LaTeX 数学标记format_docx_equations 场景解析 本文围绕 xber后端AI 应用NLP在 Dart 中使用 xberg 从 DOCX 提取公式OMML 转 LaTeX 数学公式实战指南在 Dart 中使用 xberg 从 DOCX 提取公式OMML 转 LaTeX 数学公式实战指南 导读 本文围绕 xberg 文档提取引擎的一个典型场景展开后端AI 应用NLP上一篇智能合并与去重Hyper-Extract 增量更新如何优雅处理冲突下一篇小红书内容保存难题XHS-Downloader让你3分钟轻松搞定无水印下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考