通过 REST API 导出 ODT

Available in Start planBetav2.12.0

ODT 导出 API 将 Tiptap JSON 文档转换为 OpenDocument Text(.odt)文件,与 LibreOffice 和 OpenOffice 兼容。

查看 Postman 集合

您也可以通过我们的 Postman 集合 来体验文档转换 API。

导出 ODT

POST /v2/convert/export/odt

/v2/convert/export/odt 端点将 Tiptap JSON 文档转换为 ODT 格式。发送带有文档 JSON 正文的 POST 请求,即可接收可下载的 ODT 文件。

示例 (cURL)

curl --output document.odt -X POST "https://api.tiptap.dev/v2/convert/export/odt" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Hello World\"}]}]}"
    }'

需要订阅

使用此端点需要有效的 Tiptap 订阅。详情请查看我们的价格页面

必填请求头

名称描述
Authorization用于认证请求的 JWT 令牌。例如:Bearer your-jwt-token
X-App-Id来自 Convert 设置页面的 Convert App-ID:https://cloud.tiptap.dev/v2/cloud/convert
Content-Type必须为 application/json

请求体参数

名称类型描述默认值
docString以字符串形式表示的 Tiptap JSON 文档N/A
exportTypestring预期的导出类型blob
styleOverridesObject样式覆盖{}
pageSizeObject页面尺寸配置undefined
pageMarginsObject页面边距配置undefined
headersObject页眉配置undefined
footersObject页脚配置undefined
tableOverridesObject传递给 DOCX 步骤的表格级渲染覆盖undefined
paragraphOverridesObject传递给 DOCX 步骤的段落级渲染覆盖undefined
textRunOverridesObject传递给 DOCX 步骤的文本运行渲染覆盖undefined
tableCellOverridesObject传递给 DOCX 步骤的表格单元格渲染覆盖undefined
imageOverridesObject传递给 DOCX 步骤的图片渲染覆盖undefined

页面尺寸配置

pageSize 对象允许自定义导出 ODT 文档的页面尺寸:

属性类型描述默认值
widthstring页面宽度。必须是紧跟有效单位(cm,in,pt,pc,mm,px)的正数。"21.0cm"
heightstring页面高度。必须是紧跟有效单位(cm,in,pt,pc,mm,px)的正数。"29.7cm"

页面边距配置

pageMargins 对象允许自定义导出 ODT 文档的页面边距:

属性类型描述默认值
topstring页面顶部边距。可以为负。必须是数字,紧跟有效单位(cm,in,pt,pc,mm,px)。"1.0cm"
bottomstring页面底部边距。可以为负。必须是数字,紧跟有效单位(cm,in,pt,pc,mm,px)。"1.0cm"
leftstring页面左侧边距。必须是紧跟有效单位(cm,in,pt,pc,mm,px)的正数。"1.0cm"
rightstring页面右侧边距。必须是紧跟有效单位(cm,in,pt,pc,mm,px)的正数。"1.0cm"

页眉配置

headers 对象允许自定义导出 ODT 文档的页眉:

属性类型描述
evenAndOddHeadersboolean是否为奇数页和偶数页使用不同的页眉
differentFirstPageboolean是否为首页使用不同的页眉。设置为 true 时,第一页使用 first 的值,替代默认的 default 页眉。
defaultstring每页的标准默认页眉,或开启 evenAndOddHeaders 时的奇数页页眉。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。
firststring首页的页眉,仅在 differentFirstPagetrue 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。
evenstring偶数页页眉,仅当启用 evenAndOddHeaders 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。

纯文本 VS Tiptap JSONContent

每个页眉值可以是纯文本字符串(生成简单无样式页眉)或字符串化的 Tiptap JSONContent 对象(支持加粗、斜体、链接等丰富格式)。传递 JSONContent 时,发送请求体前请用 JSON.stringify() 对象进行字符串化。

页脚配置

footers 对象允许自定义导出 ODT 文档的页脚:

属性类型描述
evenAndOddFootersboolean是否为奇数页和偶数页使用不同的页脚
differentFirstPageboolean是否为首页使用不同的页脚。设置为 true 时,第一页使用 first 的值,替代默认的 default 页脚。
defaultstring每页的标准默认页脚,或开启 evenAndOddFooters 时的奇数页页脚。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。
firststring首页的页脚,仅在 differentFirstPagetrue 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。
evenstring偶数页页脚,仅当启用 evenAndOddFooters 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。

纯文本 VS Tiptap JSONContent

每个页脚值可以是纯文本字符串(生成简单无样式页脚)或字符串化的 Tiptap JSONContent 对象(支持加粗、斜体、链接等丰富格式)。传递 JSONContent 时,发送请求体前请用 JSON.stringify() 对象进行字符串化。

元素覆盖

