一、背景
在特定场景下,文件可是复印或者打印,但是内容需要为手写
现使用Python将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文档
运行结果:
中文设置失败
从上面运行结果可以看到,英文字体更改成功,可时中文字体只更改到了字号号和粗细
在设置随机字体方法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文档
运行结果: