dify工作流中需用代码节点归一化markdown(统一换行、缩进)、jinja模板条件渲染控制内容、http请求传参时启用preserve_html并指定中文字体名及pt单位,确保docx准确还原表格、代码块和标题层级。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中处理含表格、代码块、多级标题和嵌套列表的复杂Markdown文本时,直接传递给下游节点常导致渲染错乱、结构丢失或插件解析失败。这是因为多数Dify内置节点(如HTTP请求、代码执行)默认将Markdown当作纯字符串处理,不触发语法解析;而部分插件(如DOC-Dify-Plugin)虽支持Markdown,但对非标准缩进、混合HTML标签或未闭合的代码块极其敏感。
用Jinja模板预清洗并标准化结构
第一步:在LLM输出后插入「代码节点」,使用Python对原始Markdown做轻量级归一化处理。
第二步:粘贴以下清洗逻辑(适配中文环境,兼容WPS/Office对空行与缩进的解析要求):
```python
import re
def clean_markdown(md: str) -> str:
# 强制统一换行符为\n,避免
\n混杂导致解析器截断
md = md.replace('\r\n', '\n').replace('\r', '\n')
# 清除开头结尾多余空行,但保留段落间单空行
md = re.sub(r'^\n+|\n+$', '', md)
# 合并连续多个空行 → 只留一个
md = re.sub(r'\n{3,}', '\n\n', md)
# 修正无序列表缩进:把4空格/1个tab统一转为2空格(DOC-Dify-Plugin推荐)
md = re.sub(r'^ {4}([*-+]) ', r' \1 ', md, flags=re.MULTILINE)
md = re.sub(r'^\t([*-+]) ', r' \1 ', md, flags=re.MULTILINE)
return md.strip()
result = clean_markdown(llm_output)
```
第三步:将变量名设为cleaned_md,供后续节点调用。这一步必须做——【未清洗的原始Markdown在调用DOC-Dify-Plugin时,90%概率因缩进不一致导致表格列错位或列表塌陷】。
用Jinja条件渲染动态控制内容呈现
当LLM输出可能含敏感字段(如“内部机密”“待确认”)或需按角色过滤内容时,不能依赖后端再处理,必须在Dify工作流内完成结构裁剪。
方法一:在「文本拼接」节点中写Jinja模板,实现字段级开关
{% if metadata.confidential == false %}{{ content }}{% endif %}
方法二:对多段落内容做安全包裹,防止未闭合HTML污染DOCX生成
{% for para in content.split('\n') %}
{{ para | escape }}
{% endfor %}注意:escape过滤器会自动转义、&等字符,避免Markdown中混入的
WiseOCR — 将 PDF 或图片文件转换为高质量 Markdown 文本,支持表格完整识别、多栏版式还原、中英文混排。适用场景:扫描件文字提取、纸质文档数字化、合同/报告/论文转文本、图片中文字提取。支持格式:PDF、JPG、JPEG、PNG、WEBP、GIF、BMP、TIFF。触发:用户上传文件并要求"帮我识别这个文件的文字"、"PDF转文字"、"图片转文本"、"帮我提取这个表格"——会调用本技能。说"用Wi
向DOC-Dify-Plugin传递带样式的Markdown
第一步:确认你的插件已升级至中文适配版(stvlynn/DOC-Dify-Plugin@zh-fix),旧版不识别class="warning"等语义类名。
第二步:在HTTP请求节点中,Body选择JSON格式,填入:
{ "markdown": "{{ cleaned_md }}", "options": { "font": "FangSong", "heading_level_1_size": 22, "preserve_html": true } }
第三步:关键配置项说明:
• preserve_html设为true——否则<div class="note">这类自定义容器会被直接丢弃;<p>• 字体名必须用中文字体全称(如"FangSong"而非"仿宋"),<strong>【WPS和Office对字体名大小写与空格极其敏感,填错会导致全文默认用Calibri,中文显示为方块】</strong>;</p>
<p>• heading_level_1_size单位是Pt,不是px,不是pt,不是磅——必须是整数Pt值。</p>
<h2>验证DOCX输出是否保留原始结构</h2>
<p>步骤一:在工作流末尾添加「HTTP请求」节点,目标URL填入你部署的Word服务地址(如http://word-service:5001/gen_doc)</p>
<p>步骤二:Body选raw → JSON,内容为:</p>
<p>{ "title": "{{ metadata.title }}", "content": "{{ cleaned_md }}" }</p>
<p>步骤三:检查返回响应中的下载链接是否可访问;若返回404,立即进入容器挂载目录查看<code>/app/word/temp/下是否有生成文件
步骤四:用WPS打开生成的DOCX,重点检查三点:表格边框是否完整、代码块是否带灰色底纹、二级标题是否比一级标题小两号字——任一缺失,说明Jinja清洗或插件选项配置有误。









