案例:用python中文翻译的和英文原文合成新的word文档
一 问题的形成
需求的描述:一个英语翻译专业的研究生同学有一个期末作业。老师给了一个英文的文档,需要同学们翻译成中文。老师给的文档是格式如下图一所示,这个研究生同学翻译如图二所示。
(图一)
(图二)
该同学的做法就是按照老师的说法将翻译重新整理了一篇word文档,突然老师在群里说要求提交作业的格式为英文下面插入对应的中文,并且对字体的格式还有要求。 中文为宋体并且字体为小四号,英文为Times New Roman并且字体也为小四号。因为翻译的段落有100多段,一个一个剪切繁琐并且还容易出错,所以该同学向小编求救。嘻嘻
二 需求分析
问题汇总 |
---|
1 需要将中英文两篇word文档合成一篇中英文相互交叉的文档。 |
2 中文为宋体并且字体为小号四 |
3 英文为Times New Roman并且字体为小四号。 |
1:常用的API方法
返回值 | 涉及的对象和方法 |
---|---|
返回从docx 加载的 Document 对象,其中docx可以是文件(字符串)的路径,也可以是文件样对象的路径。如果缺少 docx或 ,则加载内置默认文档"模板"。 | Document (docx=None) |
标题段落将包含文本,其段落样式由级别确定。如果级别为 0,则样式设置为"标题"。 | add_heading (text=u’’, level=1) |
返回新添加到文档末尾的段落,该段落填充了文本并具有段落样式。 | add_paragraph (text=u’’, style=None) |
将此文档path_or_stream,可以是文件系统位置(字符串)的路径,也可以是文件样对象。 | save (path_or_stream) |
代理对象包装元素的父级并提供对字符属性(如字体名称、字体大小、粗体和下标)的访问。 | docx.text.run.Font |
读/写长度值 或 ,以英文公制单位 (EMU) 表示字体高度。 指示字体大小应从样式层次结构继承。长度 是int 的子类 ,具有便于转换为点或其他长度单位的属性 | Font.size |
获取或设置此字体实例的字体名称,如果找到匹配的字体,则导致它控制的文本显示在命名字体中。 指示字体是从样式层次结构继承的。 | Font.name |
将运行追加到包含文本的段落,并具有由样式 ID 样式标识的字符样式。 | add_run (text=None, style=None) |
解决方案: 利用python形成自动化办公,利用的库为python-docx
一) 第一步安装python-docx
pip install python-docx
二)需求思路
- 将中英文两份文档转换成Document对象,重新定义新的Document
- 取出对应文档中的段落,并且去空处理,用list对象进行缓存
- 遍历期中的一个list对象
- 每次生成新的段落的时候将英文段落的字体和样式设置成小四号和Times New Roman,每次生成新的段落的时候将中文段落的字体和样式设置成小四号和宋体。
- 调用save方法保存新的文档
三)代码如下:
# 导入Document对象
from docx import Document
# 导入qn对象设置对应的中文的字体问题
from docx.oxml.ns import qn
# 导入Pt对象为了设置字体大小
from docx.shared import Pt
# 定义一个新的Document对象用来合成新的word文档
new_homework_doc = Document()
# 加载中文和英文的word文档,分别分成Document对象,如果记得修改自己的路径
china_doc = Document('作业1.docx')
usa_doc = Document('翻译1.docx')
# 将中文Document对象中的段落抽取成段落列表,并且排除''空字符串
china_list = [china_doc_item.text for china_doc_item in china_doc.paragraphs if china_doc_item.text != '']
# 将英文Document对象中的段落抽取成段落列表,并且排除''空字符串
usa_list = [usa_doc_item.text for usa_doc_item in usa_doc.paragraphs if usa_doc_item.text != '']
# 生产新的文档
for index, item in enumerate(usa_list):
# 为0的时候,是设置对应的大标题
if index == 0:
new_homework_doc.add_heading(usa_list[index], 0)
new_homework_doc.add_heading(china_list[index], 0)
# 直接结束本次循环
continue
# 插入新的英文段落并且追加进去
run_1 = new_homework_doc.add_paragraph().add_run(usa_list[index])
# 设置英文对应的字体格式
run_1.font.name = 'Times New Roman'
# 设置英文字体大小
run_1.font.size = Pt(12)
# 插入新的英文段落并且追加进去
run_2 = new_homework_doc.add_paragraph().add_run(china_list[index])
# 设置中文对应的字体格式
run_2.font.name = u'宋体'
run_2.font.element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置字体大小
run_2.font.size = Pt(12)
# 保存
new_homework_doc.save("new.docx")
调用生成的效果如下图所示,正好满足需求
PS:
- add_paragraph()方法相当于一个容器,才能够调用add_run(),才有效果。
- 设置中文段落宋体的时候必须要比英文多一个步骤run_2.font.element.rPr.rFonts.set(qn(‘w:eastAsia’), u’宋体’)
- 各位小伙伴想用的时候,记得修改路径名。