96DOC / DEVELOPER DOCUMENTATION

从文件地址,到阅读体验。

选择直接创建链接,或由业务后端创建预览任务。
所有生成的 /view 链接都进入独立阅读页,适合新窗口分享和 iframe 嵌入。

在线 API 调试

查看接口参数、响应与在线测试,先从创建预览开始。

打开在线 API 调试 ↗ 调试集成 · 在线体验 ↗

01 / 快速接入

体验页直接显示预览设置,选择后点击“开始预览”应用。“生成代码”支持 JavaScript、PHP、Java、Go、Python、Ruby、C、C++、C#,按当前地址和选项生成;底部“重新体验”或阅读区“换个文件”可重新体验。无水印时不校验隐藏水印字段。

公开文件可直接用 URL 参数打开。ALLOWED_HOSTS 默认留空;如需限制文件域名,可配置白名单,并对原始地址编码一次。替换示例中的域名为你的服务地址。

JavaScript
const fileURL = 'http://www.96doc.com/demo/sample-v2.docx';
const previewURL = 'http://www.96doc.com/view?src=' + encodeURIComponent(fileURL);
window.open(previewURL, '_blank', 'noopener');
// iframe:document.querySelector('iframe').src = previewURL;

私有 OSS 使用有效 GET 签名 URL。src 链接包含原始签名地址,按业务权限分发;HTTPS 业务页面使用 HTTPS 预览域名。

02 / JavaScript接入

封装文件位于项目 web/sdk/doc96.js,当前可从 SDK 文件地址 获取。业务页面只需引入它并调用。简单链接无需请求接口;水印、访问限制和预览模式通过 API 保存。跨域页面或配置了 KEY 时,请通过业务后端创建链接。

引入封装脚本
<script src="http://www.96doc.com/sdk/doc96.js"></script>
<iframe id="document-reader" title="文件预览" style="width:100%;height:85vh;border:0"></iframe>
<script>
const client = new Doc96Client({ baseURL: 'http://www.96doc.com' });
// 同源调用;跨域或 KEY 场景由业务后端返回链接。
client.view('http://www.96doc.com/demo/sample-v2.docx', {
  options: { displayMode: 'precise', allowDownload: true,
    stampMode: 'text', stampText: '96doc.com' }
}, document.getElementById('document-reader'));
</script>

普通链接:client.createPreviewURL(fileURL)。创建任务并取得两个入口:await client.createJob(fileURL, settings);结果包含 previewURL 与 htmlURL。KEY 不应写入公开网页。

03 / 多语言后端介入

业务后端校验当前用户的文件权限,再调用 POST /api/preview,返回预览入口给前端。响应为 HTTP 202;任务可能仍在转换,直接打开阅读链接即可看到进度。KEY 放在业务后端的配置中。

切换语言,直接复制调用示例
后端创建预览
正在加载调用示例…

可在 在线体验 中填写真实选项,点击“生成代码”,得到对应语言的完整请求。Python 只是可选的业务接入示例,不是服务器的转换依赖。

04 / HTTP API

常规接入只需调用 POST /api/preview,拿到 previewURL 后交给浏览器打开。其余读取接口主要供内置阅读器使用;如果你要自己制作阅读器,可以按下面的步骤调用。

  1. 创建预览,返回任务 id 和 previewURL,HTTP 202 表示已接受请求,不表示转换已完成。
  2. 每隔约 1 秒查询 /api/jobs/{id};ready 才可读取内容,failed 时查看 error。直接打开 previewURL 时,内置阅读器会自动处理等待。
  3. 显示文档用 /file;制作工作表视图用 /workbook;提供原文件下载用 /download。这些接口返回数据或文件,不返回预览网页链接。
