网址转文档
单个网页 URL 转 PDF、Office、文本、OFD,或单张 JPG / PNG 长图。
概述
使用流程
异步方式:
- 调用异步转换接口,提交网址和转换参数。
- 接口立即返回
token,表示任务已创建成功。 - 后续通过以下任一方式获取结果:
调用查询结果接口轮询任务状态;或传入
callbackurl,等待系统回调,详细见回调URL。
同步方式:
- 调用同步转换接口,提交网址和转换参数。
- 如果在限定时间内转换完成,则接口直接返回转换结果。
- 如果在限定时间内未完成,则接口返回
token和超时信息。 - 返回
token后,后续处理方式与异步方式相同:继续调用查询结果接口,或等待回调。 - 同步调用详细见:同步调用
异同点:
- 相同点:两种方式的输入参数、转换能力、最终结果格式一致;当返回
token后,后续都通过查询接口或回调URL获取最终结果。 - 不同点:异步方式会立即返回
token;同步方式会优先等待转换完成,能在时限内完成时直接返回结果,超时后再退化为异步流程。
调用转换API需要签名,详细见文档附录:阿里签名。调用查询结果API无需签名。
网址转换
异步url:
https://url2doc.market.alicloudapi.com/v2/convert_async
同步url:
https://url2doc.market.alicloudapi.com/v2/convert_sync
HTTP方式: POST
Header中的Content-Type传入application/json
Body是JSON格式:
{"input": "https://www.example.com/article/123", "outputformat": "docx"}
必须签名才能调用成功,签名见阿里签名规则:
https://help.aliyun.com/zh/api-gateway/traditional-api-gateway/use-cases/call-apis
输出文件格式:
| 类型 | outputformat取值 | 备注 |
|---|---|---|
| 默认值;也可传空 | ||
| Word文档 | docx | |
| PowerPoint文档 | pptx | |
| Excel文档 | xlsx | |
| 文本文件 | txt | |
| OFD文件 | ofd | |
| 图片文件 | jpg, png | 固定输出为单个长图文件 |
自定义参数:
顶层参数如下:
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| input | string | 单个网页URL,必须以http或https开头 | 必须发送 |
| outputformat | string | 输出文件格式,支持:pdf、docx、pptx、xlsx、txt、ofd、jpg、png;传空为pdf | |
| outfilename | string | 生成的文件的文件名,默认随机 | 空 |
| params | dictionary | 转换参数对象;具体字段见下方各参数表 | 空 |
| callbackurl | string | 回调URL,转换结束后会回调该URL,详细见回调URL | 空 |
params中的参数如下,参数名必须使用下表中的JSON字段名。
网址网页相关参数:
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| ismobileurl | int | 是否移动端显示。默认0:桌面端网页,1:移动端网页 | 0 |
| urldesktopwidth | int | 如果桌面端显示。设定网页最大的宽度,默认:1440,最大:1920 | 0 |
| htmlpagemargin | string | 生成的页面边距。输入的是字符串,按照顺序:left top right bottom。单位可以是:px,in,cm,mm。例如左上右下分别是1px,2px,3px,4px,传的字符串就是:1px 2px 3px 4px。默认值:左右0,上下各1cm | 空 |
| urlwait | int | 停留一段时间再抓取页面,单位秒。默认0:不停留,最大30。比如10就是延迟10秒 | 0 |
| urltimeout | int | 加载资源的超时时间。默认0:40秒,最大120秒。比如10就是10秒 | 0 |
| urlonepage | int | 是否生成单页的长PDF。默认0:否, 1:是。注意打开这个选项后htmlpagemargin失效 | 0 |
| urltextonly | int | 是否按文本模式抽取网页内容。0:否;1:是 | 0 |
| urlreadability | int | 是否抽取正文阅读区域。0:否;1:是 | 0 |
通用输出参数:
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| pagesize | int | 输出页面大小。仅在输出为pdf或docx或pptx时有效。0:自动/A4;1:A3;2:A4;3:A5;4:B4;5:B5;6:Letter;7:Legal;8:Tabloid;9:Ledger | 0 |
| pageorientation | int | 输出页面方向。0:不变;1:横向;2:竖向 | 0 |
| watermark | string | 添加水印,字符个数最大15个 | 空 |
| watermarkstyle | int | 水印的样式,默认0:文档中央一个水印;1: 文档铺满水印 | 0 |
| watermarkfontsize | int | 水印的字体大小,默认24pt | 24 |
| watermarkfontcolor | string | 水印的颜色,输入颜色码,默认黑色#000000,必须7位 | #000000 |
| watermarkfontalpha | int | 水印的透明度,取值范围1-100,越小越透明,默认20 | 20 |
输出PDF相关参数(outputformat为空或pdf时生效):
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| linearization | int | 是否需要快速Web显示(PDF流式显示)。0:否;1:是 | 0 |
| compress | int | 是否压缩PDF。0:不压缩;1、2、3:压缩,1压缩率最低,3压缩率最高 | 0 |
| flatten | int | 是否扁平化PDF,将注释合并到PDF页面。0:否;1:是 | 0 |
| imagepdf | int | 是否生成图片PDF。0:否;1:是 | 0 |
| userpassword | string | 生成PDF的用户密码,设置后打开文件需要输入密码 | 空 |
| ownerpassword | string | 生成PDF的所有者密码,设置后限制修改权限 | 空 |
| pdfrestriction | string | 设置PDF权限,需配合密码使用。格式为3位,例如010,依次表示是否允许打印、复制、编辑 | 空 |
输出文档相关参数(outputformat为docx、pptx、xlsx、txt、ofd时生效):
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| wordnoimage | int | 如果转为Word文件,默认0:需要图片;1:不需要图片 | 0 |
| wordabsolutelayout | int | 如果转为Word文件,默认0:流式布局;1:绝对布局(位置精准,浏览方便,但是编辑方式非流式不利于编辑) | 0 |
| excelonesheet | int | 如果转为Excel文件,默认0:按系统默认策略;1:合并到一个工作表;2:每页一个工作表 | 0 |
输出图片相关参数(outputformat为jpg或png时生效):
| 参数 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| imagesize | int | 输出长图宽度。默认0自动,最大2000 | 0 |
| grayimage | int | 是否输出灰度图,默认0否,1是 | 0 |
请求示例:
- 例1: 将网页URL转为Word
{"input": "https://www.example.com", "outputformat": "docx", "outfilename": "example"}
- 例2: 将网页URL转为PDF,并设置等待、压缩和文件名
{ "input": "https://www.example.com/news/1001", "outputformat": "pdf", "outfilename": "news_1001", "params": { "urlwait": 3, "linearization": 1, "compress": 1, "watermark": "news" } }
- 例3: 异步回调,并使用移动端页面转为Word
{ "input": "https://www.example.com/post/abc", "outputformat": "docx", "outfilename": "post_abc", "params": { "ismobileurl": 1, "urlreadability": 1 }, "callbackurl": "https://api.example.com/url2doc/callback" }
- 例4: 将网页URL转为PNG长图
{ "input": "https://www.example.com/report", "outputformat": "png", "outfilename": "report", "params": { "imagesize": 1600 } }
返回数据结构【异步】:
| 名称 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|
| code | number | 是 | 10000:请求成功 |
| msg | string | 是 | |
| result | Dictionary | 否 | 成功后返回 |
result:
| 名称 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|
| token | string | 是 | 用于查询结果接口 |
返回示例(成功状态)【异步】:
{
"code":10000,
"msg":"",
"result":{"token":"YOUR_CREDENTIAL"}
}
返回示例(失败状态)【异步】:
{
"code":40001,
"msg":"ParmNotRight"
}
同步调用
同步调用的最大返回时间是60秒,如果60秒内转换结束则直接返回结果。否则会返回token,之后和异步方式一样可以调用查询结果接口查询该token的转换结果。所以同步调用如果页面内容复杂,无法保证在60秒内结束,则转为异步流程。
返回数据结构【同步】:
| 名称 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|
| code | number | 是 | 10000:请求成功 |
| msg | string | 是 | |
| token | string | 是 | 请求的token |
| result | Dictionary | 否 | 成功后返回 |
result:
| 名称 | 含义 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|---|
| fileurl | 输出文件地址 | string | 否(status为Done时返回) | 所有输出格式完成后均返回该地址,http和https都支持 |
| count | 页数 | integer | 否(status为Done时返回) | 输出文件页数;如果输出是长图,则通常为1 |
| filesize | 文件大小 | integer | 否(status为Done时返回) | 输出文件大小 |
| status | 状态 | string | 是 | Done:转换成功 Failed:转换失败 |
返回示例(成功状态)【同步】:
{
"code": 10000,
"msg": "",
"result": {
"filesize": 17747,
"fileurl": "https://file.duhuitech.com/o/xxx/xxx.docx",
"status": "Done"
},
"token": "YOUR_CREDENTIAL"
}
{
"code": 10000,
"msg": "",
"result": {
"filesize": 17747,
"fileurl": "https://file.duhuitech.com/o/xxx/xxx.png",
"status": "Done"
},
"token": "YOUR_CREDENTIAL"
}
返回示例(超时状态)【同步】:
{
"code": 40500,
"msg": "Timeout, query token later",
"token": "YOUR_CREDENTIAL"
}
查询结果
请求参数:
| 参数 | 类型 | 备注 | 是否必须发送 |
|---|---|---|---|
| token | string | 调用转换接口拿到的token | 是 |
请求示例:
https://api.duhuitech.com/q?token=YOUR_TOKEN
无需签名,无调用次数限制
由于转换需要时间,页面越复杂,转换越久,故需要轮询查询接口来获得结果。查询频率可以是1s一次,也可以更长一些。 查询后先看status,如果是Done或Failed,则转换结束,停止轮询。如果是Doing或Pending,则继续轮询。
返回数据结构:
| 名称 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|
| code | number | 是 | 10000:请求成功 |
| msg | string | 是 | |
| token | string | 是 | 请求的token |
| result | Dictionary | 否 | 成功后返回 |
result:
| 名称 | 含义 | 类型 | 是否必须返回 | 备注 |
|---|---|---|---|---|
| status | 状态 | string | 是 | Pending:还未开始 Doing:正在转换 Done:转换成功 Failed:转换失败 |
| progress | 进度 | number | 否(status为Doing时返回) | 范围:0.00 - 1.00,比如0.88表示88% |
| fileurl | 输出文件地址 | string | 否(status为Done时返回) | 所有输出格式完成后均返回该地址,http和https都支持 |
| count | 页数 | integer | 否(status为Done时返回) | 输出文件页数;如果输出是长图,则通常为1 |
| filesize | 文件大小 | integer | 否(status为Done时返回) | 输出文件大小 |
| reason | 失败原因 | string | 否(status为Failed时可能返回) | 转换失败的原因 |
返回示例(成功状态):
{
"code":10000,
"msg":"",
"token":"YOUR_CREDENTIAL",
"result":
{
"progress":0.02,
"status":"Doing"
}
}
{
"code":10000,
"msg":"",
"token":"YOUR_CREDENTIAL",
"result":
{
"status":"Done",
"fileurl":"https://file.duhuitech.com/o/xxx/xxx.docx",
"filesize":17747
}
}
返回示例(失败状态):
{
"code":40000,
"msg":"No such token"
}
备注:
- 系统会对单次任务时长、页面资源加载和目标URL可访问性做保护;页面过大、资源加载超时或目标URL不可访问时,任务可能失败或在同步调用中返回超时。
- 最大转换时长:1小时,超过时间未完成则自动失败。
- 转换完成后,下载链接有效时间:1小时。
上述最后2项有延长需求请联系客服:

