Python Docx修改w:cs字体名及字体编码转Unicode技术问询
关于Hacked Font转Unicode字体的Python Docx问题解答
1. 哪些Unicode范围属于「复杂脚本」?是否有相关文档?
复杂脚本指需要上下文字形变换、连写组合、双向排版、元音附标组合等特殊排版处理的书写系统,典型覆盖范围包括:
- 东南亚脚本:缅甸语(U+1000-U+109F)、泰语(U+0E00-U+0E7F)、高棉语(U+1780-U+17FF)
- 中东/中亚脚本:阿拉伯语(U+0600-U+06FF)、希伯来语(U+0590-U+05FF)
- 南亚脚本:天城文(印地语等,U+0900-U+097F)、泰米尔文(U+0B80-U+0BFF)、孟加拉文(U+0980-U+09FF)
- 其他:蒙古文(U+1800-U+18AF)、藏文(U+0F00-U+0FFF)等
相关标准依据:
- Unicode核心标准的「Chapter 2: Scripts」章节,明确各脚本分类与特性
- Unicode字符数据库(UCD)的
Script属性,可通过字符属性判断所属脚本类型 - OpenType规范中的script tags定义,对应各复杂脚本的排版规则
2. Python Docx能否修改或移除w:cs值?
Python-docx高层API未直接提供修改w:cs(复杂脚本字体)的方法,但可通过操作底层XML元素实现需求:
修改w:cs值
from docx import Document doc = Document("input.docx") unicode_font = "Myanmar Unicode Font" for para in doc.paragraphs: for run in para.runs: # 获取run的字体设置XML节点 r_fonts = run._element.rPr.rFonts # 存在w:cs则修改值,不存在则创建节点 cs_elem = r_fonts.find("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}cs") if cs_elem: cs_elem.val = unicode_font else: new_cs = r_fonts.add_child(r_fonts._element_factory("cs")) new_cs.val = unicode_font doc.save("output.docx")
移除w:cs值
from docx import Document doc = Document("input.docx") for para in doc.paragraphs: for run in para.runs: try: r_fonts = run._element.rPr.rFonts cs_elem = r_fonts.find("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}cs") if cs_elem: r_fonts.remove(cs_elem) except AttributeError: # 无rPr或rFonts节点时跳过 continue doc.save("output.docx")
3. 如何通过Python Docx更新fonts.xml和style.xml,使新Unicode字体出现在Word字体列表中?
Python-docx无高层API处理字体注册,但可通过操作文档XML部件完成:
1. 更新fonts.xml(注册新字体)
from docx import Document doc = Document("input.docx") unicode_font = "Myanmar Unicode Font" # 获取fonts.xml部件 fonts_part = doc.part.fonts_part fonts_root = fonts_part._element # 添加新字体定义节点 font_node = fonts_root.add_child(fonts_root._element_factory("font")) name_node = font_node.add_child(fonts_root._element_factory("name")) name_node.val = unicode_font # 保存修改 fonts_part._element = fonts_root doc.save("output.docx")
2. 更新style.xml(替换样式中的旧字体)
from docx import Document doc = Document("input.docx") unicode_font = "Myanmar Unicode Font" # 获取styles.xml部件 styles_part = doc.part.styles_part styles_root = styles_part._element # 遍历所有样式中的字体设置节点 for r_fonts in styles_root.findall(".//{http://schemas.openxmlformats.org/wordprocessingml/2006/main}rFonts"): # 批量修改ascii、hAnsi、cs字体值 for tag in ["ascii", "hAnsi", "cs"]: elem = r_fonts.find(f"{{http://schemas.openxmlformats.org/wordprocessingml/2006/main}}{tag}") if elem: elem.val = unicode_font # 保存修改 styles_part._element = styles_root doc.save("output.docx")
注意:Word存在字体列表缓存,修改后可能需要重启Word才能看到新字体显示在列表中。
内容的提问来源于stack exchange,提问作者Sven Oly
相关产品推荐
相关产品推荐