ODT 生成会经过 DOCX 流水线,因此在发送 Tiptap JSON 时,/export/docx 接受的相同五种元素覆盖也同样适用于这里。通过 docxFile 上传预构建的 DOCX 时,它们不会生效

五种元素覆盖对象可让你调整各个 DOCX 元素 (表格、段落、文本运行、表格单元格、图片)的渲染方式。每个 覆盖项都会作为基础默认值传递给底层的 DOCX 转换库;来自文档的按节点值在计算后仍然优先。

不进行深度合并

覆盖项中的嵌套对象(例如 bordersmarginstransformation)会被完全替换,而不是进行深度合并。自定义边框某一侧时,请提供你需要的每一侧,以免未定义值漏入。

tableOverrides

应用于每个表格的默认值。最有用的属性:

PropertyTypeDescription
bordersObject各边定义:topbottomleftrightinsideHorizontalinsideVertical。每项都接受 { style, size, color }
marginsObject默认单元格边距 { top, bottom, left, right }(以二十分之一磅为单位)。
widthObject表格宽度 { size, type },其中 type"pct""dxa""auto"
layoutstring"fixed""autofit"
alignmentstring"left" | "center" | "right" | "start" | "end"
cantSplitboolean防止表格跨页拆分。
visuallyRightToLeftboolean使表格从右到左渲染。

paragraphOverrides

应用于每个段落的默认值。最有用的属性:

PropertyTypeDescription
spacingObject{ before, after, line, lineRule },单位为二十分之一磅。line 会被计算出的行高覆盖。
alignmentstring"left" | "center" | "right" | "justified" | "start" | "end"
indentObject{ left, right, firstLine, hanging, start, end },单位为二十分之一磅。
keepNextboolean将此段落与下一段保持在一起。
keepLinesboolean保持段落中的所有行在一起。
pageBreakBeforeboolean在段落前插入分页符。
bidirectionalboolean将段落从右到左渲染。
stylestring指向 styleOverrides 中定义的段落样式 id 的引用。

textRunOverrides

应用于每个文本运行的默认值。按标记格式设置(粗体、斜体、颜色 ……)仍会覆盖这些值。最有用的属性:

PropertyTypeDescription
fontstring字体族名称。
sizenumber字体大小,单位为半磅(24 = 12pt)。
boldboolean默认以粗体渲染。
italicsboolean默认以斜体渲染。
underlineObject{ type, color } — 例如 { type: "single", color: "auto" }
strikeboolean删除线。
colorstring不含前导 # 的十六进制颜色("FF0000")。
highlightstring预定义的高亮颜色名称("yellow""green"、……)。
superScriptboolean以上标形式渲染。
subScriptboolean以下标形式渲染。

tableCellOverrides

应用于每个表格单元格的默认值。最有用的属性:

PropertyTypeDescription
shadingObject{ fill, type, color } — 例如 { fill: "F0F0F0", type: "clear" }
verticalAlignstring"top" | "center" | "bottom"
bordersObject各边单元格边框定义,形状与 tableOverrides.borders 相同。
marginsObject单元格内边距 { top, bottom, left, right },单位为二十分之一磅。
widthObject单元格宽度 { size, type }

imageOverrides

应用于每张图片的默认值。根据文档计算出的图片尺寸 (固有大小或用户调整后的值)在存在时仍然优先。最有用的 属性:

PropertyTypeDescription
transformationObject{ width, height, rotation?, flip? } — 以 96 dpi 计算的像素。
altTextObject{ title, description, name }
floatingObject浮动定位选项(锚点、对齐、偏移、环绕)。

组合多个元素覆盖的示例 cURL

curl --output document.odt -X POST "https://api.tiptap.dev/v2/convert/export/odt" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"ODT with element-level overrides\"}]}]}",
      "paragraphOverrides": {
        "spacing": { "before": 200, "after": 200 }
      },
      "textRunOverrides": {
        "font": "Arial",
        "size": 24
      }
    }'

带自定义页面布局的示例

curl --output document.odt -X POST "https://api.tiptap.dev/v2/convert/export/odt" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -H "X-App-Id: YOUR_APP_ID" \
    -H "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Hello World\"}]}]}",
      "pageSize": {
        "width": "210mm",
        "height": "297mm"
      },
      "pageMargins": {
        "top": "20mm",
        "bottom": "20mm",
        "left": "15mm",
        "right": "15mm"
      }
    }'

响应

成功时,API 返回 ODT 文件作为二进制下载:

  • 状态200 OK
  • Content-Typeapplication/vnd.oasis.opendocument.text
  • Content-Dispositionattachment; filename=export-{timestamp}.odt

错误响应

状态码代码描述
400NO_DOCUMENT_PROVIDED请求体中未提供文档
422FAILED_TO_PARSE_DOCX_FILE解析 JSON 输入失败
422FAILED_TO_EXPORT_ODT_FILE导出中间格式失败
422FAILED_TO_CONVERT_DOCX_TO_ODT转换为 ODT 失败