接口接口名称方法用途与返回内容
/api/preview生成预览链接POST创建或复用预览任务,返回 id、status、previewURL 和 htmlURL。
/api/cache清除缓存/查询有效期POST缓存管理:action=clear 清除同一原地址的转换缓存;action=status 查询缓存及指定分享链接的有效期。请求与响应见下方。
/api/upload上传文件POST上传本地文件,multipart 字段为 file;返回 201、url、name、size、expiresAt。再将返回的 url 传给 /api/preview,上传源文件默认保留 24 小时。
/api/jobs/{id}查询任务状态GET查询指定任务的处理进度及结果。返回 status、kind、error、pdfAvailable、pageImages、expiresAt(转换缓存期限)、linkExpiresAt(分享期限)。
/api/jobs/{id}/file读取预览内容GET / HEAD获取处理好的预览内容:Office/PDF/OFD 等返回 PDF,图片和音视频返回文件流,TXT/MD 返回 UTF-8 文本,ZIP/邮件/XDOC 返回结构化 JSON。HEAD 只读取响应头;不是生成链接接口。
/api/jobs/{id}/workbook读取工作簿GET / HEAD获取 Excel/CSV 的工作簿 JSON(sheets、rows、cells),用于工作表切换和表格展示。仅适用于 sheet 类型;设置 maxPages 后禁止读取完整工作簿。
/api/jobs/{id}/download下载原文件GET / HEAD下载未经转换的原始文件,例如 DOCX,返回 attachment 文件流;allowDownload=false 或设置页数限制时返回 403。
/api/jobs/{id}/members/{index}预览 ZIP 成员POST创建 ZIP 内某个文件的预览。index 为 /file 返回 entries 数组中的下标,从 0 开始;返回子任务和 previewURL,继承父链接的权限。
/api/health查询服务状态GET检查服务和转换器:status、libreoffice、cacheEnabled、cacheTTLHours、maxFileMB、authRequired。用于运行监测;不是文件预览接口。无需密钥的存活检查地址为 /health。

状态顺序:queued → downloading → parsing / converting → ready,失败为 failed。常见错误为 400 参数无效、401 密钥错误、403 权限拒绝、404 任务或资源不存在/已失效、409 仍在处理、429 请求过多、503 队列或缓存空间已满。错误 JSON 为 {"error":"错误说明"}。

配置 KEY 为空时无需接口密钥;非空时推荐使用请求头 X-Preview-Key: 你的密钥,或 Authorization: Bearer 你的密钥。预览与缓存 JSON 也接受 key 字段。密码/一次性链接通过 POST /api/links/{access}/unlock 验证并保存 Cookie,会话校验不因携带 API 密钥而跳过。

05 / 预览参数

本节说明 POST /api/preview 的 JSON 请求体,Content-Type 为 application/json,用于生成预览链接。url 必填;filename、mtime、referer、pdf、key 和 options 都是顶层字段。阅读设置放在 options 内,水印样式放在 options.stampStyle 内。

完整请求示例

下面包含所有支持的请求字段。Apifox/Postman 的 {{sampleBase}} 可设置为 http://www.96doc.com/demo;直接调用时将 url 换成实际原文件地址。未设置服务 KEY 时 key 可省略;不显示水印时可省略 stampText、stampImage 和 stampStyle。

POST /api/preview · application/json
{
  "url": "{{sampleBase}}/sample-v2.docx",
  "options": {
    "displayMode": "precise",
    "allowPrint": true,
    "allowCopy": true,
    "allowDownload": true,
    "showToolbar": true,
    "showThumbnails": true,
    "showSearch": true,
    "showPaging": true,
    "showZoom": true,
    "showPresentation": true,
    "showPrint": true,
    "showDownload": true,
    "showFullscreen": true,
    "downloadPlacement": "toolbar",
    "oneVisit": false,
    "heading": "",
    "validMinutes": 0,
    "maxPages": 0,
    "fontSize": 14,
    "ipAllow": "",
    "openCode": "",
    "stampMode": "none",
    "stampText": "",
    "stampImage": "",
    "stampStyle": {
      "fontSize": 24,
      "angle": -24,
      "opacity": 0.5,
      "color": "#aaaaaa",
      "tile": true,
      "gap": 240
    }
  },
  "filename": "sample-v2.docx",
  "mtime": "",
  "referer": "",
  "pdf": false,
  "key": ""
}

顶层参数

字段类型必填 / 默认值说明
urlstring必填要预览的原始文件 HTTP/HTTPS 地址,包括完整签名查询参数;也可使用 /api/upload 返回的 url。JSON 中直接传原地址,不要再 encodeURIComponent;不是 /view 或生成后的 HTML 链接。
optionsobject可选 / 默认预览选项阅读模式、工具栏、水印和访问规则对象。下表中的 options.xxx 都放在这个对象内,不与 url 同级。未传的选项使用默认值。
filenamestring可选 / 空源地址没有文件后缀或无法识别类型时,填写带正确扩展名的文件名,例如 sample-v2.docx。留空时从源地址推导文件名。
mtimestring ≤256字节可选 / 空文件修改标记,可以是秒级时间戳字符串(如 "1633093801")或日期字符串。原 URL 不变但内容更新时同步更新此值;值变化会重新下载和转换,值不变复用缓存。
refererstring ≤2048字节可选 / 空下载源文件时发送的 Referer 请求头,用于源站防盗链。填写源站允许的 HTTP/HTTPS 页面地址;源地址白名单、重定向及内网访问校验仍生效。
pdfboolean可选 / false控制表格是否转换为 PDF,不是生成链接的开关,也不表示关闭所有 PDF 转换。Word/PPT/PDF 仍按分页文档读取;表格在精准模式或限制页数时也可能需要转换 PDF。
keystring可选 / 空服务配置 KEY 非空时需提供接口密钥;推荐使用请求头 X-Preview-Key,也支持 Authorization: Bearer。JSON key 为兼容入口,不要把密钥放到公开网页。

