> ADP 文档转 PDF Skill | 本 Skill 提供 Word/Excel 文件转 PDF 的能力:Word (.docx) 转 PDF、Excel (.xlsx) 转 PDF。转换为异步操作,通过 MCP 协议调用,响应格式为 JSON-RPC 2.0。
本技能提供文档格式转换能力,支持将 Word 和 Excel 文件转换为 PDF 格式,并尽可能保留原文件格式样式。
| 特性 | 说明 |
|---|---|
| --- | --- |
| 支持的操作 | Word (.docx) 转 PDF、Excel (.xlsx) 转 PDF |
| 输入方式 | 本地文件路径(自动上传获取公网 URL)或公网 URL |
| 返回格式 | JSON-RPC 2.0(MCP 协议),异步模式(提交任务 + 轮询结果) |
| 文件大小限制 | 上传文件最大 20MB |
| 收费说明 | 官方收费插件,需确保 ADP 账号有足够调用配额 |
task_id,再轮询查询结果| 工具名称 | 功能 | 输入参数 | 说明 |
|---|---|---|---|
| --- | --- | --- | --- |
| WordToPDF | Word 转 PDF | file_url (string) | 提交 Word 文件转换任务,返回 task_id |
| QueryWordToPDF | 查询 Word 转 PDF 结果 | task_id (string) | 根据 task_id 查询转换结果 |
| ExcelToPDF | Excel 转 PDF | file_url (string) | 提交 Excel 文件转换任务,返回 task_id |
| QueryExcelToPDF | 查询 Excel 转 PDF 结果 | task_id (string) | 根据 task_id 查询转换结果 |
首次激活时,检查环境变量 ADP_API_KEY 是否已设置。
> ⚠️ 重要:/etc/environment 文件只在登录 shell 时自动加载。Agent 通过 exec 启动的 shell 通常是非登录 shell,不会自动读取该文件。因此必须两步都检查:
# 步骤 1: 检查当前 shell 环境变量
echo $ADP_API_KEY
# 步骤 2: 如果为空,检查 /etc/environment 文件(可能存在但未加载到当前 shell)
grep "ADP_API_KEY" /etc/environment 2>/dev/null
判断逻辑:
| 当前环境变量 | /etc/environment 文件 | 操作 |
|---|---|---|
| --- | --- | --- |
| ✅ 有值 | — | 直接使用,跳过步骤 2 |
| ❌ 空 | ✅ 文件中存在 | 执行 source /etc/environment 加载后使用,跳过步骤 2 |
| ❌ 空 | ❌ 文件中也没有 | 进入步骤 2 引导用户获取密钥 |
> 💡 脚本已内置 fallback:脚本会自动依次查找 MCP 配置文件 → os.environ → /etc/environment → ~/.env → .env,即使当前 shell 未加载变量,脚本也能找到密钥。但 Agent 在执行脚本前仍建议先 source /etc/environment,确保后续命令行操作也能使用该变量。
引导用户按以下步骤操作:
> ⚠️ 注意:密钥最多只能创建 2 个。如果提示已达上限,需要先删除旧的密钥再新建。
> 🔒 必须展示的提示:在引导用户访问上述链接时,每次都必须同时告知用户:如果无法访问该页面,说明当前账号权限不够,请联系管理员开通权限。
如果上述链接没有正常跳转到密钥管理页面,引导用户:
用户提供密钥后,优先写入 /etc/environment(全局生效),如果没有 sudo 权限则兜底写入项目 .env 文件。
# 写入 /etc/environment(需要 sudo 权限,对所有用户和 shell 生效)
echo 'ADP_API_KEY=用户提供的密钥' | sudo tee -a /etc/environment > /dev/null
写入后,重新加载使当前会话生效:
source /etc/environment
如果用户没有 sudo 权限,写入项目根目录的 .env 文件:
echo 'ADP_API_KEY=用户提供的密钥' >> .env
> ⚠️ 变量名必须为 ADP_API_KEY,完全一致,不可更改,否则会影响 ADP 平台上的业务逻辑。
存储完成后,告知用户密钥已保存。
用户明确表达了文档转 PDF 意图:
当用户提供了一个 Word 或 Excel 文件(本地路径或 URL),并要求将其转换为 PDF 格式时,自动触发。
tencent-pdf-to-office-document 技能 ❌tencent-Image-to-office-document 技能 ❌tencent-document-translation 技能 ❌如果用户没有提供文件,提示用户:
> 请提供需要转换为 PDF 的文件(支持 Word .docx 和 Excel .xlsx 格式,支持上传本地文件或提供公网 URL)。
| 缺少的输入 | 提示语 |
|---|---|
| --- | --- |
| 未提供文档文件 | "请提供需要转换为 PDF 的文件(支持 Word .docx 和 Excel .xlsx 格式,支持上传本地文件或提供公网 URL)。" |
| 未指定文件类型(无法从文件名判断) | "请告诉我您提供的是 Word 文件还是 Excel 文件,以便选择正确的转换方式。" |
| 文件和类型都缺 | "请提供需要转换的 Word 或 Excel 文件。例如:'帮我把这个 Word 文件转成 PDF'" |
> ⚠️ 禁止在用户未提供文件时直接报错或返回空结果。必须友好地引导用户提供必要输入。
根据用户的文件或描述,路由到对应的工具。路由表:
| 用户表达(关键词 / 文件后缀) | 路由到工具 | 说明 |
|---|---|---|
| --- | --- | --- |
| .docx / .doc / Word / word 文件 | WordToPDF → QueryWordToPDF | Word 转 PDF |
| .xlsx / .xls / Excel / excel 文件 / 表格 | ExcelToPDF → QueryExcelToPDF | Excel 转 PDF |
| 无法判断文件类型(模糊意图) | — | 展示选择题 |
当无法从用户描述或文件名中确定文件类型时,展示以下选择题:
> 请确认要转换的文件类型:
> 1. Word 文件 (.docx/.doc) — 将 Word 文档转换为 PDF
> 2. Excel 文件 (.xlsx/.xls) — 将 Excel 表格转换为 PDF
> ⚠️ 仅当用户提供的是本地文件路径时需要此步骤。如果用户提供的已经是公网 URL(http:// 或 https:// 开头),直接跳到步骤 4。
本地文件需要先通过 ADP 文件托管 API 上传获取公网 COS URL。核心思路:本地文件 → Base64 编码 → 调用 ADP 文件托管 API → 获取 COS URL → 传入转换 API
使用脚本上传(推荐):
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--action upload \
--file-path "/path/to/document.docx"
ADP 文件托管 API 详情:
| 属性 | 值 |
|---|---|
| --- | --- |
| 调用地址 | https://adp.cloud.tencent.com/plugin/api/v1/9ebc029f-5567-493f-b823-0ad978a9bab1/b511190e-ab93-46ba-bee7-d852d53a28a9 |
| 请求方式 | POST |
| 认证方式 | Authorization: Bearer |
| 输入参数 | FileBase64(文件 base64 编码内容,必填)、FileName(文件名带后缀,必填) |
| 文件大小限制 | 最大 20MB,超过 20MB 的文件将被拒绝上传 |
| 输出参数 | Code(0=正常)、Msg(返回信息)、Data.CosUrl(COS 文件地址) |
注意事项:
ADP_API_KEY 进行认证FileName 必须带文件后缀(如 .docx、.xlsx)Data.CosUrl 字段获取公网 URL参考 scripts/doc_to_pdf.py 中的完整代码模板。
Agent 执行时将以下占位符替换为实际值:
| 占位符 | 替换为 |
|---|---|
| --- | --- |
ACTION | 操作类型(见下方操作代号表) |
FILE_URL | 文件的公网 URL(本地文件需先上传获取) |
FILE_PATH | 本地文件路径(使用 --auto 模式时自动上传) |
| ACTION 值 | 工具 | 说明 |
|---|---|---|
| --- | --- | --- |
word-to-pdf | WordToPDF + QueryWordToPDF | Word 一键转换(自动提交 + 轮询) |
excel-to-pdf | ExcelToPDF + QueryExcelToPDF | Excel 一键转换(自动提交 + 轮询) |
upload | ADP 文件托管 | 仅上传文件获取公网 URL |
# Word 转 PDF — 本地文件(自动上传 + 转换 + 轮询)
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--action word-to-pdf \
--file-path "/path/to/document.docx" \
--auto
# Word 转 PDF — 公网 URL(直接转换 + 轮询)
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--action word-to-pdf \
--file-url "公网URL" \
--auto
# Excel 转 PDF — 本地文件(自动上传 + 转换 + 轮询)
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--action excel-to-pdf \
--file-path "/path/to/spreadsheet.xlsx" \
--auto
# Excel 转 PDF — 公网 URL(直接转换 + 轮询)
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--action excel-to-pdf \
--file-url "公网URL" \
--auto
> 💡 --auto 模式下,脚本会自动读取环境变量 ADP_API_KEY 中的密钥。如提供 --file-path 则自动上传到 ADP 文件托管获取公网 URL,然后提交转换任务后每隔 3 秒轮询一次,最多等待 5 分钟,直到转换完成并返回文件信息(含下载 URL,需在步骤 5 中下载到本地)。
# 步骤 A:提交任务
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--api-key "YOUR_KEY" \
--action word-to-pdf \
--file-url "URL"
# 步骤 B:查询结果
python3 <SKILL_DIR>/scripts/doc_to_pdf.py \
--api-key "YOUR_KEY" \
--action query-word \
--task-id "TASK_ID"
> 🔴🔴🔴 CRITICAL — 全渠道统一文件投递规则
>
> 所有渠道都必须遵守以下三步流程:
>
> 第一步:下载到本地 — 将转换完成后返回的 PDF 文件 URL 下载到工作区目录(不要用 /tmp/)
> 第二步:确认文件存在 — 检查本地文件是否下载成功、大小是否正常
> 第三步:按渠道投递本地文件 —
> - 🟢 IM 渠道(已确认支持 filePath)(飞书 / 钉钉)→ 用 message 工具的 filePath 发送本地 PDF 文件
> - 🟡 Web / API / QQ / 企业微信 / 其他 → 调用 upload_file_for_url(本地文件路径, api_key) 获得一个新的短 URL → 以 下载文案 的 Markdown 链接形式返回
> - 🔵 IDE / CLI → 告知用户本地文件路径 / 用 open_result_view
>
> ⚠️ 关于 QQ 和企业微信:这两个渠道的文件发送能力因 Bot 框架不同差异较大,不能假设一定有 filePath 参数。默认按 Web/API 处理(上传获取新链接)。如果 Agent 运行时确认当前 QQ/企微环境支持 filePath 发文件,可以按 IM 方式处理。
>
> 🔴 核心原则:永远不要把接口直接返回的 COS 签名 URL 复制给用户。签名 URL 极长、易被截断、用户体验差。所有渠道都必须先下载到本地,再通过本地文件投递。
转换完成后,向用户展示格式化的结果:
### 📄 文档转 PDF 结果
**原始文件**:{文件名}
**转换类型**:{Word / Excel} → PDF
**转换状态**:✅ 转换成功
**生成结果**:已保存到 `{本地文件路径}`
> ⚠️ 所有字段必须完整输出,不可省略。
requests.get(url, timeout=120) → 保存到工作区目录 converted_output.pdf| 当前渠道 | 投递方式 |
|---|---|
| --- | --- |
| 飞书 / 钉钉 | 用 message 工具的 filePath 发送本地文件 converted_output.pdf |
| Web / API / QQ / 企微 / 其他 | 调用 upload_file_for_url('converted_output.pdf', api_key) → 以 📄 下载 PDF 文件 返回,加一行 ⚠️ 链接有效期约 1 天,请及时下载保存。 |
| IDE / CLI | 告知本地路径 / open_result_view |
上传接口使用方法(脚本 doc_to_pdf.py 已内置 upload_file_for_url 函数):
import sys
sys.path.insert(0, '<SKILL_DIR>/scripts')
from doc_to_pdf import upload_file_for_url
cos_url, error = upload_file_for_url("converted_output.pdf", api_key)
if error:
# 上传失败,兜底:告知用户本地文件路径
print(f"上传失败: {error},本地文件路径: converted_output.pdf")
else:
# 上传成功,返回下载链接
print(f"📄 [下载 PDF 文件]({cos_url})")
✅ 正确示范(IM 渠道):
### 📄 文档转 PDF 结果
**原始文件**:report.docx
**转换类型**:Word → PDF
**转换状态**:✅ 转换成功
**生成结果**:已保存到 `converted_output.pdf`
📎 [通过 filePath 发送 converted_output.pdf 文件给用户]
✅ 正确示范(Web/API 渠道):
### 📄 文档转 PDF 结果
**原始文件**:report.docx
**转换类型**:Word → PDF
**转换状态**:✅ 转换成功
📄 [下载 PDF 文件](https://xxx.cos.ap-xxx.myqcloud.com/upload/xxx.pdf?sign=xxx)
⚠️ 链接有效期约 1 天,请及时下载保存。
❌ 错误示范(所有渠道都禁止):
转换完成,PDF 链接:https://xxx.cos.ap-xxx.myqcloud.com/xxx.pdf?q-sign-algorithm=sha1&q-ak=xxx...(把接口原始签名 URL 直接贴出来)
> 🔴 核心原则:无论任何渠道,接口返回的原始 COS 签名 URL 都不允许直接展示给用户。
>
> - 飞书/钉钉 → 下载到本地 → filePath 发送文件(用户收到的是文件消息,不是链接)
> - Web/API/QQ/企微/其他 → 下载到本地 → upload_file_for_url 重新上传 → 返回新的 Markdown 链接
> - IDE/CLI → 下载到本地 → 告知路径
>
> 为什么不直接给原始 URL?
> 1. 原始 COS 签名 URL 通常超过 300 字符,模型容易截断导致链接失效
> 2. 裸 URL 用户体验极差
> 3. IM 渠道用户期望收到的是可直接打开的文件消息,不是一个链接
> Agent 必须根据自身运行环境判断。如果无法确定,默认按「Web/API」处理(下载 → 上传 → 给新链接)。
| 渠道 | 类型 | 投递方式 |
|---|---|---|
| --- | --- | --- |
| 飞书 | IM | 下载到本地 → filePath 发送文件 |
| 钉钉 | IM | 下载到本地 → filePath 发送文件 |
| 按 Web 处理 | 下载到本地 → upload_file_for_url → 文案 | |
| 企业微信 | 按 Web 处理 | 下载到本地 → upload_file_for_url → 文案 |
| Web 页面 | Web | 下载到本地 → upload_file_for_url → 文案 |
| API 调用 | API | 下载到本地 → upload_file_for_url → 文案 |
| IDE(CodeBuddy 等) | IDE | 下载到本地 → open_result_view / 告知路径 |
| CLI / 终端 | CLI | 下载到本地 → 告知路径 |
| 其他 / 不确定 | 按 Web 处理 | 下载到本地 → upload_file_for_url → 文案 |
> ⚠️ 关于 QQ 和企业微信:这两个渠道的 Bot 框架差异大,文件发送能力不统一(QQ Bot 可能没有 filePath、企微 Bot 需要先上传获取 mediaId)。默认按 Web/API 方式处理。如果 Agent 运行时确认当前环境确实支持 filePath 发文件,可以按飞书/钉钉方式处理。
/tmp/(IM 渠道 filePath 不支持 /tmp 路径)converted_output.pdf(或根据原文件名命名,如 report.pdf)当需要下载转换后的 PDF 文件到本地时:
import requests
# 从脚本输出中提取 PDF 文件下载 URL
result_url = "提取到的完整URL"
output_filename = "converted_output.pdf"
resp = requests.get(result_url, timeout=120)
with open(output_filename, "wb") as f:
f.write(resp.content)
print(f"文件已保存: {output_filename} ({len(resp.content)} bytes)")
Web/API 渠道需要将本地文件转为可点击的下载链接:
import sys
sys.path.insert(0, '<SKILL_DIR>/scripts')
from doc_to_pdf import upload_file_for_url
cos_url, error = upload_file_for_url("converted_output.pdf", api_key)
if error:
print(f"上传失败: {error}")
# 兜底:告知用户本地文件路径
else:
# 在回复中使用: [下载文案](cos_url)
print(f"上传成功: {cos_url}")
> 以下行为是绝对禁止的,违反任何一条都是严重错误:
&、q-signature=xxx 等都是必要的组成部分AGENT DELIVERY INSTRUCTIONS 文字原样输出给用户 — 那是给 Agent 看的内部指令,用户不应看到| 问题 | 原因 | 解决方案 |
|---|---|---|
| --- | --- | --- |
| 401 Unauthorized | API Key 无效或未设置 | 检查 ADP_API_KEY 环境变量,重新获取密钥 |
| 403 Forbidden | 无权访问该插件 | 确认 ADP 账号已开通文档转PDF 插件的访问权限 |
| 配额不足 / quota exceeded | 当前套餐调用额度已用完 | 引导用户前往 ADP 购买页 购买套餐或增购包 |
| 文件 URL 无法访问 | 上传链接无效或已过期 | 重新上传文件获取新 URL |
| 文件超过 20MB | ADP 文件托管服务限制 | 请压缩文件后重试 |
| 转换任务一直处于 pending | 文件过大或服务繁忙 | 等待更长时间,或减小文件大小后重试 |
| 文件格式不支持 | 非 .docx/.xlsx 格式 | 确保是 Word (.docx) 或 Excel (.xlsx) 格式 |
| 文件上传失败 | API Key 无效、编码错误或网络问题 | 检查 API Key 是否有效、网络连接 |
| 环境变量未设置 | ADP_API_KEY 未配置 | 按首次激活流程重新设置环境变量 |
| 密钥创建提示已达上限 | 最多只能创建 2 个密钥 | 删除旧的不用的密钥,再新建 |
当接口返回 配额不足(如 Code=3000003、quota exceeded 等错误提示)时,说明当前账号的调用额度已用完。Agent 应告知用户:
> ⚠️ 当前配额已用完,无法继续调用。请前往 ADP 购买页 购买套餐或增购包后重试。
如遇到本 Skill 未覆盖的问题,建议查阅 ADP 官方文档。
完整的接口参数说明和响应格式,参见 references/api_docs.md。
doc_to_pdf.py — 调用文档转PDF MCP API 的 Python 脚本,支持 5 种操作(upload / word-to-pdf / query-word / excel-to-pdf / query-excel)、自动轮询模式、自动读取环境变量密钥api_docs.md — 完整 API 文档,包含 4 个工具的请求/响应格式、参数说明共 1 个版本