Python将word文档内容替换为手写

一、背景

在特定场景下,文件可是复印或者打印,但是内容需要为手写

现使用Python将word文档内容转换为手写字体

示例文档如下:

Python将word文档内容替换为手写_Word文档

二、准备

使用Python第三方库docx进行处理,先安装

pip install python-docx

下载安装手写字体,字体决定了最终文本的手写逼真效果

这里下载安装了两个手写字体:杨任东竹石体-Light, 杨任东竹石体-Regular

三、代码

复制文本内容

遍历文档的段落,复制文本块(runs)

import copy
from docx import Document


def text_2_handwriting(document):
    """
    替换word文档中的文本内容
    """
    for p in document.paragraphs:  # 遍历段落
        # 深度复制段落中的文本块
        temp_runs = copy.deepcopy(p.runs)
        # 清空段落内容
        p.clear()
        for r in temp_runs:  # 遍历复制的文本块
            for t in r.text:  # 遍历文本块中的文本内容
                new_run = p.add_run(t)  # 将文本内容添加到新文本块中

设置随机字体

import random
from docx.shared import Pt


def set_random_font(run):
    """
    设置文本块的随机字体
    """
    font_path_list = ['杨任东竹石体-Light', '杨任东竹石体-Regular']  # 字体路径
    run.font.name = random.choice(font_path_list)  # 随机字体(只对英文生效)
    run.font.size = Pt(random.choice([14, 16, 15]))  # 随机字号
    run.bold = random.choice([True, False])  # 随机加粗

在text_2_handwriting方法中,将文本内容添加到新文本块中时调用set_random_font方法即可

new_run = p.add_run(t)  # 将文本内容添加到新文本块中
set_random_font(new_run)  # 设置随机字体

创建document对象,指定源doc文件路径

if __name__ == "__main__":
    file_path = 'C:\\Users\\Administrator\\Desktop\\test_dir\\读后感.docx'
    doc = Document(file_path)  # 创建document对象
    text_2_handwriting(doc)  # 转换为手写体
    doc.save('modified.docx')  # 保存word文档

运行结果:

Python将word文档内容替换为手写_Word文档_02

中文设置失败

从上面运行结果可以看到,英文字体更改成功,可时中文字体只更改到了字号号和粗细

在设置随机字体方法set_random_font添加下面的代码即可解决

from docx.oxml.ns import qn


run.element.rPr.rFonts.set(qn('w:eastAsia'), random.choice(font_path_list))  # 修改中文字体

完整代码

import copy
import random
from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt


def text_2_handwriting(document):
    """
    替换word文档中的文本内容
    """
    for p in document.paragraphs:  # 遍历段落
        # 深度复制段落中的文本块
        temp_runs = copy.deepcopy(p.runs)
        # 清空段落内容
        p.clear()
        for r in temp_runs:  # 遍历复制的文本块
            for t in r.text:  # 遍历文本块中的文本内容
                new_run = p.add_run(t)  # 将文本内容添加到新文本块中
                set_random_font(new_run)  # 设置随机字体


def set_random_font(run):
    """
    设置文本块的随机字体
    """
    font_path_list = ['杨任东竹石体-Light', '杨任东竹石体-Regular']  # 字体路径
    run.font.name = random.choice(font_path_list)  # 随机字体(只对英文生效)
    run.font.size = Pt(random.choice([14, 16, 15]))  # 随机字号
    run.bold = random.choice([True, False])  # 随机加粗
    run.element.rPr.rFonts.set(qn('w:eastAsia'), random.choice(font_path_list))  # 修改中文字体


if __name__ == "__main__":
    file_path = 'C:\\Users\\Administrator\\Desktop\\test_dir\\读后感.docx'
    doc = Document(file_path)  # 创建document对象
    text_2_handwriting(doc)  # 转换为手写体
    doc.save('modified.docx')  # 保存word文档

运行结果:

Python将word文档内容替换为手写_Word文档_03


上一篇:【PostgreSQL】运维篇——数据库迁移与升级


下一篇:MySQL Spring JDBC API JdbcTemplate日期时间字段的测试使用