options:预览选项

以下字段均为可选,必须嵌套在 options 对象中。例如 options.displayMode 在 JSON 中写成 "options": {"displayMode": "precise"},不要把带点的字段名直接写进 JSON。

字段类型 / 默认说明
options.displayModestring / precise:image 或 precise分页文档图片模式 / PDF 精准模式;两种均上下滚动;图片模式更快,精准模式可选文字
options.allowPrintboolean / true关闭时隐藏 PDF/打印入口并禁用本页打印样式;不是 DRM
options.allowCopyboolean / true精准模式下控制文字选择与复制;图片模式没有文字复制,体验页隐藏此选项;不是 DRM
options.allowDownloadboolean / true关闭时服务器拒绝原文件下载接口
options.showToolbarboolean / true是否显示整组工具栏;floating 下载可独立显示
options.showThumbnailsboolean / true显示缩略图按钮
options.showSearchboolean / true显示查找按钮
options.showPagingboolean / true显示上一页、下一页和页码
options.showZoomboolean / true显示放大、缩小与缩放选择框
options.showPresentationboolean / true显示演示模式;电脑滚轮上下翻页,手机左右滑动翻页
options.showPrintboolean / true显示打印按钮;手机始终隐藏。体验页此选项也同步设置 allowPrint
options.showDownloadboolean / true显示原文件下载按钮;同时需要 allowDownload=true 且没有页数限制。体验页此选项也同步设置 allowDownload
options.showFullscreenboolean / true显示全屏按钮;手机始终隐藏
options.downloadPlacementstring / toolbar:toolbar 或 floating原文件下载放工具栏或右下角悬浮图标;showDownload 控制显示,allowDownload 控制服务器下载权限
options.oneVisitboolean / false首次成功打开 HTML 后消耗,同一浏览器再次打开或刷新也拒绝;生成链接、HEAD、资源请求不消耗;未设密码直接打开
options.headingstring ≤512字节 / 空浏览器页签标题、体验页标题;独立阅读页不展示文件名栏
options.validMinutesinteger 0–43200 / 0分享规则从创建时起计时;0 不限分享有效期,与默认七天转换缓存独立
options.maxPagesinteger 0–500 / 0只开放前 N 页;适用于 Office/PDF/OFD/TIFF/DICOM 等分页文件;两种模式均可限制,精准模式仅返回开放页 PDF,禁用整文件和完整工作簿下载
options.fontSizeinteger 6–58 / 14文本、表格字号;水印字号另设;PDF 页图的原字体不改变
options.ipAllowstring ≤1000字节 / 空IP 或 CIDR,逗号分隔;只有本机 Nginx 转发的 X-Real-IP 被信任
options.openCodestring <=128字节 / 空访问密码,经加盐 PBKDF2 保存;不放进链接、HTML 或任务 JSON
options.stampModestring / none:none、text、image、customnone 不显示水印;text 文字水印;image 图片水印(需 stampImage);custom 自定义文字/图片和样式。水印叠加在阅读页,不改写文件。
options.stampTextstring <=1000字节 / 空水印文字,支持换行
options.stampImagestring / 空已允许的 OSS 图片 URL,或 data:image/...;base64,...;PNG/JPG/GIF,最大 1MB/400万像素
options.stampStyleobject / 见下文水印样式对象,嵌套在 options 内;字段详见下表。省略整个对象使用默认样式;传入时建议完整填写六个字段。

options.stampStyle:水印样式

stampStyle 是 options 内的对象;示例已列出全部六个字段。省略整个对象时使用下面的默认样式;自定义时建议完整传入六个字段,避免未填写的值导致样式校验失败。

字段类型 / 默认值取值范围说明
options.stampStyle.fontSizeinteger / 246–96水印字号,单位 px;独立于 options.fontSize 的正文/表格字号。
options.stampStyle.angleinteger / -24-90–90水印旋转角度,单位度;0 表示不旋转。
options.stampStyle.opacitynumber / 0.50.05–1水印透明度;数值越小越透明。
options.stampStyle.colorstring / #aaaaaa#RRGGBB文字水印颜色,使用六位十六进制颜色值。
options.stampStyle.tileboolean / truetrue 或 falsetrue 平铺重复水印;false 显示单个水印。
options.stampStyle.gapinteger / 24080–800平铺水印间距,单位 px。

