● Math99 接口文档

Math99 LaTeX 公式渲染、格式转换与OCR识别服务

Math99 面向外部合作方提供 LaTeX 公式的渲染、格式转换与OCR识别能力:前端引入 tiny.math99.js 即可自动渲染页面公式,或通过 LaTeX 编辑器 SDK 编辑、新增单个公式;后端提供 LaTeX 转 SVG / MathML、OCR 识别等开放接口,适合大批量存量公式转换,业务数据统一采用 AES 加密传输。

最近更新:2025-11-28
按业务需求进行接入
前端接入

支持对已有内容进行公式渲染、公式识别、单次编辑、或新增单个公式的客户。引入脚本即可让页面中的公式自动渲染,也可通过 SDK 唤起 LaTeX 编辑器。

后端接入

适合已有大批存量公式需要转换的客户。通过开放接口批量将 LaTeX 转成 SVG / MathML,或识别图片中的公式与文字。

合作方ID(appid / partnerInfo)获取方式
登录 https://latex.processon.com/manage/login,进入个人管理后台,点击左侧「开发管理」,右侧「开发者ID」字段即为该值;appid 与 partnerInfo 均在此获取。
调用方的公司域名(X-Referer)配置方式
默认值 127.0.0.1,用户亦可自行设置:登录 https://latex.processon.com/manage/login 个人管理后台,点击左侧「开发管理」,在右侧添加域名白名单即可。

前端接入

通过引入 Math99 前端脚本,即可在页面中渲染公式或嵌入 LaTeX 编辑器。

公式渲染

引入脚本后,页面中已有的 LaTeX 公式会自动渲染,无需额外调用。

Math99 公式在网页中的显示渲染效果
公式显示渲染效果(点击图片可放大查看)

引入方式

方式一:HTML 引用
HTML
<head>
  <script type="text/javascript" src="https://latex.processon.com/assets/js/tiny.math99.js"></script>
</head>
方式二:JS 引用(推荐,可实时更新)
JavaScript
//js引入
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://latex.processon.com/assets/js/tiny.math99.js' + "?v="+ (new Date().getTime();
document.getElementsByTagName('head')[0].appendChild(script);
初始化设置
JavaScript

            tinymath.init("appID")
          

备注

公式渲染兼容以下常见富文本编辑器:TinyMCE、CKEditor 4 / CKEditor 5、Quill、wangEditor、UEditor、KindEditor、Simditor、Froala Editor、Summernote、Jodit、ProseMirror、Slate.js、Tiptap、Lexical、Draft.js 等。

公式编辑器

通过 SDK 以 iframe 唤起 LaTeX 公式编辑器:用户在编辑器中输入或编辑公式后点击插入,结果经回调返回。调起编辑器目前仅支持此 SDK 方式。

在线公式编辑示例↗

Math99 LaTeX 公式编辑器界面效果
公式编辑器界面效果(点击图片可放大查看)

1. 引入 SDK

在 HTML 文件的 <head> 标签中添加以下代码,引入 po-latex-math99.js 文件:

HTML
<script src="https://latex.processon.com/assets/js/po-latex-math99.js"></script>

2. 初始化 SDK

在 HTML 文件的 <script> 标签中调用 PoLatexMath.init() 方法进行初始化:

JavaScript
PoLatexMath.init({
  appID: appID,
  iframeSrc: 'https://latex.processon.com/feditor',
}, function (data) {
  console.log(data)
});

参数说明:

  • appID:您的 应用 ID,需替换为实际值。
  • iframeSrc:iframe 的源地址。

3. 打开 LaTeX 编辑器

调用 PoLatexMath.open() 方法打开 iframe,如果需要编辑器回显数据,该方法接收一个对象参数。

传入参数
参数名类型必填默认值说明
spanIdString否无公式锚点唯一标识,可用于后续公式操作定位。
contentString否无传入 LaTeX 公式内容
调用示例
JavaScript
// 打开一个空白编辑器
PoLatexMath.open();

// 在编辑器打开时显示传入的公式
PoLatexMath.open({
    spanId: 'latex-123',
    content: "$(1 + x)^n \\geq 1 + nx \\quad (x > -1, \\ n \\in \\mathbb{N}^+ ) $",
});
注意事项
  • spanId 需保证在页面中的唯一性,避免不同公式之间产生冲突。
  • content 中的 LaTeX 公式语法需符合 LaTeX 标准。
  • 调用此方法前,请确保 PoLatexMath SDK 已正确初始化。

