秦建军,王智勇,刘雯晶,柳戌昊,鲁骞阳
(四川省科学技术信息研究所,四川 成都 610011)
科技报告是科技人员为了描述其从事科研、设计、工程、试验和鉴定等活动的过程、进展和结果,按照规定格式编写而成的具有重要参考利用价值的特殊文献[1]。“科技报告编写规则”对科技报告的构成、编排格式及技术内容提出了统一要求,是规范科技报告质量管理的核心标准之一[2]。我国于2013年启动了科技报告工作[3];为使科技报告编写正规化、规范化,2014年我国修订完善了科技报告标准。广大科研人员基本都能遵循最新版《科技报告编写规则》(GB/T 7713.3-2014)[4]编写科技报告。
在长期的科技报告审核工作中发现,广大科研人员的科技报告质量逐年提升,内容详实,但格式排版仍旧是一大痛点,审核人员后期花费了大量时间处理科技报告的格式排版。为解决这一难题,减轻简单重复的工作量,进一步提高审核效率,发挥信息技术的优势结合计算机技术,研发了一款科技报告应用软件。
《科技报告编写规则》规定,报告正文为5号宋体、1.5倍行距;各级目录标题为5号黑体、1.5倍行距;图下方的图题注、表上方的表题注均为5号黑体、1.5倍行距;图和表的注释为小5号宋体;表中文字为小5号宋体。目前,科研人员提交的科技报告内容具体充实,但排版格式没有遵循这些规则,不利于科技报告的标准化和规范化。
从技术角度看,科技报告的Word内容,由大纲目录、正文文字、图形、表格、页眉页脚等主要元素组成。需要处理格式的主要元素如图1所示。
图1 科技报告排版主要元素
1)处理节。Word文档主要由节(section)和段落(paragraph)组成,一个“分节符(下一页)”为一节,每一节的页脚和页眉可以不同。科技报告的“目录”“插图清单”“附表清单”与后面的正文内容之间需要添加“分节符(下一页)”,正文内容与“承诺书”之间也需要添加分节符(下一页)。通过循环不同节添加页码并设置不同的页码格式,同时删除“承诺书”的页码。
2)处理段落。段落包含了目录大纲段落、纯文字段落、图文混排段落、图形、表格数据等。通过循环每一段落,判断哪些段落是大纲、普通文字、图文混排、图形和表格数据,判断时排除图形段落和表格数据,后期单独处理。普通文字、图文混排段落用5号宋体、1.5倍行间距、首行缩进2个字符。
3)处理图题注和表题注。图题注和表题注本质上仍是段落,但在科技报告中,图题注和表题注用5号黑体,需要单独识别,识别原则是段落起始字符是“图”或“表”,紧接着是阿拉伯数字序号,并且段落最后一个字符不能是阿拉伯数字,这是为了与“插图清单”“附表清单”中的文字区分开来,“插图清单”“附表清单”中的文字用5号宋体,其中每一段落后面是页码(阿拉伯数字)。个别段落可能符合图题注和表题注的特征,但不是真实的图题注和表题注,程序可能会错误格式化,但总体上不会受影响,个别情况须人工干预。
4)处理图形和表格。图形和表格本质上仍是段落,大部分图形是单独的段落,个别图片置于文字中混排。单独的图片易于处理,图文混排则需要判断图片高度,通常混排中的图片高度不会太高。
表格中每一单元格的数据都是一个段落,Word中可以统一设置表格的格式,而无需设置每一单元格的格式。行高和列宽根据内容自适应,不用单独设置,不用考虑跨行和跨列。
Word处理耗费计算机资源,一篇科技报告至少有数页内容,如果把Word排版功能放在服务器上执行,会严重降低服务器运行效率,影响用户体验。因此,优先考虑基于单机版开发科技报告格式化处理软件。
开发语言采用Python,Python语言具有简洁性、易读性以及可扩展性,Python的扩展库相当丰富。处理Word的接口库Win32com功能强大,完全满足科技报告排版功能的要求;单机版用户UI采用Tkinter的GUI工具包,方便用户操作。
安装Anaconda3.7,Anaconda是开源的Python解释器,其包含了Conda、Python等180多个科学包及其依赖项;安装win32com和Tkinter工具包;程序代码打包成可执行文件(exe)需要安装Pyinstaller。
1)样式设置。程序在格式化处理时,先修改Word样式库中的正文样式:5号宋体、1.5倍行距、首行缩进2个字符。正文样式必须放在所有样式最前面其他样式才有效。然后依次增加样式:科技报告图片、科技报告表格数据、图题注、表题注、标题1至标题7、清单名称。添加样式后打开Word时样式库可见。每一种样式遵循科技报告规范,后面处理段落时根据段落类型使用相应的样式,做到统一规范。实现代码样例如下。
imgStyle=False#图片
for i in range(1,doc.Styles.Count):#判断doc中存在样式
if doc.Styles(i).NameLocal==“科技报告图片”:
imgStyle=True
if imgStyle==False:
doc.Styles.Add(“科技报告图片”)
doc.Styles(“科技报告图片”).ParagraphFormat.TabStops.ClearAll()
doc.Styles(“科技报告图片”).ParagraphFormat.LeftIndent=0 #左缩
doc.Styles(“科技报告图片”).ParagraphFormat.FirstLineIndent=0 #首行缩进
doc.Styles(“科技报告图片”).ParagraphFormat.CharacterUnitLeftIndent=0
doc.Styles(“科技报告图片”).ParagraphFormat.CharacterUnitFirstLineIndent=0 # 首行缩进
doc.Styles(“科技报告图片”).ParagraphFormat.Alignment=1 #012左中右
doc.Styles(“科技报告图片”).ParagraphFormat.Space15() #行间距1.5倍
doc.Styles(“科技报告图片”).ParagraphFormat.DisableLineHeightGrid=True # 段落中的字符与行网格对齐
doc.Styles(“科技报告图片”).ParagraphFormat.SpaceBefore=0
doc.Styles(“科技报告图片”).ParagraphFormat.SpaceAfter=0
doc.Styles(“科技报告图片”).ParagraphFormat.AutoAdjustRightIndent=False
doc.Styles(“科技报告图片”).ParagraphFormat.LineUnitBefore=0
doc.Styles(“科技报告图片”).ParagraphFormat.LineUnitAfter=0
doc.Styles(“科技报告图片”).ParagraphFormat.MirrorIndents=False
图2 程序实现总体逻辑
2)段落处理。循环所有段落,排除表格数据,剔除段落中的空格,再分别判断处理。①根据OutlineLevel判断段是否是大纲目录,如果是大纲目录则根据标题的层级使用标题样式(标题1~标题7)。大纲目录使用Word内置模板——多级列表第5种模板。部分科技报告是作者手工添加的目录层级,这种目录并没有出现在大纲列表中,软件会自动识别,生成Word大纲目录。②普通正文段落则使用正文样式,图文混排也须应用正文样式。③如果段落文字以“表+序号”或“图+序号”则判断是否是题注,表题注使用“表题注”样式,图题注使用“图题注”样式。
3)图片与表格处理。①循环所有图片(InlineShapes),排除图文混排段落,再应用“科技报告图片”样式。②循环所有表格,再应用“科技报告表格数据”样式。
4)更新目录。科技报告中有大纲目录(TablesOfContents)、插图清单(TablesOfFigures)和附表清单(TablesOfFigures)3种目录,程序更新目录内容和页码,并设置字体、字号、行间距和悬挂2字符。
5)页眉页脚处理。①循环所有节(section),删除页眉。②循环所有节(section),设置页脚中的页码样式。
6)合并承诺书。部分科技报告没有承诺书,需要软件自动合并一个承诺书,并删除页码信息。
运用Pyinstaller工具打包,生成一个可执行文件。打包代码:pyinstaller.exe--onefile--windowed 科技报告.py-p D:ProgramDataAnaconda3,运行后,在dist目录生成文件“科技报告.exe”。运行程序如图3所示。
图3 软件运行图
格式化10页以内的科技报告需要2~3 min,图片和表格少的科技报告可能2 min以内完成格式化;格式化100多页的科技报告可能需要30多分钟。当然,软件运行效率与电脑的配置密切相关。软件排版后的科技报告,再由人工处理,与传统的人工处理方式相比,节省大概一半的时间。
本软件还有不足之处,表现在:①大纲目录自动化生成后,保留了原文档作者手工编写的目录序号,虽方便审核人员对照,但需要人工删除序号。②图题注和表题注识别可能存在个别错误,需要人工干预。
软件采用循环段落的方式,无法考虑上下文关联,降低了需要格式化内容的识别率,如果能把所有段落放在一个大数组中,再循环数组,判别前后文关联关系,就能提高识别率,但此方法大大增加了电脑负荷,降低运行效率,期待更佳方案。