链接与缓存

创建接口同时返回 previewURL 原文件分享入口和 htmlURL 签名 HTML 阅读页入口。htmlURL 在生成中可打开加载页;仅在开启 CACHE_ENABLED 时返回,使用缓存截止时间,分享规则独立校验。一次性链接建议打开 htmlURL。

有效缓存与规则存续期间,相同入参会复用相同 previewURL 和 htmlURL,不延长有效期、不重置一次性访问。清除缓存或缓存到期后,重新转换的 HTML 地址会变化。

GET /view 属于链接入口,原文件地址使用查询参数 src;POST /api/preview 使用 JSON 顶层 url,两者不要混用。GET 查询参数编码一次,POST JSON 传原字符串。带 access 的分享链接也可以更新 mtime 或 referer,权限仍保持原分享规则;未传 referer 时使用保存在分享规则中的值。已生成的 /preview/.../index.html 是固定快照,编辑在线源文件后应打开更新 mtime 的 /view 入口或重新创建任务。

密码/IP/有效期/一次性规则在 HTML、页图、任务、下载等接口校验。一次性 HTML 首次成功打开后消耗,同一浏览器再次打开或刷新也拒绝。页数限制仅开放前 N 页,并拒绝整文件读取。PDF、页面图和缩略图可由浏览器私有保存,每次复用先由服务器校验权限与有效期,内容未变化返回 304;CACHE_ENABLED=false 时资源使用 no-store。

打印、复制与水印是页面体验设置,不能阻止截图或保存已传输内容。公开源地址仍可独立读取,分享规则只保护这条链接及关联缓存。

水印支持范围

水印是阅读页面叠加层,并非只支持精准模式。精准模式支持 PDF、Word/RTF/OpenDocument/WPS、PPT、Excel、OFD、TIFF 和 DICOM 等可预览分页文件;图片模式的页图同样支持。JPG/PNG 等图片、XLSX/CSV 表格、文本/代码/Markdown、XML/XDOC 和邮件正文也支持。音视频与 ZIP 目录页不显示水印设置;ZIP 内支持格式的成员阅读页继承水印。默认文字为浅灰 #aaaaaa、透明度 0.5、24px,自定义 stampStyle.fontSize 为 6–96px,独立于文本字号。水印显示在阅读页面,不改写原文件。

工具栏按钮与手机布局

下面参数放在 /api/preview 请求的 options 内。未传默认显示;实际文件没有该功能时不显示。手机端打印、全屏始终隐藏,主栏保留缩略图、查找、页码和下载,缩放与演示位于“更多阅读工具”。

{
  "showThumbnails": true,
  "showSearch": true,
  "showPaging": true,
  "showZoom": true,
  "showPresentation": true,
  "showPrint": true,
  "showDownload": true,
  "showFullscreen": true,
  "downloadPlacement": "toolbar"
}

downloadPlacement 可设为 floating,下载入口改为右下角悬浮图标。showDownload 控制下载按钮显示,allowDownload 仍控制服务器下载权限;showPrint 只控制入口,allowPrint 控制打印权限。showToolbar=false 隐藏整组工具栏,floating 下载可独立显示。

PDF 精准模式优先读取首页 PDF,再按需读取完整文件,复用已加载的内容。首页请求为 /preview/{id}/page-0001.pdf 等分页 PDF,保留原排版与可选文字。全文查找、打印和演示会按操作需要读取更多页面。

06 / 格式与兼容范围

支持以下文件格式;实际排版与编码兼容性取决于源文件及转换组件。

