Word 转手写体

本文介绍了如何使用Python的Tkinter、docx和PIL库将Word文档转换为手写体。首先,通过Tkinter创建GUI界面,接着详细讲解了从Word文档读取文本、设置背景、应用手写体字体并生成图像的过程。同时,文章提供了代码调试和使用效果的展示,还探讨了软件后续的完善和开发计划。
摘要由CSDN通过智能技术生成

介绍与准备

声明

要源码请关注后留言
不用做任何商业用途
赠人玫瑰,手有余香,点个赞再走呗

Tkinter 指南

这里使用的是 Tkinter 来开发一款软件的,如果不是用 Tkinter,请移步。
首先推荐一些 Tkinter 的教程吧:
Tkinter GUI 01
Tkinter GUI 02
Tkinter GUI 03
Tkinter GUI 04
Tkinter GUI 05
Tkinter GUI 06
Tkinter GUI 07
Tkinter GUI 08

然后,是一些有用的参考资料和书籍的下载地址:
Python GUI Tkinter 参考资料

再安装如下模块;

  • handright
  • docx:用于打开 Word
  • PIL:用于保存图像,创建手写字体模板

开发环境

这里使用 Eclipse 的 PyDev 开发我们的 GUI 应用,有关 Eclipse 的内容,可以参阅:
Eclipse 安装教程、PyDev 插件下载教程与有关设置

另外 PyDev 由于是一个插件,所以,其版本更新需要我们重新卸载、再安装。读者们下载了 PyDev 插件之后,过一阵子,就会弹出下面的一个对话框:
PyDev 更新提示

Word 转手写体代码

首先,我们忽略 GUI,看一下我们的 Word 转手写体代码。首先,在 Eclipse 中新建一个 Python 的项目:
新建Python 项目

主程序

首先,在我们新建的项目中,添加一个 .py 文件,如下所示:
添加一个 .py 文件

背景图像

为了让 Word 转换起来更像是手写体,我们还要添加一个背景,这里用的背景是我们童年的回忆——猫狗本,如下所示。将这个背景图像,命名为 background_01.jpg,并放在我们项目文件的 src(需要自己新建)文件中。
猫狗本背景,命名为 background_01.jpg
放在项目文件中的src文件夹中

字体下载与设置

首先要转换成手写体,我们需要用一个·手写体的字体,再将其加入随机扰动,来模拟手写体的效果。

大家可以从这个网站上下载一些手写体,免费的:

  • 手写体下载地址
  • 推荐一款瘦金体:http://www.zhaozi.cn/html/fonts/china/ruizibige/2020-05-25/26424.html

然后,同样在项目文件夹中,添加一个 font 文件夹。然后,将下载完的手写体字体,放到文件夹中。我大概是下载了这么多的手写体字体,大家可以参考一下:
手写体字体下载图片

主程序啦!!

之后,我们要往这个文件中,加入我们的主要程序代码,如下所示:

from PIL import Image, ImageFont
import numpy as np
from handright import Template, handwrite
from multiprocessing import Pool
import time
text = """
鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和
"""

background=Image.open(r'./src/background_01.jpg')
width, height = background.size
background = background.resize((np.int(3*width),np.int(2.5*height)),resample=Image.LANCZOS)

if __name__ == "__main__":
    time_start = time.time()    #计时开始
    template = Template(
        background=background,   #选择北京
        font_size=100,    #选择字体大小
        font=ImageFont.truetype(r".\font\瘦金简体.ttf"),  #选择字体
        line_spacing=150,
        fill=0,  # 字体“颜色”
        left_margin=250,    #选择字体于背景边缘的间距。
        top_margin=-30,
        right_margin=100,
        bottom_margin=100,
        word_spacing=15,
        line_spacing_sigma=6,  # 行间距随机扰动
        font_size_sigma=1,  # 字体大小随机扰动
        word_spacing_sigma=3,  # 字间距随机扰动
        end_chars=",。;、“” ",  # 防止特定字符因排版算法的自动换行而出现在行首
        perturb_x_sigma=3,  # 笔画横向偏移随机扰动
        perturb_y_sigma=3,  # 笔画纵向偏移随机扰动
        perturb_theta_sigma=0.03,  # 笔画旋转偏移随机扰动
    )
    with Pool() as p:    #多线程,加快程序的运行。
        images = handwrite(text, template, mapper=p.map)
    for i, im in enumerate(images):    #输出结果
        assert isinstance(im, Image.Image)
        im.save(r".\output\{}.jpg".format(i))    #将输出结果保存到路径中
    
    time_end = time.time()    #计时结束
    print(time_end-time_start)    #输出运行时间

