通过 REST API 导出 ODT

Available in Start planBetav2.39.1

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

查看 Postman 集合

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

选择您的区域

默认端点 api.tiptap.dev 位于欧盟区域。转换服务也在美国区域提供,端点为 api-us.tiptap.dev。编辑器扩展通过 region 选项('eu' 或 'us')选择区域。 REST 调用则直接使用对应的主机。

导出 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 "Content-Type: application/json" \
    -d '{
      "doc": "{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\",\"content\":[{\"type\":\"text\",\"text\":\"Hello World\"}]}]}"
    }'

需要订阅

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

必填请求头

名称描述
Authorization用于验证请求的 JWT 令牌。示例:Bearer your-jwt-token
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
headerFooterOverridesObject针对页眉/页脚内容的按字段覆盖,作用域限定于页眉/页脚内容(与元素覆盖相同的五个键)。参见 元素覆盖。undefined
placeholdersObject | false用于页眉/页脚中页码标记的重命名映射({ page?, total? }),与 Pages.configure({ placeholders }) 匹配。传入 false 可禁用替换。参见 自定义标记名称。undefined
customNodeDslObject用于将自定义 Tiptap 节点渲染到导出文件中的 自定义节点 DSL 规则。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首页的页眉,仅在 differentFirstPage 为 true 时生效。支持纯文本字符串或字符串化的 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首页的页脚,仅在 differentFirstPage 为 true 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。
evenstring偶数页页脚,仅当启用 evenAndOddFooters 时生效。支持纯文本字符串或字符串化的 Tiptap JSONContent,支持丰富格式化。

纯文本 VS Tiptap JSONContent

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

元素覆盖

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

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

不进行深度合并

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

tableOverrides

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

PropertyTypeDescription
bordersObject各边定义:top、bottom、left、right、insideHorizontal、insideVertical。每项都接受 { 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浮动定位选项(锚点、对齐、偏移、环绕)。

headerFooterOverrides

将同样的五种元素覆盖项仅作用于页眉/页脚内容。你省略的每个 字段都会回退到与正文同名的覆盖项。此功能 仅在页眉或页脚槽位作为 Tiptap JSON 传入时生效(对象 或字符串化的 JSONContent);纯文本槽位不受影响。一个常见的 用例是正文中带边框的表格,而页眉中使用无边框表格。

PropertyTypeDescription
tableOverridesObject与顶层覆盖项形状相同,应用于页眉/页脚中。
paragraphOverridesObject与顶层覆盖项形状相同,应用于页眉/页脚中。
textRunOverridesObject与顶层覆盖项形状相同,应用于页眉/页脚中。
tableCellOverridesObject与顶层覆盖项形状相同,应用于页眉/页脚中。
imageOverridesObject与顶层覆盖项形状相同,应用于页眉/页脚中。

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

curl --output document.odt -X POST "https://api.tiptap.dev/v2/convert/export/odt" \
    -H "Authorization: Bearer YOUR_TOKEN" \
    -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 "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-Type:application/vnd.oasis.opendocument.text
  • Content-Disposition:attachment; 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 失败