使用Jinja2&Flask生成Word文档:如何去除HTML标签并保留格式?
解决方案:将HTML格式文本转换为Word富文本(无HTML标签)
完全可行,核心思路是不要直接将HTML字符串传入Word模板,而是先解析HTML标签,将其转换为Word文档原生支持的富文本格式后再填充模板。以下是针对你的Flask+python-docx-template场景的具体实现步骤:
1. 安装依赖库
确保你已安装必要的工具库:
pip install python-docx-template beautifulsoup4
2. 编写HTML转Word富文本的过滤器
在Flask应用中定义一个Jinja2过滤器,用于解析HTML标签并生成RichText对象(python-docx-template支持的富文本格式):
from bs4 import BeautifulSoup from docxtpl import RichText from flask import Flask app = Flask(__name__) def html_to_rich_text(html_str): soup = BeautifulSoup(html_str, "html.parser") rt = RichText() # 递归处理HTML元素,支持嵌套格式 def process_node(node, bold=False, italic=False): if node.name == "b": for child in node.children: process_node(child, bold=True, italic=italic) elif node.name == "i": for child in node.children: process_node(child, bold=bold, italic=True) elif node.name == "li": # 添加项目符号 rt.add("• ", bold=bold, italic=italic) for child in node.children: process_node(child, bold=bold, italic=italic) rt.add("\n") elif node.name in ("ul", "ol"): # 遍历列表子元素,跳过列表容器本身 for child in node.children: process_node(child, bold=bold, italic=italic) elif isinstance(node, str): # 处理纯文本节点,跳过空内容 text = node.strip() if text: rt.add(text, bold=bold, italic=italic) process_node(soup) return rt # 注册Jinja2过滤器 app.jinja_env.filters["html_to_rt"] = html_to_rich_text
3. 修改Word模板中的变量引用
在你的Word模板文件中,将原本直接引用变量的语法:
{{ form_content }}
替换为使用过滤器的语法:
{{ form_content|html_to_rt }}
4. 保持原表单流程不变
你的现有表单提交、Flask路由接收变量的逻辑无需修改——只要确保传递给模板的是原始HTML字符串即可,过滤器会自动完成格式转换。
这个方案支持你需要的加粗、斜体、无序列表格式,同时完全去除HTML标签。如果后续需要扩展其他格式(如有序列表、下划线),只需在process_node函数中添加对应标签的处理逻辑即可。
内容的提问来源于stack exchange,提问作者OtterVonBismarck
相关产品推荐
相关产品推荐

