dify可通过自定义工具链实现pdf/markdown/word转epub/mobi,需部署calibre封装的http服务,配置openapi规范的ebookconverter工具,并构建含文本提取、章节识别与条件路由的处理流程。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把PDF、Markdown、Word等不同格式的文档统一转成EPUB或MOBI电子书,还要自动提取目录、保留样式、支持中文分章——Dify本身不内置电子书生成能力,但能用自定义工具链把这件事跑通。
准备可调用的电子书转换服务
先部署一个轻量级后端服务,接收原始文件并返回转换后的EPUB二进制流。推荐用Calibre的命令行工具(ebook-convert)封装成HTTP接口,Docker一键启动即可:docker run -d -p 8000:8000 -v $(pwd)/calibre:/calibre calibre-web:latest。该服务必须支持POST /convert,携带file字段和output_format=epub参数。
测试接口是否可用:用curl上传一个test.md,检查响应头Content-Type: application/epub+zip是否存在。如果返回HTML页面或404,说明服务没正确挂载API路由,需修改容器内Nginx配置或替换为Flask简易服务。
在Dify中创建自定义工具
登录Dify控制台 → 进入「Agent」→「Tools」→「+ Add Tool」→ 选择「HTTP API」类型。
填写基础信息:Tool Name填“EbookConverter”,Description写“将PDF/MD/DOCX转为EPUB,自动识别章节标题”。
在API Schema中粘贴OpenAPI 3.0 JSON描述,关键字段必须包含:file(type: string, format: binary)、output_format(enum: ["epub", "mobi"])、title(可选,用于封面生成)。【file字段必须声明format: binary,否则Dify上传时会把文件内容当纯文本发送,导致Calibre解析失败】
Authentication选“No Auth”,URL填http://host.docker.internal:8000/convert(本地调试用)或你的公网服务地址。保存后触发一次测试请求,确认返回状态码200且Body是二进制EPUB数据。
构建带格式识别的处理流程
方法一:用Dify工作流串联预处理与转换
第一步:添加「Text Extractor」工具,从上传的PDF/DOCX中提取纯文本,并标记原始格式类型(通过文件扩展名判断)。
第二步:接一个「LLM Node」,提示词明确要求:“分析输入文本结构,找出所有符合‘第X章’‘## 第一节’‘CHAPTER ONE’模式的标题行,输出JSON数组,每个对象含level(1-3)、text、start_line。若无明显章节结构,返回空数组。”
第三步:用「Condition Router」判断JSON数组长度是否≥3,是则启用「EbookConverter」并传入toc_auto: false参数;否则跳过目录生成,直接转换。
方法二:绕过Dify内置节点,用Python函数工具统一处理
在自定义工具里写一段Python代码:先用python-docx/pypdf2/Markdown解析库读取原始文件,用正则匹配中文章节(如“第[一二三四五六七八九十]+[章节卷]”),再调用Calibre命令行本地生成EPUB,最后base64编码返回。这样能避免Dify对二进制文件的多次序列化损耗。
注意:此方法需在Dify服务器上安装对应Python依赖,且工具执行超时时间要设为120秒以上——PDF转EPUB常因图片重采样卡住。
配置Agent响应逻辑
新建Agent,Model选GLM-4或Qwen2.5-72B(长文本理解更强),关闭「Enable retrieval」——电子书转换不依赖知识库。
在Prompt中写死约束:“你只能回答两类内容:① 当用户上传文件时,立即调用EbookConverter工具,不加任何解释;② 当用户问‘怎么用’‘支持什么格式’时,列出PDF/DOCX/MD三种,强调不支持扫描版PDF。”
上传测试文件后,观察调试面板里的Tool Call日志:若出现"file": "data:application/pdf;base64,..."且后续返回content_type: "application/epub+zip",说明链路已通。