回调URL:
用途: 客户可以自行部署服务器,系统转换结束后会调用客户提供的回调URL,直接发送转换结果,从而无需再轮询查询结果。
当设置了回调URL,转换结束后(无论成功失败),系统都会尝试调用该URL,具体如下:
以POST方式调用该URL,Header头中Content-Type: application/json
Body为JSON格式,内容和查询结果的结果相同,例如:
{
"code":10000,
"msg":"",
"token":"YOUR_CREDENTIAL",
"result":
{
"status":"Done",
"fileurl":"https://file.duhuitech.com/o/xxx/xxx.docx",
"filesize":17747
}
}
服务端收到该POST后需在10秒内返回HTTP STATUS CODE 200,视为调用成功,否则系统认为回调失败,会再次尝试。规则如下:
系统共计最多会调用3次回调URL,如果第一次失败,则等待3秒后尝试第二次,如果第二次失败,则等待5秒后尝试第三次,如果第三次失败,则不再尝试。
回调URL超时时间10秒。
关于下载转换后的文件需支持302跳转
接口返回的下载地址(如 fileurl / fileurls)会经 HTTP 302 跳转到实际文件。浏览器会自动跟随。
以下方式默认会跟随跳转,一般无需额外配置:
wget、Python requests / urllib、Node.js axios / got / fetch、Java OkHttp / HttpURLConnection、Go net/http、C# HttpClient、PHP file_get_contents、Objective-C / Swift NSURLSession / URLSession(含 Alamofire)
少数默认不跟随,需手动打开:
curl:加-L,如curl -L -o out.bin "下载地址"- Java
java.net.http.HttpClient:设置.followRedirects(HttpClient.Redirect.NORMAL) - PHP
curl扩展:设置CURLOPT_FOLLOWLOCATION => true
若只拿到 302 响应、本地没有文件内容,多半是未跟随跳转,按上面说明打开对应选项即可。
阿里云独有部分:
当前接口场景为网页URL抓取,通常不涉及OSS内网地址。
错误码表:
返回的code如果是10000,代表成功,其余是失败
| JSON里返回的code | 错误信息 |
|---|---|
| 40000 | 通用错误 |
| 40001 | 参数错误 |
| 40002 | 参数不符合规范 |
| 40500 | 同步调用超时 |
附录:阿里签名方式
参考链接:
https://help.aliyun.com/zh/api-gateway/traditional-api-gateway/use-cases/call-apis
在调用API商品时,首先您需要了解采用哪种API认证方式,云市场API商品的认证方式主要有以下两种方式。两种方式可同时使用,您可以根据不同情况来选择。
简单身份认证(AppCode)
签名认证
简单身份认证(AppCode)
简单认证(AppCode)调用API,有两种方式,一种是将AppCode放在Header中进行调用,一种是将AppCode放在Query参数中进行调用。
方式一:将AppCode放在Header中
在请求Header中添加一个Authorization参数。
Authorization字段的值的格式为APPCODE + 半角空格 +APPCODE值。格式如下:
Authorization:APPCODE AppCode值
示例:
Authorization:APPCODE YOUR_CREDENTIAL
方式二:将AppCode放在Query中
在请求Query中添加AppCode参数(同时支持appcode , appCode , APPCODE , APPCode四种写法)。
AppCode参数的值为AppCode的值。
示例:
http://www.aliyum.com?AppCode=YOUR_CREDENTIAL
签名认证
比较复杂,推荐用阿里自己的SDK来调用,参考链接:https://help.aliyun.com/zh/api-gateway/traditional-api-gateway/user-guide/use-digest-authentication-to-call-an-api
