下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-l7kywqpq--foxit-pdf365-convert.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-l7kywqpq/foxit-pdf365-convert。一站式 PDF 处理工具箱,支持 PDF 与 Word/Excel/PPT/ 图片 / HTML/TXT 互转,提供 PDF 压缩、合并、拆分、PDF 去水印,快速完成各类办公文档转换。
阅读全文 (展开查看完整说明)
概述
JobType 对照
📌 JobType 对照与触发规则已独立维护在 [JobType_and_Triggers.md](./JobType_and_Triggers.md)。
Triggers
📌 触发关键词与正则模式已独立维护在 [JobType_and_Triggers.md](./JobType_and_Triggers.md)(
Triggers章节)。
API Key 管理(必须首先执行)
📌 API Key 相关流程(检查流程、Key 完整性、切换账号/替换 Key、Key 无效处理、运维安全约束)已统一独立维护在 [API_KEY.md](./API_KEY.md),为单一事实来源。调用本 Skill 时须按 API_KEY.md 指引,完整遵循其中全部内容;本章节不重复罗列具体条目,仅指明入口。
工作流
用户触发 -> ensure_api_key -> ensure_mcp_ready -> ask_upload -> (合并PDF: ask_files -> 重命名排序 -> 打包zip -> upload -> converting / 转图片: ask_image_format -> converting / 图片转PDF: ask_image_format -> (单图: upload -> converting / 多图: 重命名排序 -> 打包zip -> upload -> converting) / 拆分PDF: converting / 去水印PDF: converting / Excel转PDF: converting / PDF转HTML: converting / PPT转PDF: converting / Word转Excel: converting / TXT转PDF: converting / 其它: converting) -> download -> (有额度: return_file / 无额度: prompt_pay -> download) / error_handler| 状态 | 动作 | 成功去向 | 失败去向 |
|---|---|---|---|
| ensure_api_key | 检查本地 Key:不存在则引导用户创建;存在则读取(见 [API_KEY.md](./API_KEY.md))。Key 有效性由后续 API 调用校验,无效时转 invalid_key | ensure_mcp_ready | end |
| ensure_mcp_ready | 检查/自动配置 MCP(见「MCP 调用模式」) | ask_upload | end |
| ask_upload | 等待用户提供文件并校验格式与大小:PDF 转换(转Word/Excel/PPT/图片/HTML/压缩/拆分/去水印/合并)仅支持 .pdf;图片转 PDF 场景仅支持 .png/.jpg/.jpeg/.bmp/.tiff/.tif;Word 转 PDF 仅支持 .docx/.doc;Excel 转 PDF 仅支持 .xlsx/.xls;PPT 转 PDF 仅支持 .pptx/.ppt;Word 转 Excel 仅支持 .docx/.doc;TXT 转 PDF 仅支持 .txt;所有上传内容须 < 100MB(≥100MB 则提醒用户并停止,见「上传接口 → 文件大小校验」)。不合规则 → 告知并请用户重新提供 | ask_files(合并)/ ask_image_format(转图片/图片转PDF)/ converting(其它) | error_handler |
| ask_files | (合并专用)确认并收集用户提供的多个 PDF 文件及其合并顺序 | 重命名排序(步骤见「转换执行约定」→「执行流程」)/ converting | ask_files |
| ask_image_format | 两种情况之一:① 转图片:用户选择输出图片格式:jpg / png / 长图(仅限这三项);② 图片转 PDF:校验用户提供的图片格式,仅支持 png / jpg / jpeg / bmp / tiff / tif;图片转 PDF 按单图/多图分流:单图直接上传转换,多图先确认顺序 → 重命名 → 打包 zip 再上传转换 | converting | ask_image_format |
| converting | 上传 → 创建任务 → 轮询(步骤 1-3),其中上传/创建任务若返回 Key 无效转 invalid_key | download | invalid_key / error_handler |
| invalid_key | Key 无效(仅当 API 返回鉴权失败时)→ 引导用户重新获取并更新(见 [API_KEY.md](./API_KEY.md) →「Key 无效处理」) | ask_upload | end |
| download | 调用 downloadConvertResult(taskId)(步骤 5) | return_file(有额度) / prompt_pay(无额度) | error_handler |
| prompt_pay | 提示用户打开支付页链接完成支付,支付完成后告知 agent(步骤 6) | download | error_handler |
| return_file | 返回下载地址 + 将文件下载到原文件所在目录(步骤 7) | end | – |
| error_handler | 询问是否重试;上传、转换阶段失败回到 ask_upload,下载/支付阶段失败回到 download | ask_upload / download | end |
转换执行约定
上传接口
| 项 | 值 |
|---|---|
| URL | POST https://open.pdf365.cn/documentConvert/upload |
| 请求头 | Content-Type: multipart/form-data、X-API-KEY: <本地存储的Key> |
| 参数 | 文件(form-data field: file) |
| 成功响应 | { "data": { "fileUrl": "..." }, "code": 0, "msg": "success" } |
⚠️ 文件大小校验(上传前必须执行,一条硬性门槛 + 两种预检口径):全流程涉及三种文件大小,必须区分清楚,避免「单个」「打包总合」「上传包」语义混杂。三种文件大小的判定关系如下:
三种限制(统一口径):
- ① 单个源文件上限(预检):用户提供的每个源文件(单个 PDF / 单张图片 / 单个 Word / 单个 Excel / 单个 PPT / 单个文本)大小必须 < 100MB。用于普通单文件转换;多文件合并 / 多图打包时作为第一步预检。
- ② 内部 ZIP 解压后总大小上限(预检):多文件合并 / 多图打包时,参与打包的全部源文件合计大小建议 < 100MB,用于提前预警;是否真正达标以 ③ 实测为准。
- ③ 最终上传包硬性门槛(决定性):真正交给
upload接口的内容(单个源文件,或 Agent 打包生成的 zip)的实测大小必须严格 < 100MB。任何分支、任何情形,最终是否允许上传一律以 ③ 为准。三条界限的关系:①② 是流程中的预检,只用来识别过大的文件并提前告知用户;最终能否上传,一律只看 ③。即便每个源文件都 < 100MB(① 通过),只要 Agent 打包 / 合计后 zip ≥ 100MB(③ 不通过),同样拒绝上传。
校验时机:在调用上传接口之前校验最终待上传内容(即 ③ 的实测上传对象)的实际文件大小,不得跳过。打包 zip 场景在打包完成后、上传前校验 zip 实际大小。
超限处理:凡最终上传内容 ≥ 100MB,立即停止上传并终止后续所有逻辑(不调用
upload、不创建转换任务、不轮询),同时明确提醒用户超限并给出处理建议:
- 普通单文件 → 请用户压缩或更换更小的文件后重试;
- 合并 PDF / 多图打包 → 拆分合并、分批处理,或先压缩后再合并 / 再转换;
- 若为 zip 打包,校验的是打包后 zip 的实测大小(即 ③),不是单个文件。
- 只有 ③ 通过(< 100MB)才允许继续上传。
- 下列场景均统一按上述三口径判定,各分支不再各自标注不同上限:PDF 转换 / 压缩 / 合并、图片转 PDF(单图或 zip)、Word 转 PDF、Excel 转 PDF、PPT 转 PDF、Word 转 Excel、TXT 转 PDF。
边界示例(各分支一致):
- 单个源文件恰好 100MB → ① 与 ③ 均不通过,拒绝上传,需压缩或更换更小文件;
- 多个源文件各自 < 100MB,但合计/打包后 zip ≥ 100MB → 拒绝上传,需拆分合并、分批处理或先压缩;
- 多个源文件各自 < 100MB 且打包后 zip 实测 < 100MB → 允许上传,正常继续。
⚠️ 文件格式校验(上传前必须执行):根据转换类型校验文件扩展名:
- 普通转换(转 Word / Excel / PPT / 图片 / HTML / 压缩 / 拆分 / 去水印):接受单个 PDF 文件(扩展名为
- 合并 PDF(
MERGE_PDF):接受用户提供的多个 PDF 文件(扩展名为.zip。ZIP 由 Agent 内部生成,用户无需提供 ZIP,也不接受用户直接提交的 ZIP。- 图片转 PDF(
IMAGE_TO_PDF/IMAGE_ZIP_TO_PDF):仅支持.png/.jpg/.jpeg/.bmp/.tiff/.tif图片;单图直接上传;多图由 Agent 内部排序、重命名后打包成唯一一个 zip 上传。- Word 转 PDF(
WORD_TO_PDF):仅支持 Word 文档.docx/.doc。- Excel 转 PDF(
EXCEL_TO_PDF):仅支持 Excel 文档.xlsx/.xls。- PPT 转 PDF(
PPT_TO_PDF):仅支持 PPT 演示文稿.pptx/.ppt。- Word 转 Excel(
WORD_TO_EXCEL):仅支持 Word 文档.docx/.doc。- TXT 转 PDF(
TXT_TO_PDF):仅支持文本文件.txt。上传前须校验文件扩展名是否属于上述支持范围,若非支持格式,不得上传,应告知用户对应支持格式并停止本次流程。
⚠️ 文件名长度校验(上传前必须执行):用户提供的每个源文件,其文件名(含扩展名,按 Unicode 字符数计,中文等非 ASCII 字符按 1 个字符计)长度必须 ≤ 100 字符;任一源文件名 > 100 字符 → 向用户提示「您上传的文件名过长」,立即停止后续所有逻辑(不打包、不上传、不创建任务、不轮询),流程结束;该场景不进入 error_handler、不询问是否重试。
- 校验时机:在调用上传接口之前,与格式、大小校验一并进行;合并 PDF / 多图打包场景须对每个参与文件逐一校验,任一超长即整体不通过。
- 校验对象:用户提供的源文件名(各分支一致:PDF / 图片 / Word / Excel / PPT / TXT 源文件);Agent 内部打包生成的 zip 与
index_XX.<原后缀>重命名文件由本 Skill 命名、长度可控,不在本校验范围。
⚠️ ZIP 使用边界(防混淆):
- ZIP 仅用于两类场景:
MERGE_PDF(合并多个 PDF)与多图IMAGE_ZIP_TO_PDF(多张图片转 PDF),且均由 Agent 在内部打包生成,上传给转换接口。- 普通转换(转 Word / Excel / PPT / 图片 / HTML / 压缩 / 拆分 / 去水印)绝不接受 ZIP:若用户在此类场景提供 ZIP,拒绝并请其改为提供单个 PDF。若用户提供的 ZIP 是 PDF 文件本地已打包的多个 PDF 而用户未明确要求「合并」,应向用户说明并引导其改用「合并 PDF」流程。
- 用户侧一律只提供源文件:合并场景提供多个 PDF、图片转 PDF 场景提供图片。ZIP 只是 Agent 内部生成的传输层打包格式,不视为用户提供的源格式,用户也可忽略 ZIP 的存在。
MCP 工具调用
所有 MCP 工具调用均通过 MCP 端点(https://open.pdf365.cn/mcp)发起。
| 工具 | 参数 | 说明 |
|---|---|---|
createConvertTask | (fileUrl, jobType) | 创建任务,返回 data.taskId。fileUrl 必须为上传返回的完整原值(超长且可能含中文,严禁截断、严禁从终端回显复制,建议写入临时文件中转读取后再传)。jobType 根据用户需求传入:"PDF_2_WORD"(转Word)、"PDF_TO_EXCEL"(转Excel)、"PDF_TO_PPT"(转PPT)、"PDF_TO_HTML"(转HTML)、"PDF_TO_JPG"(转JPG)、"PDF_TO_PNG"(转PNG)、"PDF_TO_LONG_PNG"(转长图)、"IMAGE_TO_PDF"(单图转PDF)、"IMAGE_ZIP_TO_PDF"(多图zip转PDF)、"COMPRESS_PDF"(压缩PDF)、"SPLIT_PDF"(拆分PDF)、"PDF_REMOVE_WATERMARK"(去水印)、"MERGE_PDF"(合并PDF)、"WORD_TO_PDF"(Word转PDF)、"EXCEL_TO_PDF"(Excel转PDF)、"PPT_TO_PDF"(PPT转PDF)、"WORD_TO_EXCEL"(Word转Excel)、"TXT_TO_PDF"(TXT转PDF) |
getConvertTaskStatus | (taskId) | 轮询:WAITING/RUNNING 继续;FINISH && success=true 仅表示服务端已结束处理,不代表转换成功,进入下载步骤;其他失败 |
downloadConvertResult | (taskId) | 仅需 taskId。两种结果:① 用户有额度 → 返回 downloadUrl,下载成功;② 用户无额度 → 返回报文中携带支付页链接,提示用户打开链接支付,支付完成后再次调用本工具 |
执行流程
- API Key 检查 读取本技能目录下
skill_key;不存在则引导用户前往 https://www.pdf365.cn/skill_key 创建 Key 并保存到本技能目录 - 上传
POST .../upload(请求头携带X-API-KEY)→ 提取data.fileUrl。合并 PDF 例外:上传的是打包后的 zip,见下方「合并 PDF(MERGE_PDF)」分支。若上传返回 Key 无效/鉴权失败,转 [API_KEY.md](./API_KEY.md) →「Key 无效处理」流程
⚠️
fileUrl必须完整传递,严禁截断(上传后必须执行):上传返回的data.fileUrl为超长字符串且可能含中文/特殊字符,提取后必须原样完整保留,并直接用作后续createConvertTask的参数;禁止从终端回显、日志或工具输出摘要中复制该值(终端可能换行/截断,导致值不完整),建议将完整fileUrl写入临时文件(如fileUrl.txt)中转存储,需要时读取原样使用。任何截断、缺字符或不完整的fileUrl都会导致创建任务或转换失败。⚠️ 上传前必须校验文件名长度(见「上传接口 → 文件名长度校验」):任一源文件名(含扩展名)> 100 字符 → 提示用户「您上传的文件名过长」,停止后续所有逻辑,流程结束(不进入 error_handler、不询问重试)。
⚠️ 上传前必须执行大小校验(见上文「上传接口 → 文件大小校验」):单文件转换校验源文件 < 100MB(预检①);打包 zip 场景校验 zip 实测大小 < 100MB(决定性③)。超限则提醒用户并停止上传与后续一切逻辑。
- 选择转换类型 判断用户需求:
- 若用户要 PDF 转图片,在开始 converting 前必须询问用户选择输出图片格式(仅允许以下三类):
- JPG 格式 →
jobType = "PDF_TO_JPG" - PNG 格式 →
jobType = "PDF_TO_PNG" - 长图(Long PNG)→
jobType = "PDF_TO_LONG_PNG"
- JPG 格式 →
- 若用户要 PDF 转图片,在开始 converting 前必须询问用户选择输出图片格式(仅允许以下三类):
> ⚠️ 不支持其他图片格式,用户未明确选择时须引导其在上述三项中选择
- 若用户要图片转 PDF,执行下方「图片转 PDF」分支
- 若用户要Word 转 PDF,执行下方「Word 转 PDF」分支
- 若用户要Excel 转 PDF,执行下方「Excel 转 PDF(EXCEL_TO_PDF)」分支
- 若用户要PPT 转 PDF,执行下方「PPT 转 PDF(PPT_TO_PDF)」分支
- 若用户要Word 转 Excel,执行下方「Word 转 Excel(WORD_TO_EXCEL)」分支
- 若用户要TXT 转 PDF,执行下方「TXT 转 PDF(TXT_TO_PDF)」分支
- 若用户要PDF 转 HTML,执行下方「PDF 转 HTML(PDF_TO_HTML)」分支
- 若用户要拆分 PDF,执行下方「拆分 PDF(SPLIT_PDF)」分支
- 若用户要去水印,执行下方「去水印(PDF_REMOVE_WATERMARK)」分支
- 若用户要合并 PDF,执行下方「合并 PDF(MERGE_PDF)」分支
- 其它需求直接按步骤 3 以下映射选择
jobType
图片转 PDF:将一张或多张图片合并转换为一个 PDF 文件。
① 确认源图片与格式 收集用户提供的一个或多个图片文件
⚠️ 仅支持以下图片格式:png / jpg / jpeg / bmp / tiff / tif。其他格式(如 gif、webp、heic、svg 等)不支持,须告知用户并提供支持格式范围,请其重新提供
② 区分单图 / 多图,打包 zip:
- 单张图片 →
jobType = "IMAGE_TO_PDF",直接上传该图片 - 多张图片 →
jobType = "IMAGE_ZIP_TO_PDF",需在本地完成以下排序、重命名与打包:- 确认顺序 向用户展示图片列表并请其按希望最终出现在 PDF 中的顺序依次排序;用户可按序号(1、2、3……)指定顺序,或直接按文件名自然顺序
> 用户未指定顺序时,默认按文件名自然顺序排序
- 重命名 根据确认的顺序将每张图片重命名为
index_<序号>.<原图片后缀>,序号从00开始、两位补零递增:排序第 1 张 →index_00.png、第 2 张 →index_01.jpg、第 3 张 →index_02.bmp……依次类推。后缀保留该图片的原始扩展名(如.png/.jpg/.jpeg/.bmp/.tiff/.tif) - 打包 zip 将重命名后的所有图片放入同一目录,打包为单一个
.zip,zip 内保持index_00、index_01……的命名与顺序
⚠️ 重命名仅改变文件名,不影响图片内容与转换后的 PDF 顺序
⚠️ 上传前必须校验大小(见「上传接口 → 文件大小校验」):单张图片 < 100MB(预检①);多图打包 zip 场景校验 zip 实测大小 < 100MB(决定性③);≥100MB 则提醒用户并停止上传与后续逻辑
③ 上传 POST .../upload(携带 X-API-KEY)上传单张图片或 zip → 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "IMAGE_TO_PDF" 或 "IMAGE_ZIP_TO_PDF")
Word 转 PDF(jobType = "WORD_TO_PDF"):将 Word 文档转换为 PDF 文件。
① 确认源文件与格式 收集用户提供的 Word 文档
⚠️ 仅支持以下格式:.docx / .doc。其他格式(如 txt、wps、rtf 等)不支持,须告知用户并提供支持格式范围,请其重新提供
② 上传 POST .../upload(携带 X-API-KEY)上传该 Word 文档。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "WORD_TO_PDF")
Excel 转 PDF(jobType = "EXCEL_TO_PDF"):将 Excel 文档转换为 PDF 文件。
① 确认源文件与格式 收集用户提供的 Excel 文档
⚠️ 仅支持以下格式:.xlsx / .xls。其他格式(如 csv、et 等)不支持,须告知用户并提供支持格式范围,请其重新提供
② 上传 POST .../upload(携带 X-API-KEY)上传该 Excel 文档。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "EXCEL_TO_PDF")
PPT 转 PDF(jobType = "PPT_TO_PDF"):将 PPT 演示文稿转换为 PDF 文件。
① 确认源文件与格式 收集用户提供的 PPT 文档
⚠️ 仅支持以下格式:.pptx / .ppt。其他格式不支持,须告知用户并提供支持格式范围,请其重新提供
② 上传 POST .../upload(携带 X-API-KEY)上传该 PPT 演示文稿。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "PPT_TO_PDF")
Word 转 Excel(jobType = "WORD_TO_EXCEL"):将 Word 文档转换为 Excel 表格文件。
① 确认源文件与格式 收集用户提供的 Word 文档
⚠️ 仅支持以下格式:.docx / .doc。其他格式不支持,须告知用户并提供支持格式范围,请其重新提供
② 上传 POST .../upload(携带 X-API-KEY)上传该 Word 文档。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "WORD_TO_EXCEL")
TXT 转 PDF(jobType = "TXT_TO_PDF"):将文本文件转换为 PDF 文件。
① 确认源文件与格式 收集用户提供的文本文件
⚠️ 仅支持以下格式:.txt。其他格式不支持,须告知用户并提供支持格式范围,请其重新提供
② 上传 POST .../upload(携带 X-API-KEY)上传该文本文件。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "TXT_TO_PDF")
PDF 转 HTML(jobType = "PDF_TO_HTML"):将一个 PDF 文档转换为 HTML 网页文件,下载结果是一个包含 HTML 及关联资源(如 js/css/图片)的 zip 包,解压后得到 HTML 网页。用户只需提供一个 PDF 源文件,直接上传该 PDF,由服务端完成转换:
① 确认源文件与格式 收集用户提供的一个 PDF 文件(.pdf)
⚠️ 仅支持
② 上传 POST .../upload(携带 X-API-KEY)上传该 PDF。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "PDF_TO_HTML")
拆分 PDF(jobType = "SPLIT_PDF"):将一个 PDF 按页拆分成多个文件,输出通常为包含多个拆分后文件的 zip 包。用户只需提供一个 PDF 源文件,直接上传该 PDF,由服务端完成拆分:
① 确认源文件与格式 收集用户提供的一个 PDF 文件(.pdf)
⚠️ 仅支持
② 上传 POST .../upload(携带 X-API-KEY)上传该 PDF。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "SPLIT_PDF")
去水印(jobType = "PDF_REMOVE_WATERMARK"):从 PDF 中移除水印。用户只需提供一个 PDF 源文件,直接上传该 PDF,由服务端完成去水印:
① 确认源文件与格式 收集用户提供的一个 PDF 文件(.pdf)
⚠️ 仅支持
② 上传 POST .../upload(携带 X-API-KEY)上传该 PDF。上传前校验大小 < 100MB,≥100MB 则提醒用户压缩后再试并停止本次上传(见「上传接口 → 文件大小校验」)→ 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "PDF_REMOVE_WATERMARK")
合并 PDF(jobType = "MERGE_PDF"):合并是多文件操作,与其它单文件转换流程不同。用户只需提供多个 PDF 源文件,本 Skill 在内部完成文件的重命名、排序与打包成 zip,再上传:
① 确认源文件与顺序 收集用户提供的两个及以上 PDF 文件(.pdf,单源文件 < 100MB,预检①;多源合计与最终能否上传以 zip 实测为准,见「文件大小校验」),向用户展示文件列表并请其按希望合并的顺序依次排序;用户可按序号(1、2、3……)指定顺序,或直接按文件名自然顺序
⚠️ 用户未指定顺序时,默认按文件名自然顺序排序。若用户只提供一个 PDF,则无需合并,直接提示用户无需合并
② 重命名 根据确认的顺序将每个 PDF 重命名为 index_<序号>.pdf,序号从 00 开始、两位补零递增:第 1 个 → index_00.pdf、第 2 个 → index_01.pdf、第 3 个 → index_02.pdf……依次类推
⚠️ 重命名仅改变文件名,不影响文件内容与合并后的 PDF 顺序
③ 打包 zip(Agent 内部完成)将重命名后的所有 PDF 放入同一目录,打包为单一个 .zip,zip 内保持 index_00、index_01……的命名与顺序
⚠️ 该 zip 由 Agent 内部生成,仅供
MERGE_PDF上传使用;用户无需也不应提供 ZIP。上传的必须是这一个 zip 包,一次性调用createConvertTask,不要对每个 PDF 分别创建任务⚠️ 上传前必须校验大小(见「上传接口 → 文件大小校验」):多源合计为预检②,最终校验 zip 实测大小 < 100MB(决定性③)。≥100MB 则提醒用户拆分合并、分批处理或先压缩后再合并,并停止上传与后续逻辑
④ 上传 zip POST .../upload(携带 X-API-KEY)上传 Agent 打包生成的该 zip → 提取 data.fileUrl,继续执行步骤 3(创建任务,jobType = "MERGE_PDF")
- 创建任务 根据所选
jobType,调用createConvertTask(fileUrl, jobType)→ 提取data.taskId
⚠️
fileUrl必须原样完整传递(见步骤 1):传入createConvertTask的必须是步骤 1 提取的完整fileUrl,不得截断、不得从终端回显/日志复制;建议写入临时文件中转读取。
- PDF 转 Word →
jobType = "PDF_2_WORD" - PDF 转 Excel →
jobType = "PDF_TO_EXCEL" - PDF 转 PPT →
jobType = "PDF_TO_PPT" - PDF 转 JPG →
jobType = "PDF_TO_JPG" - PDF 转 PNG →
jobType = "PDF_TO_PNG" - PDF 转长图 →
jobType = "PDF_TO_LONG_PNG" - 压缩 PDF →
jobType = "COMPRESS_PDF" - 拆分 PDF →
jobType = "SPLIT_PDF"(走上方「拆分 PDF(SPLIT_PDF)」分支) - 去水印 →
jobType = "PDF_REMOVE_WATERMARK"(走上方「去水印(PDF_REMOVE_WATERMARK)」分支) - 合并 PDF →
jobType = "MERGE_PDF"(走上方「合并 PDF(MERGE_PDF)」分支) - 图片转 PDF →
jobType = "IMAGE_TO_PDF"(单图)或"IMAGE_ZIP_TO_PDF"(多图,走上方「图片转 PDF」分支) - Word 转 PDF →
jobType = "WORD_TO_PDF"(走上方「Word 转 PDF」分支) - Excel 转 PDF →
jobType = "EXCEL_TO_PDF"(走上方「Excel 转 PDF(EXCEL_TO_PDF)」分支) - PPT 转 PDF →
jobType = "PPT_TO_PDF"(走上方「PPT 转 PDF(PPT_TO_PDF)」分支) - Word 转 Excel →
jobType = "WORD_TO_EXCEL"(走上方「Word 转 Excel(WORD_TO_EXCEL)」分支) - TXT 转 PDF →
jobType = "TXT_TO_PDF"(走上方「TXT 转 PDF(TXT_TO_PDF)」分支) - PDF 转 HTML →
jobType = "PDF_TO_HTML"(走上方「PDF 转 HTML(PDF_TO_HTML)」分支)
- 轮询
getConvertTaskStatus(taskId)直到state=FINISH && success=true(间隔 3000ms,最多重试 60 次,60次后视为失败)
⚠️
FINISH && success=true仅为中间状态,不代表转换成功:实测空 PDF、伪造 PDF(如 xls 改名 .pdf)、损坏 PDF、加密 PDF 等,轮询阶段均可能返回FINISH && success=true,但到下载阶段才返回MCP_CONVERT_UPSTREAM_FAILED。因此不得在轮询成功时向用户宣称成功,必须继续执行步骤 5,最终成败以下载结果为准。⚠️ 加密 PDF 可能长期卡
WAITING:若轮询长时间停留在WAITING(超过约 60 次重试仍未进入RUNNING/FINISH),不要无限等待,应主动告知用户:源文件可能为加密/受保护 PDF,服务端无法转换,建议更换未加密 PDF 后重试,并询问是否继续等待或重试。
- 下载结果
downloadConvertResult(taskId)(仅传taskId),根据返回结果分两种情况:- 情况一:用户有额度 → 接口返回
downloadUrl,进入步骤 7 - 情况二:用户无额度 → 接口返回报文中携带支付页链接,进入步骤 6
- 情况一:用户有额度 → 接口返回
⚠️ 最终成败以下载结果为准:
downloadConvertResult返回downloadUrl才算成功;若返回MCP_CONVERT_UPSTREAM_FAILED等失败码,说明源文件无法转换(空/伪造/损坏/加密等),不得宣称成功,应告知用户原因并询问是否更换文件重试。
- 引导支付 从返回报文中提取支付页链接,提示用户打开该链接完成支付;等待用户告知支付完成后,再次调用
downloadConvertResult(taskId)进行下载:- 下载成功(返回
downloadUrl)→ 进入步骤 7 - 仍提示无额度 → 重复本步骤,直到下载成功
- 下载成功(返回
- 返回文件 获取到
downloadUrl后,执行以下两个动作,并在最终回复中同时输出两项内容,缺一不可:
⚠️ 批量任务同样适用:用户一次上传多个文件执行任务时,须逐个调用
downloadConvertResult(taskId)下载每个任务的结果,并在最终回复中逐项列出每个文件的「下载链接」和「本地保存绝对路径」(按源文件逐一对应),不得只报批量转换成功而遗漏任何一项的链接与路径。
- ① 下载链接:将
downloadUrl完整展示给用户 - ② 本地保存路径:将文件下载到原 PDF 文件所在目录,根据转换类型命名:
> ⚠️ 同名覆盖保护(所有场景统一适用):下载保存前,须检查目标目录中是否已存在同名目标文件。若已存在,不得直接覆盖,按以下策略处理:> ① 先征得用户二次确认:明确告知用户目标文件已存在,询问是否覆盖;> ② 用户确认覆盖 → 直接覆盖已有文件;> ③ 用户拒绝覆盖 → 禁止覆盖,先提示用户指定新命名;> ④ 用户指定新命名 → 按用户指定命名保存;> ⑤ 用户拒绝指定命名(或未提供新名字)→ 由 Agent 自动生成新文件名保存(在目标文件名后追加序号,如 报告_v2.docx、报告_v3.pdf,序号递增直至不冲突)。> 该规则适用于所有转换场景(PDF转Word/Excel/PPT/图片/HTML、压缩、拆分、合并、图片转PDF、Word/Excel/PPT转PDF、Word转Excel、TXT转PDF 等);去水印场景的专门规则见下方(目标文件名与源文件相同时同样遵循本保护)。
- PDF 转 Word:原文件名去掉
.pdf+.docx(如报告.docx) - PDF 转 Excel:原文件名去掉
.pdf+.xlsx(如报告.xlsx) - PDF 转 PPT:原文件名去掉
.pdf+.pptx(如报告.pptx) - PDF 转 JPG:原文件名去掉
.pdf+_jpg.zip(如报告_jpg.zip) - PDF 转 PNG:原文件名去掉
.pdf+_png.zip(如报告_png.zip) - PDF 转长图:原文件名去掉
.pdf+_long.png(如报告_long.png) - 压缩 PDF:原文件名去掉
.pdf+_compressed.pdf(如报告_compressed.pdf) - 拆分 PDF:下载结果为拆分后的打包 zip(内含多个按页拆分的文件),保存为
原文件名去掉 .pdf + _split.zip(如报告_split.zip),或用户指定命名 - 去水印:下载结果为去除水印后的 PDF,保存为
原文件名去掉 .pdf + _nowatermark.pdf(如报告_nowatermark.pdf),下载到原 PDF 文件所在目录,或用户指定命名;若原文件名已以_nowatermark.pdf结尾(此时目标文件名与源文件相同),直接覆盖原文件属于不可逆操作,必须先征得用户二次确认:① 用户确认覆盖 → 保持原文件名不变,直接覆盖源文件;② 用户拒绝覆盖 → 禁止覆盖原文件,先提示用户指定新命名;③ 用户指定新命名 → 按用户指定命名保存;④ 用户拒绝指定命名(或未提供新名字)→ 由 Agent 自动生成新文件名保存(如原文件名去掉 .pdf + _nowatermark_v2.pdf,如报告_nowatermark_v2.pdf) - 合并 PDF:下载结果为一个合并后的 PDF(内含多个 PDF),保存为
合并_<日期>.pdf(如合并_20260807.pdf,日期格式 YYYYMMDD),或用户指定命名 - 图片转 PDF:下载结果为合并后的 PDF,保存到图片所在目录,命名为
图片转PDF_<日期>.pdf(如图片转PDF_20260807.pdf,日期格式 YYYYMMDD),多图时可用转换结果_<日期>.pdf,或用户指定命名 - Word 转 PDF:原文件名去掉
.docx/.doc+.pdf(如报告.docx→报告.pdf),下载到原 Word 文件所在目录 - Excel 转 PDF:原文件名去掉
.xlsx/.xls+.pdf(如报表.xlsx→报表.pdf),下载到原 Excel 文件所在目录 - PPT 转 PDF:原文件名去掉
.pptx/.ppt+.pdf(如演示.pptx→演示.pdf),下载到原 PPT 文件所在目录 - Word 转 Excel:原文件名去掉
.docx/.doc+.xlsx(如文档.docx→文档.xlsx),下载到原 Word 文件所在目录 - TXT 转 PDF:原文件名去掉
.txt+.pdf(如笔记.txt→笔记.pdf),下载到原文本文件所在目录 - PDF 转 HTML:下载结果为转换后的打包 zip(内含 HTML 及关联的 js/css/图片等资源),保存为
原文件名去掉 .pdf + _html.zip(如报告_html.zip),或用户指定命名
并在回复中展示本地保存的绝对路径(如 C:UsersxxxDesktop报告.pdf)
⚠️ 最终回复必须同时包含「下载链接」和「本地保存绝对路径」两项,不得只输出其中一项。
⚠️ 批量任务须逐项对账:最终回复中链接与路径的条数应与本次成功完成的任务数一致,逐一对应、不漏不合并;仅报告「全部转换成功」而不给出每项的「下载链接 + 本地保存绝对路径」视为未完成步骤 7。
⚠️ 无额度场景下,必须在用户确认支付完成后再次调用
downloadConvertResult(taskId)获取最终下载地址;downloadConvertResult始终只传taskId,不需要订单号等额外参数。⚠️ 步骤 7 中「下载到本地文件目录」为必执行步骤:例如原文件为
~/Desktop/报告.pdf,PDF转Word保存为~/Desktop/报告.docx,PDF转PPT保存为~/Desktop/报告.pptx,压缩PDF保存为~/Desktop/报告_compressed.pdf;图片转PDF则下载到原图片所在目录,Word转PDF则下载到原Word文件所在目录,保存为同名
无额度支付引导
downloadConvertResult(taskId) 在用户无额度时,返回报文中会携带支付页链接,关键字段:
| 字段 | 说明 |
|---|---|
| 支付页链接 | 提示用户在浏览器中打开该链接完成支付(具体字段名以接口实际返回为准) |
异常处理
| 场景 | 处理 |
|---|---|
用户提供非支持格式文件(PDF 转换类非 .pdf;图片转 PDF 非 .png/.jpg/.jpeg/.bmp/.tiff/.tif;Word 转 PDF 非 .docx/.doc;Excel 转 PDF 非 .xlsx/.xls;PPT 转 PDF 非 .pptx/.ppt;Word 转 Excel 非 .docx/.doc;TXT 转 PDF 非 .txt) | 告知对应支持格式范围,不发起上传,请用户重新提供支持格式的文件 |
| 任一源文件名(含扩展名)长度 > 100 字符 | 提示「您上传的文件名过长」,立即停止后续所有逻辑并结束流程(不打包、不上传、不创建任务、不轮询;不进入 error_handler、不询问重试) |
fileUrl 不完整/被截断(常见于从终端回显或日志复制) | 停止当前任务:从上传响应中重新提取完整 fileUrl(建议写入临时文件读取后原样使用),重新调用 createConvertTask;不得凭印象补全或简写 |
| 批量任务(多条任务)完成后仅报成功、未逐一列出链接与路径 | 须逐项补全:对每个已完成任务逐条列出「下载链接」与「本地保存绝对路径」,条数与成功任务数一致;遗漏即补齐后重新输出完整清单 |
转换失败(success=false 或失败状态) | 告知用户失败原因,询问是否重试;同意则重新上传转换,拒绝则结束 |
轮询返回 FINISH && success=true 但下载返回 MCP_CONVERT_UPSTREAM_FAILED | 说明源文件无法转换(空/伪造/损坏/加密 PDF 等)。不得宣称成功,告知用户源文件可能无效,请更换有效 PDF 后重试 |
downloadConvertResult 返回 MCP_CONVERT_UPSTREAM_FAILED(下载阶段失败) | 源文件无法转换(空/伪造/损坏/加密等)。不得宣称成功,告知用户失败原因并询问是否更换文件重试;同意则回到 ask_upload 重新上传,拒绝则结束 |
鉴权失败:code=30001(无 Key) | 未携带有效 API Key,按 [API_KEY.md](./API_KEY.md) →「Key 无效处理」引导用户提供/更新 Key 后重试 |
鉴权失败:code=30002(msg="MCP AK不存在",无效 Key) | Key 无效,按 [API_KEY.md](./API_KEY.md) →「Key 无效处理」流程:停止 → 引导重新获取 → 更新本地与 MCP 两处 → 重载 MCP → 从上传重新开始 |
| 用户支付后仍返回无额度 | 提示用户确认支付是否成功,确认后再次调用 downloadConvertResult(taskId) |
| 用户拒绝支付 | error_handler,询问重试 |
| 目标目录已存在同名目标文件(任意转换场景) | 不得直接覆盖,先征得用户二次确认:确认 → 直接覆盖;拒绝覆盖 → 禁止覆盖,提示用户指定新命名;用户指定命名 → 按指定命名保存;用户拒绝指定命名 → 由 Agent 自动生成新文件名保存(目标文件名后追加序号,如 报告_v2.docx,序号递增直至不冲突) |
去水印目标文件名与源文件名相同(源文件已以 _nowatermark.pdf 结尾) | 直接覆盖原文件为不可逆操作,须先等待用户二次确认:确认 → 保持原文件名直接覆盖;拒绝覆盖 → 不覆盖原文件,提示用户指定新命名;用户指定命名 → 按指定命名保存;用户拒绝指定命名 → 由 Agent 自动生成新文件名保存(如 原文件名去掉 .pdf + _nowatermark_v2.pdf) |
MCP 配置
📌 完整 MCP 配置说明在文件 [MCP.md](./MCP.md)中,请阅读该文件获取全部细节。
本 Skill 依赖必需 MCP Server foxit-pdf365-mcp-server。MCP 配置与调用包含三部分,均见 MCP.md:
- 客户端配置示例:VS Code / qclaw / WorkBuddy / Claude Code / Codex / OpenCode / Cursor 的
json配置片段。 - 调用模式:优先调用已配置的 MCP 工具;未配置时先自动配置,自动配置失败才启用 curl 兜底。
- curl 兜底流程:初始化会话获取
Mcp-Session-Id→ 初始化通知 →tools/list查看 schema →tools/call调用工具。
⚠️ 自动配置 MCP 时,应将 当前 Skill 目录内的
skill_key中的完整 Key(含PDF365-MCP-前缀)原样填入headers["X-API-KEY"],不得截断或去除前缀。