类别 / 扩展名阅读方式边界
DOC/DOCX/DOT/DOTX、RTF、ODT;PPT/PPTX/PPS/PPSX/POT/POTX/ODPLibreOffice 转 PDF静态页面;不执行宏、动画,复杂排版有差异
XLSX、CSV;XLS/XLT/XLTX/ODS工作表视图或 PDF表格模式不重算公式;保留行高、列宽、合并与常见样式;图表、条件格式可查看 PDF
WPS/WPT、ET/ETT、DPS/DPTLibreOffice 尝试转换 PDF依赖具体文件版本;部分旧二进制格式需先导出 Office 文件
PDF、OFDPDF 阅读;OFD 用 OFDRW/PDFBox 转换OFD 签章仅显示,不进行签名有效性认证
JPG/JPEG/PNG/GIF/WebP/BMP/SVG/ICO/AVIF、TIF/TIFF图片缩放、旋转与复位;TIFF 多页转 PDF原生图片支持取决于浏览器;SVG 外部资源不加载;TIFF 限 120 页 / 5000 万像素
MP4/WebM/OGV、MP3/WAV/OGG/M4A浏览器音视频播放器推荐 H.264/AAC MP4、MP3;不转码,不保证任意编码
MD/Markdown、TXT/LOG、代码/JSON/YAMLMarkdown 标题、列表、表格、代码、引用、粗斜体、链接与 HTTP 图片,或纯文本UTF-8、带 BOM 的 UTF-16、GB18030/GBK;不执行 HTML/JavaScript
HTML / HTM隔离 iframe 网页布局预览支持内嵌样式;不执行脚本、表单、弹窗或外部资源
XML / WordXMLWordXML 转 PDF;一般 XML 显示文本不支持外部实体
XDOC标题与段落内容模式专有格式,不执行模板表达式;不保证图形和精确分页
EML邮件头与正文UTF-8 正文;附件不展开,外部图片不加载
ZIP中文目录与成员内容预览;兼容 UTF-8、GBK、Unicode Path成员按需转换,继承父链接权限;不执行内容,拒绝路径穿越、加密或超大成员;最多三层嵌套 ZIP
DCM / DICOM像素帧转 PDFJava dcm4che / OpenCV 解码,组件随 JAR 内置;限 120 帧 / 5000 万像素;用于文件阅读,非诊断工作站

清除缓存/查询有效期

两个功能使用同一个 POST /api/cache 接口,通过 action 区分。url 必须是生成预览时的完整原始文件地址(包括签名查询参数),JSON 中不需要 encodeURIComponent。浏览器只允许同源调用,跨域集成请由业务后端调用。

清除缓存 · action=clear

POST /api/cache · Content-Type: application/json
{"url":"http://www.96doc.com/demo/sample-v2.docx","action":"clear"}

返回 count 为清除的任务数量,包括该原地址的不同预览设置及关联 ZIP 成员缓存。不会删除上传源文件或分享规则;原 src 分享地址下次访问会重新生成缓存,原 id 静态缓存地址会失效。处理中返回 409,待完成后再清除。

查询有效期 · action=status

POST /api/cache · Content-Type: application/json
{"url":"http://www.96doc.com/demo/sample-v2.docx","action":"status","access":"分享链接中 access 参数的值"}

access 可选。查询带自定义 options 的分享链接时,请从 previewURL 中提取 access 并传入;不传 access 只能查询原地址缓存,无法判断某一条自定义分享链接是否过期。access 不存在、已被过期规则清理或与原地址不匹配时返回 404。

响应示例 · HTTP 200
{
  "action": "status", "count": 1, "cacheTTLHours": 168,
  "permanent": true, "expired": false,
  "linkExpiresAt": "0001-01-01T00:00:00Z",
  "cacheExpiresAt": "2026-10-11T08:00:00Z"
}
字段含义
countstatus:尚在有效期内且已完成/失败的缓存任务数;clear:已删除任务数。
permanent / linkExpiresAt / expired指定分享规则是否永久、截止时间、是否已过期。不传 access 时 permanent=true、expired=false,只代表没有指定有限期规则。
cacheExpiresAt匹配缓存中的最晚过期时间;不是分享链接的截止时间。
cacheTTLHours服务配置的转换缓存时长,默认 168 小时(七天)。

时间为 RFC3339,按用户所在时区显示;0001-01-01T00:00:00Z 表示没有对应时间。链接 validMinutes=0 表示永久分享规则,但缓存仍按配置更新;上传源文件仍只有 24 小时保留期。

源文件地址保护预览

业务后端通过 API 提交源文件地址,只把返回的 htmlURL 给前端。这个签名 HTML 地址只有任务 ID、访问签名与有效期,不包含原始 OSS 地址。

业务后端请求 /api/preview
{
  "url": "业务后端持有的文件地址",
  "options": { "displayMode": "precise", "allowDownload": false,
    "allowCopy": false, "validMinutes": 60 }
}

业务后端响应:{"htmlURL": result.htmlURL};前端仅设置 iframe.src = response.htmlURL。前端不能用 previewURL,它的 src 参数包含源地址;不要把整份 API 响应或文件地址发给浏览器。HTML 缓存默认有效 7 天,业务分享有效期单独校验。

生成文件内容和源文件名称仍会传到浏览器;已公开的 OSS 地址无法由预览服务改成私有。真正的原文件保护应使用私有存储,由业务后端签发短期 GET 地址,关闭原文件下载,并正确校验用户权限。水印、禁复制与禁打印不能阻止截图。