4. LaTeX 编辑器返回数据

在公式编辑器中输入 LaTeX 公式后,点击插入按钮,PoLatexMath.init() 回调函数中会有返回数据。

返回参数
参数名类型说明是否可能为空
editorTypeString编辑器类型标识否
latexOutString输出 LaTeX 源码否
outMathMLString输出 MathML 结构化数据否
outSvgImageString输出可直接渲染的 SVG否
spanIdString公式所在容器的 DOM 元素 ID(根据调用时传入的 spanId 参数原样返回)是
返回示例
JSON
{
    "editorType":"latex",
    "latexOut": "$(1 + x)^n \\geq 1 + nx \\quad (x > -1, \\ n \\in \\mathbb{N}^+ )$",
    "outMathML": "<math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n  <mo class=\"classmath99-latex-svg-g math99-latex-(-1-2\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">(</mo>\n  <mn class=\"classmath99-latex-svg-g math99-latex-1-2-3\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\">1</mn>\n  <mo class=\"classmath99-latex-svg-g math99-latex-+-4-5\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n  <mi class=\"classmath99-latex-svg-g math99-latex-x-6-7\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n  <msup>\n    <mo class=\"classmath99-latex-svg-g math99-latex-)-7-8\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">)</mo>\n    <mi class=\"classmath99-latex-svg-g math99-latex-n-9-10\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n  </msup>\n  <mo class=\"classmath99-latex-svg-g math99-latex-geq-11-15\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">≥</mo>\n  <mn class=\"classmath99-latex-svg-g math99-latex-1-16-17\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\">1</mn>\n  <mo class=\"classmath99-latex-svg-g math99-latex-+-18-19\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n  <mi class=\"classmath99-latex-svg-g math99-latex-n-20-21\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n  <mi class=\"classmath99-latex-svg-g math99-latex-x-21-22\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n  <mstyle scriptlevel=\"0\">\n    <mspace width=\"1em\"/>\n  </mstyle>\n  <mo class=\"classmath99-latex-svg-g math99-latex-(-29-30\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">(</mo>\n  <mi class=\"classmath99-latex-svg-g math99-latex-x-30-31\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">x</mi>\n  <mo class=\"classmath99-latex-svg-g math99-latex-&gt;-32-33\" style=\"font-family: Aa楷宋, AaKaiSong;\">&gt;</mo>\n  <mo class=\"classmath99-latex-svg-g math99-latex--34-35\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">−</mo>\n  <mn class=\"classmath99-latex-svg-g math99-latex-1-35-36\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\">1</mn>\n  <mo class=\"classmath99-latex-svg-g math99-latex-,-36-37\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">,</mo>\n  <mtext class=\"classmath99-latex-svg-g math99-latex- -38-40\"> </mtext>\n  <mi class=\"classmath99-latex-svg-g math99-latex-n-40-41\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\">n</mi>\n  <mo class=\"classmath99-latex-svg-g math99-latex-in-42-45\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">∈</mo>\n  <msup>\n    <mrow data-mjx-texclass=\"ORD\">\n      <mi mathvariant=\"double-struck\" class=\"classmath99-latex-svg-g math99-latex-N-54-55\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: normal;\">N</mi>\n    </mrow>\n    <mo class=\"classmath99-latex-svg-g math99-latex-+-57-58\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">+</mo>\n  </msup>\n  <mo class=\"classmath99-latex-svg-g math99-latex-)-59-60\" stretchy=\"false\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\">)</mo>\n</math>",
    "outSvgImage": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30.415ex\" height=\"2.53ex\" role=\"img\" focusable=\"false\" viewBox=\"0 -893.3 13443.3 1118.3\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" aria-hidden=\"true\" style=\"vertical-align: -0.509ex;\"><defs><path id=\"MJX-13-TEX-N-A0\" d=\"\"></path><path id=\"MJX-13-TEX-D-2115\" d=\"M20 664Q20 666 31 683H142Q256 683 258 681Q259 680 279 653T342 572T422 468L582 259V425Q582 451 582 490T583 541Q583 611 573 628T522 648Q500 648 493 654Q484 665 493 679L500 683H691Q702 676 702 666Q702 657 698 652Q688 648 680 648Q633 648 627 612Q624 601 624 294V-8Q616 -20 607 -20Q601 -20 596 -15Q593 -13 371 270L156 548L153 319Q153 284 153 234T152 167Q152 103 156 78T172 44T213 34Q236 34 242 28Q253 17 242 3L236 -1H36Q24 6 24 16Q24 34 56 34Q58 35 69 36T86 40T100 50T109 72Q111 83 111 345V603L96 619Q72 643 44 648Q20 648 20 664ZM413 419L240 648H120L136 628Q137 626 361 341T587 54L589 68Q589 78 589 121V192L413 419Z\"></path></defs><g stroke=\"currentColor\" fill=\"currentColor\" stroke-width=\"0\" transform=\"scale(1,-1)\"><g data-mml-node=\"math\"><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-(-1-2\" transform=\"translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">(</text></g><g data-mml-node=\"mn\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-2-3\" transform=\"translate(294.9,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-+-4-5\" transform=\"translate(959.2,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-6-7\" transform=\"translate(1666.8,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"msup\" transform=\"translate(2090.6,0)\"><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-)-7-8\" transform=\"translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">)</text></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" transform=\"translate(327.9,363) scale(0.707)\" class=\"classmath99-latex-svg-g math99-latex-n-9-10\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-geq-11-15\" transform=\"translate(3058.9,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">≥</text></g><g data-mml-node=\"mn\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-16-17\" transform=\"translate(3822.1,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-+-18-19\" transform=\"translate(4486.3,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-n-20-21\" transform=\"translate(5194,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-21-22\" transform=\"translate(5636,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"mstyle\" transform=\"translate(6059.8,0)\"><g data-mml-node=\"mspace\"></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-(-29-30\" transform=\"translate(7059.8,0) translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">(</text></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-x-30-31\" transform=\"translate(7354.7,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">x</text></g><g data-mml-node=\"mo\" style=\"font-family: Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-&gt;-32-33\" transform=\"translate(8056.3,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">&gt;</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex--34-35\" transform=\"translate(8806.1,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">−</text></g><g data-mml-node=\"mn\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-1-35-36\" transform=\"translate(9291.6,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">1</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-,-36-37\" transform=\"translate(9733.6,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">,</text></g><g data-mml-node=\"mtext\" class=\"classmath99-latex-svg-g math99-latex- -38-40\" transform=\"translate(10121.7,0)\"><use data-c=\"A0\" xlink:href=\"#MJX-13-TEX-N-A0\"></use></g><g data-mml-node=\"mi\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: italic;\" class=\"classmath99-latex-svg-g math99-latex-n-40-41\" transform=\"translate(10371.7,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">n</text></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-in-42-45\" transform=\"translate(11091.4,0)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">∈</text></g><g data-mml-node=\"msup\" transform=\"translate(12000.1,0)\"><g data-mml-node=\"TeXAtom\" data-mjx-texclass=\"ORD\"><g data-mml-node=\"mi\" class=\"classmath99-latex-svg-g math99-latex-N-54-55\" style=\"font-family: &quot;Times New Roman&quot;, Aa楷宋, AaKaiSong; font-style: normal;\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1) translate(150,0)\" font-size=\"884px\">N</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" transform=\"translate(755,363) scale(0.707)\" class=\"classmath99-latex-svg-g math99-latex-+-57-58\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">+</text></g></g><g data-mml-node=\"mo\" style=\"font-family: Symbol, Aa楷宋, AaKaiSong;\" class=\"classmath99-latex-svg-g math99-latex-)-59-60\" transform=\"translate(13148.3,0) translate(0 -25)\"><text data-variant=\"-explicitFont\" transform=\"scale(1,-1)\" font-size=\"884px\">)</text></g></g></g></svg>",
    "spanId": ""
}

后端接入

面向外部合作方的开放接口,业务数据统一采用 AES 加密后传输,具体见文末「(附)AES 加密算法」。

LaTeX 转 SVG / MathML

简要描述
为外部合作方提供 LaTeX 转 svg/mathml的能力
请求 URL
https://latex.processon.com/api/out/channel/sts/export/latex/to/svg
请求方式
POST

请求头

属性名必选类型描述
partnerInfo是String合作方ID
appid是String应用ID
X-Referer是String调用方的公司域名
Content-Type是Stringapplication/json

参数分为两部分

1、请求 body 体中参数
参数必选类型说明
info是stringAES 加密后的数据
time是long时间戳,精确到毫秒
注:这里的 time 值与 info 中加密的 time 值是同一个的
env是string环境
注:PRD(生产环境)

info 加密前是一个 json 对象,对象中的 key 如下:

参数必选类型说明
inType是String输入类型【latex】
content是String 数组输入的内容(源码内容)
outType是String 数组输出类型【std:标准,mathml:MathML;】
注:标准即输出 SVG 格式
time是long时间戳,精确到毫秒
mode否String学科模式,physics-mode:物理、chemistry-mode:化学、math-mode:数学
fontSize否String设置字体大小,eg: 50pt 或者 50px

body 体请求示例

加密前的数据,没有顺序限制:

JSON
{"time":1749122516172,"inType":"latex","outType":["draw","mathml"],"content":["实际价格 = 原价 \\times (134343 - 折扣率)","x = \\frac{-b \\pm \\sqrt{D}}{2a}"],"mode":"ph"}

加密后的数据:

Plain Text
fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jMyWBKt+oXzJiaM1xMZ+4uLA7QZi/iGQu+h0w=
Plain Text
{
    "time": "1749122516172",
    "env": "DEV",
    "info": "fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jMyWBKt+oXzJiaM1xMZ+4uLA7QZi/iGQu+h0w="
}

返回参数

参数名必选类型说明
code是string响应码
msg是string响应码的描述信息
data否string | object具体业务具体规划

返回示例

JSON
{
  "code": "200",
  "msg": "调用成功",
  "data": {
    "mathml": {
      "code": "200",
      "msg": "调用成功",
      "data": [
        "<math ...", "<math ...",...
      ]
    },
    "draw": {
      "code": "200",
      "msg": "调用成功",
      "data": [
        "<svg ...","<svg ...",....
      ]
    }
  }
}

或者

{
  "code": "200",
  "msg": "调用成功",
  "data": {
    "mathml": {
      "code": "61689",
      "msg": "未购买此服务",
      "data": "0x1748511300732"
    },
    "draw": {
      "code": "200",
      "msg": "调用成功",
      "data": [
        "<svg ...","<svg ...",....
      ]
    }
  }
}

备注

  1. 外层响应码
    • code = 200:请求成功,需根据实际返回的数据类型进一步解析 data。
    • code ≠ 200:请求失败,请查看 msg 获取错误描述;data 为内部错误码(形如 0x1747028551459),仅用于写入日志、供开发人员定位问题,无需向用户展示。
  2. 内层业务响应码:当外层 code = 200 时,data 中每个业务字段(如 mathml、draw)的结构均为 code、msg、data 三个子属性。
    • code = 200:子属性 data 即为该业务返回的业务数据(数组形式)。
    • code ≠ 200:该业务调用出错,请查看 msg 获取错误描述。

附加信息

信息加密算法 请参考 《(附)AES 加密算法》。

OCR 识别

简要描述
为外部合作方提供 OCR 识别
请求 URL
https://latex.processon.com/api/out/channel/sts/ocr/Recognition
请求方式
POST

请求头

属性名必选类型描述
partnerInfo是String合作方ID
appid是String应用ID
X-Referer是String调用方的公司域名
Content-Type是Stringapplication/json

参数分为两部分

1、请求 body 体中参数
参数必选类型说明
info是stringAES 加密后的数据
time是long时间戳,精确到毫秒
注:这里的 time 值与 info 中加密的 time 值是同一个的
env是string环境
注:DEV(测试环境)/ PRD(生产环境)

info 加密前是一个 json 对象,对象中的 key 如下:

参数必选类型说明
picType是String图片类型【common:一般图片识别;printed:印刷体图片识别;handwritten:手写体图片识别】
注:不同的图片类型,识别速度、访问限频不同。
content是byte[]图片原始数据,不需要做任何处理,最大不能超过 2MB。java 获取图片内容的示例:
byte[] bytes = java.nio.file.Files.readAllBytes(java.nio.file.Paths.get("/latex/xxx.png"));
time是long时间戳,精确到毫秒

body 体请求示例

加密前的数据,没有顺序限制:

JSON
{"picType":"handwritten","time":1751181115761,"content":xxx}

加密后的数据:

Plain Text
fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3xGwDCOCbSdVpyiMy59OD/6f7ULI0VhezpL2LXHLfSAk0QSKEhLz3Ow0+g4r5jM
Plain Text
{
    "time": "1749122516172",
    "env": "DEV",
    "info": "fT4JVBjD3jvnHYQY9ns3b7W92zPyciiSpX9rvTqGfih5xAlmrkllql56R/GaZoLmahA4ddEElWo6vniz5n1VwxyZeSLDLS6Uw/aPmh0itLOFM73HDGrfH4OoHaPeAGKuPpugC8H6J3"
}

返回参数

参数名必选类型说明
code是string响应码
msg是string响应码的描述信息
data否string | object具体业务具体规划

返回示例

JSON
{
    "code": "200",
    "msg": "调用成功",
    "data": {
        "latex": "一、填空题(每小题3分,共10小题)\n(1)求极限 $\\lim _{x \\rightarrow 0} \\frac{\\ln \\cos x}{x^{2}}$\n(2)求曲线 $y-x+e^{y}=0$ 在点 $x=1$ 处的切线方程\n(3)计算不定积分 $\\int \\frac{\\ln \\ln x}{x} d x$\n(4)求曲线 $y=\\frac{1+x}{1-e^{-x}}$ 的渐近线个数\n(5)求 $f(x)=\\left|x e^{-x}\\right|$ 的导数\n(6)已知 $f(x)$ 可导,$y=f\\left(e^{x^{2}}\\right)$ ,求 $d y$"
    }
}

备注

常见错误码
码值描述
401参数错误(字段值不正确、传入数据过大等)
402一般是由于合作方ID(appid)错误导致
407加密信息解密时出现错误
409处理业务时出现异常
412接口访问频繁
500处理业务时,出现错误
509当前有业务处理中,请稍后再试
511当天 ocr 使用次数已达上限
5001业务处理失败
  • code 非 200 时,查看 msg 描述信息,【data 中的数据打到日志中,供开发人员分析问题,不需要给用户展示,一般是类似这样的错误码(eg:0x1747028551459)】
  • code 是 200 的时候 data 中的数据就是返回的业务类型数据,具体数据结构参考上方的返回示例

样例数据

样例图片
OCR 识别样例图片:手写数学试卷 点击图片可放大
响应数据
{
    "code": "200",
    "msg": "调用成功",
    "data": {
        "latex": "一、填空题(每小题3分,共10小题)\n(1)求极限 $\\lim _{x \\rightarrow 0} \\frac{\\ln \\cos x}{x^{2}}$\n(2)求曲线 $y-x+e^{y}=0$ 在点 $x=1$ 处的切线方程\n(3)计算不定积分 $\\int \\frac{\\ln \\ln x}{x} d x$\n(4)求曲线 $y=\\frac{1+x}{1-e^{-x}}$ 的渐近线个数\n(5)求 $f(x)=\\left|x e^{-x}\\right|$ 的导数\n(6)已知 $f(x)$ 可导,$y=f\\left(e^{x^{2}}\\right)$ ,求 $d y$"
    }
}

附加信息

信息加密算法 请参考 《(附)AES 加密算法》。

(附)AES 加密算法

信息加密算法描述

Plain Text
加密算法:AES/CBC/PKCS5Padding  注:AES-128位
测试环境--秘钥值:xxxx    注:这是base64 encode之后的数据,使用时需要进行decode
测试环境--向量值:yyyy    注:这是base64 encode之后的数据,使用时需要进行decode

相关 java 加密代码(参考使用)

Java
public class AESUtils {
    /**
     * 算法的名称
     */
    private static final String AES = "AES";

 
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";

    /**
     * 编码 UTF-8
     */
    private static final String UTF_8 = "UTF-8";


    /**
     * 加密
     * @param needEncryptByte 待加密内容
     * @param key            加密key
     * @param iv             向量
     * @return
     * @throws Exception
     */
    public static byte[] encrypt(byte[] needEncryptByte, byte[] key, byte[] iv) throws Exception {
        //设置秘钥
        SecretKeySpec keySpec = new SecretKeySpec(key, AES);
        //设置向量
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        Cipher cipher = Cipher.getInstance(ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

        return cipher.doFinal(needEncryptByte);
    }
}