Python-docx 深入word源码 自定义字符间距

代码和实现效果

python 复制代码
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.shared import Pt


# 调整pt设置字间距
def SetParagraphCharSpaceByPt(run, pt=1):
    '''
    通过修改word源码方式, 添加w:spacing标签
    直接通过调整pt来设置字符间距
    '''
    # 获取或创建<w:rPr>元素
    rPr = run._element.find(qn('w:rPr'))
    if rPr is None:
        rPr = OxmlElement('w:rPr')
        run._element.insert(0, rPr)

    # 创建<w:spacing>元素
    spaceChar = OxmlElement('w:spacing')
    spaceChar.set(qn('w:val'), str(pt * 20))

    # 添加<w:spacing>到<w:rPr>
    rPr.append(spaceChar)


def AddParagraph(doc, text):
    p = doc.add_paragraph()
    run = p.add_run(text)
    return p, run


doc = Document()
p, run = AddParagraph(doc, text='这是一个段落')
SetParagraphCharSpaceByPt(run=run, pt=3)
doc.save('test.docx')

原理和代码思路

通过解压的方式打开一个已经提前设置好字符间距的word文档,在word/document.xml可以看到具体关于字符间距设置的XML标签代码

xml 复制代码
<w:p>
    <w:r>
        <w:rPr>
            <w:rFonts w:ascii="黑体" w:hAnsi="黑体" w:eastAsia="黑体"/>
            <w:b w:val="0"/>
            <w:i w:val="0"/>
            <w:sz w:val="32"/>
            <w:spacing w:val="150.0"/>
        </w:rPr>
        <w:t>这是一个段落</w:t>
    </w:r>
</w:p>
  1. <w:p>表示word:paragraph
  2. <w:r>表示word:run
  3. <w:t>表示word:text,定义段落的文本内容;
  4. <w:rPr>表示word:runProperty,而在<w:rPr>标签下的是各类属性标签,其中<w:spacing>为字符间距,这是需要coding为我们自定义的标签。而上述示例Python代码也在对这个标签进行创建并赋值;
  5. <w:spacing>标签中的属性w:val代表字符间距大小,其值等于pt(磅) * 20
相关推荐
kuuailetianzi5 分钟前
第3篇:《变量、数据类型与基本运算》
python
白远山22 分钟前
24小时自助健身房系统开发实战:从需求分析到完整指南
java·开发语言·数据库·数据挖掘·需求分析
正经教主1 小时前
【FDE系列】阶段2:Day 28:FastAPI 入门 — 把你的函数变成 API 服务
人工智能·python·fde
李航19831 小时前
用 DeepDraw 几何引擎开发建筑设计软件(十):推挤工具
python·3d
VXbishe2 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
名字还没想好☜2 小时前
Python sqlite3 实战:事务提交、参数化防注入、WAL 并发与 row_factory 取字典
后端·python·编程语言
shmily麻瓜小菜鸡2 小时前
TDD(测试驱动开发)详解
开发语言·javascript·typescript·node.js·ecmascript
论文复现现场3 小时前
ComfyUI 怎么同时调用 4 张/8 张 RTX 4090?AI 视频批量生成的多实例队列与 Python 调度方案
人工智能·python·comfyui·rtx4090
泡海椒3 小时前
评分系统最佳实践:JQuick-Java实现权重、阈值动态配置评分
java·人工智能·python
三克的油3 小时前
java-学习1
java·开发语言·学习