这里要注意,im.save(r".\output\{}.jpg".format(i)) 将手写体弄成 jpg 图片之后,就会保存到一个叫 output 的文件夹中,并以 0 开始,命名图像。这里的 output 文件夹,要事先创建好,否则报错。当然,也可以添加一条代码来防止这样的情况。这条代码是什么呢?评论区走起~~

代码测试与结果

然后,运行一下我们的代码,会跳出一下错误

File “E:\java-2020-03\eclipse\workspace\Word2write_Principle\principle1.py”, line 7
SyntaxError: Non-UTF-8 code starting with ‘\xc4’ in file E:\java-2020-03\eclipse\workspace\Word2write_Principle\principle1.py on line 8, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

这是因为,我们的代码的第7句,text = """ 鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和 """出现了中文,所以识别不出来。只要在代码的开头,加入一句 #coding=gbk或者# -*- coding:utf-8 -*,再次运行即可。

效果如下:
运行结果
怎么样?心旷神怡对不对?除了有点东倒西歪以外,基本上是满足了我们的需求啊。大家也可以用其他字体,来体验一下效果。这里用李国夫手写体,来实验一下,效果如下:
李国夫手写体效果

链接 Word 文档

我们的需求是,输入一个 Word 文档,再将其转换为手写体。而不是每一次运行,都要设置 text 变量。为了实现这个目的,我们需要另外写一个程序,来读写 Word 文档。

从 Word 文档获取输入的代码

再次新建一个 .py 文件,命名为 principle2.py ,并键入如下代码:

# coding: utf-8
import docx
def read_docx(docx_path = r'./input/demo.docx'):
    docStr = docx.Document(docx_path)
    txt = []
    for para in docStr.paragraphs:    # 如果检测到 word 中有居中的,就在两边加上空格。
        parStr = para.text
        if_center = para.paragraph_format.alignment
        if if_center:
            parStr = parStr.center(48)
        else:
            parStr = '    ' + parStr
            
        txt.append(parStr)
    return '\n'.join(txt)


if __name__ == "__main__":
    txt = read_docx()

新建一个 Word 测试文档

为了保证程序的正确运行,我们还需要在项目文件夹中,创建一个新的文件夹,命名为 input。之后,再在里面添加一个 .docx 文件,命名为 demo.docx,输入以下文字:
demo.docx 的内容

代码调试

之后,我们可以运行一下 principle2.py 文件,用 debug 来观察程序是否运行顺畅。首先,在 return 处设置断点,按 F11 进行调试,可以看到程序运行到断点出,停止运行。并在 Varialbe 窗口出现一些变量(右边)
设置断点
我们可以直接在 Variable 窗口,点击 txt,来观察变量 txt 的取值。也可以在 command 窗口,输入变量名 txt,来观察变量的取值。结果如下:

[’ 谜题一个 ‘, ’ 鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和。’, ’ 答案是:—— 我要用自己的方式来爱你!!!’]

之后,在按一下 F5(step into吧,好像是),再按一次(共两次),就可以结束了。有关调试的内容,就不再过多说明了。

代码运行准备

测试完毕,效果可嘉。为了让上述的 txt 变量读入到 principle1.py 中,以供我们的程序使用,我们还要在 principle1.py 文件中,添加一些代码,以保证程序的运行,如下:

......
from principle2 import *
#text = """
#鸟飞鹅跳,月上中梢,目上朱砂,已异非巳,勺旁傍白,万事开头,工戈不全,雨下挚友,称断人和
#"""
..
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuo木鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值