李秀賢



[摘? ? ? ? ? ?要]? 針對(duì)Word格式的學(xué)位論文原文,研究基于Python的論文排版自動(dòng)化。采用用戶數(shù)據(jù)替換模板范例數(shù)據(jù)的方法實(shí)現(xiàn)自動(dòng)排版,旨在盡可能地減少論文排版操作,提高工作效率和正確率。
[關(guān)? ? 鍵? ?詞]? Python;論文排版;自動(dòng)排版
[中圖分類號(hào)]? TP391? ? ? ? ? ? ? ? ? ? ?[文獻(xiàn)標(biāo)志碼]? A ? ? ? ? ? ? ?[文章編號(hào)]? 2096-0603(2020)09-0128-02
一、問題提出
國內(nèi)學(xué)位論文的撰寫大多數(shù)人采用Microsoft Word文字處理器或Latex的標(biāo)記式的文本編輯器。雖然這些編輯器能為使用者提供非常強(qiáng)大的字處理功能和文檔控制功能,但論文排版依然有許多繁雜的工作需要使用者人工手動(dòng)完成。
近年來,有部分高校利用Office對(duì)象庫進(jìn)行Word的二次開發(fā),為學(xué)生提供了畢業(yè)論文排版平臺(tái),使用者不必再花費(fèi)大量的時(shí)間去學(xué)習(xí)那些不常用的Word排版操作,而生成正確排版文檔。但是,即使使用二次開發(fā)的排版工具,也需要人工操作才行,特別是正文部分的章、節(jié)、小節(jié)的劃分需要人工干預(yù)。
由于學(xué)位論文文檔的結(jié)構(gòu)基本上是固定的,通常它由以下部分及順序組成:封面、聲明(誠信或原創(chuàng)性、著作權(quán)使用)、中英文摘要、目錄、正文、參考文獻(xiàn)、致謝、附錄等。正文部分是論文的核心,其他部分都是論文的附屬部分。論文附屬部分都存在固定的特征標(biāo)志,例如,論文封面通常包括:學(xué)校信息(代號(hào)、名稱)、論文中英文題目、論文作者相關(guān)信息(專業(yè)、年級(jí)、所屬系部、姓名、學(xué)號(hào)和指導(dǎo)教師)、論文完成日期,這些內(nèi)容前存在若干固定不變的標(biāo)識(shí)字符;每所學(xué)校都提供標(biāo)準(zhǔn)聲明范文供學(xué)生填寫;參考文獻(xiàn)部分的格式有國家統(tǒng)一的規(guī)定,例如,專著、論文集、學(xué)位論文、報(bào)告的格式是:“[序號(hào)]主要責(zé)任者.文獻(xiàn)題名[文獻(xiàn)類型標(biāo)識(shí)].出版地:出版者,出版年.起止頁碼(可選)”,每段開始有特征“[序號(hào)]”,結(jié)尾特征為數(shù)字等。鑒于這些規(guī)律,本文針對(duì)Word格式論文原文,研究基于Python的學(xué)位論文自動(dòng)排版。論文自動(dòng)排版就是按照標(biāo)準(zhǔn)的格式要求,處理未排版論文的內(nèi)容,并輸出完全符合規(guī)定格式的論文。從排版的角度來看,在進(jìn)行文字錄入的時(shí)候同時(shí)應(yīng)用樣式進(jìn)行排版,效率較高。對(duì)于一篇未排版論文,如何模擬人工錄入文檔內(nèi)容的方式實(shí)現(xiàn)快速排版,這是本文研究的重要內(nèi)容之一。
二、關(guān)鍵技術(shù)
Python本身只能處理text文本,若要在Python程序中操作控制Word文檔,可以使用Python win32com組件對(duì)象接口或Python docx擴(kuò)展庫。
(一)win32com組件對(duì)象接口
使用win32com接口需要先安裝pywin32擴(kuò)展庫。該庫封裝了Python下所有的win32相關(guān)操作,它提供了齊全的Windows常量、接口、線程以及COM機(jī)制等,是Python調(diào)用Windows系統(tǒng)底層功能的最佳接口。其中win32com模塊定義了Windows API內(nèi)的宏,通過win32com接口實(shí)現(xiàn)軟件的操作本質(zhì)上跟直接操作軟件是一致的。
win32com組件對(duì)象接口只對(duì)Windows平臺(tái)有效,對(duì)Word文檔操作需要本機(jī)上有Word應(yīng)用程序的支持。當(dāng)在程序內(nèi)導(dǎo)入這個(gè)模塊之后,把Word文檔、文檔中的段落、文本、字體等都當(dāng)作對(duì)象,就可以像VBA一樣操作Word。在程序中操作Word文檔,其本質(zhì)就是實(shí)例化Word文檔對(duì)象,使用對(duì)象的方法和屬性,對(duì)對(duì)象進(jìn)行處理就是對(duì)Word文檔的內(nèi)容處理。
(二)Python docx擴(kuò)展庫
Office的Docx類型文檔采用開放文件格式(Office Open XML),它的基本方法是將文本和格式存儲(chǔ)成xml,其他圖片等資源存儲(chǔ)成獨(dú)立文件,并將其進(jìn)行Zip壓縮。Docx文檔解壓后結(jié)構(gòu)如圖1所示。
其中,[Content_Types].xml的作用是確定文檔中每個(gè)唯一類型組件;_rels文件夾存儲(chǔ)組件之間的連接;docProps文件夾存儲(chǔ)結(jié)構(gòu)化的文檔屬性;word文件夾存放大部分的內(nèi)容組件,其中Word的正文內(nèi)容被保存在word/document.xml中,這就是Word存儲(chǔ)文本的方式。操作Docx文檔本質(zhì)就是操作一組復(fù)雜的XML文件。
Python docx是一款開源的讀寫Word文檔的組件,不依賴操作系統(tǒng)。該擴(kuò)展庫實(shí)際上是對(duì)XML操作的封裝庫,docx對(duì)象頂層是Document,代表Word文檔;下面是段落(paragraph)、表(table)、圖片(inline picture)、節(jié)(sections)、標(biāo)題(heading)、有序列表(numbered lists)、無序列表(bullets lists)、樣式(styles)等塊級(jí)對(duì)象(block-level object)。塊級(jí)對(duì)象的屬性可指定對(duì)象所在的位置,對(duì)齊方式、縮進(jìn)、段間距離、頁碼等。一個(gè)塊級(jí)對(duì)象由一個(gè)或多個(gè)內(nèi)聯(lián)對(duì)象(inline-level object)組成。塊級(jí)對(duì)象的所有內(nèi)容都包含在內(nèi)聯(lián)對(duì)象中,內(nèi)聯(lián)對(duì)象的屬性指定了字體,例如粗體、斜體、大小等等,run 是常用的內(nèi)聯(lián)對(duì)象。其關(guān)系如圖2所示。
三、基本方法
(一)使用論文格式模板配合數(shù)據(jù)庫存放排版參數(shù)
學(xué)位論文格式智能檢測(cè)與自動(dòng)排版需要的格式參數(shù),在本設(shè)計(jì)中根據(jù)學(xué)位論文組成結(jié)構(gòu)采用格式模板文件與數(shù)據(jù)庫相結(jié)合的方法保存格式參數(shù),論文每一組成部分對(duì)應(yīng)一個(gè)模板文件。為了改善處理效率,在論文模板文件中除了設(shè)置好各種格式要求(行距、字體、大小、段前、段后、段落縮進(jìn)、對(duì)齊方式、標(biāo)題等級(jí)、頁眉頁腳、頁碼等),還要在對(duì)應(yīng)位置寫入具有唯一性的范例數(shù)據(jù),這樣可縮小搜索范圍和減少位置的計(jì)算量。例如,封面模板文件學(xué)號(hào)一欄的正確位置上寫入12345678,當(dāng)查找到該字符串,無須計(jì)算就能獲得位置信息。通過程序?qū)W(xué)位論文各個(gè)組成部分的格式參數(shù)和定位信息導(dǎo)入到數(shù)據(jù)庫,盡可能地減少用戶用于自動(dòng)排版參數(shù)的輸入工作量。
(二)用替換模板范例數(shù)據(jù)實(shí)現(xiàn)論文附屬部分自動(dòng)排版
由程序按論文結(jié)構(gòu)順序?qū)⒏鞑糠值哪0褰M合成一個(gè)新文件new.docx,摘要、目錄使用羅馬數(shù)字連續(xù)“I、II…”編制頁碼,正文開始的以后部分都使用阿拉伯?dāng)?shù)字“1,2,3…”編制頁碼。為避免各部分頁眉、頁腳、頁碼的影響,各部分之間用分節(jié)符分隔,如圖3所示。此時(shí),new.docx文件排版格式已到位,只是內(nèi)容暫時(shí)未到位。
當(dāng)需要對(duì)未排版論文進(jìn)行處理時(shí),先清除文內(nèi)不必要的空行和段首空格,將手動(dòng)換行符(軟回車)替換成段落標(biāo)記。然后從未排版論文中按定位特征提取相關(guān)信息,用純文本方式替換new.docx文檔對(duì)應(yīng)部分的范例數(shù)據(jù)。由于替換過程只改變文本,新信息就自動(dòng)繼承該位置的格式,達(dá)到排版要求。
例如,當(dāng)處理程序從未排版論文的封面提取到論文作者的學(xué)號(hào)后,與模板上學(xué)號(hào)范例數(shù)據(jù)“12345678”比對(duì)字符串長(zhǎng)度,若長(zhǎng)度不等,在相對(duì)短的字符串兩側(cè)添加空格,達(dá)到平衡,然后用替換命令將論文作者的學(xué)號(hào)覆蓋學(xué)號(hào)范例數(shù)據(jù)“12345678”。誠信聲明部分的處理更簡(jiǎn)單,只需要將提取到的論文題目名,替換范例數(shù)據(jù)“學(xué)位論文排版自動(dòng)化研究”就完成該部分的排版工作。同樣,論文摘要只需要提取摘要內(nèi)容的段落和具體的關(guān)鍵詞即可。
由此方式產(chǎn)生的排版結(jié)果文件不會(huì)出現(xiàn)不允許出現(xiàn)的信息,例如,論文封面上不會(huì)有頁眉、頁腳,信息的排列順序不會(huì)發(fā)生錯(cuò)誤,各部分的頁碼不會(huì)互相影響。
當(dāng)對(duì)導(dǎo)入的學(xué)位論文進(jìn)行檢測(cè)與排版處理的過程中,如何準(zhǔn)確定位到論文的指定部分是至關(guān)重要的。由于字符查找通常需要明確查找范圍、查找內(nèi)容等要素,本系統(tǒng)采用特征定位方法,使用論文每一組成部分首尾特征尋找被處理區(qū)域,并對(duì)定位匹配算法優(yōu)化。例如,論文摘要區(qū)域開始的特征是標(biāo)題字符“摘要”或“Abstract”,尾部特征字符是“關(guān)鍵字”或“Keywords”。于是程序就可以根據(jù)“摘要”和“關(guān)鍵字”,定位到Word文檔所在頁面。
多模板的使用可縮小標(biāo)準(zhǔn)格式的搜索范圍,若使用合成模板文檔,通過sections集合,只需要在指定的節(jié)內(nèi)搜索。
(三)用樣式處理論文正文的排版
由于研究對(duì)象涉及的各個(gè)具體學(xué)科、選題、研究方法、論證過程、結(jié)論表達(dá)等可能存在差異,故無法對(duì)論文正文主體的內(nèi)容作統(tǒng)一規(guī)定,正文模版只需設(shè)置全部標(biāo)題層次格式及其標(biāo)題之間分隔段的格式。
論文正文的排版處理首先需要正確地分割章節(jié),在兩章之間插入分頁符,使用多重循環(huán),依段落為單位,利用add_paragraph將獲得的內(nèi)容插入new.docx文檔正文部分,并指定對(duì)應(yīng)的style即可實(shí)現(xiàn)格式設(shè)置。
論文正文章節(jié)分割,可通過定位章節(jié)標(biāo)題來完成。但是待排版的論文無法預(yù)知標(biāo)題名,這可借助章節(jié)標(biāo)題隱含的特征來判斷,章節(jié)標(biāo)題隱含特征包括:A.論文標(biāo)題層次一般采用3級(jí)制,可以是阿拉伯?dāng)?shù)字體的層進(jìn)制或漢字體的章節(jié)制;B.層次標(biāo)題都比較精短,長(zhǎng)度一般小于20,結(jié)尾無句號(hào),標(biāo)題段落應(yīng)該為單行;C.與標(biāo)題相鄰的2~3個(gè)段落不會(huì)出現(xiàn)同級(jí)標(biāo)題。
根據(jù)標(biāo)題格式使用正則表達(dá)式快速定位到指定段落,當(dāng)查找到對(duì)應(yīng)的段落后,再檢測(cè)該段落是否符合這些特征,以便于確定是否是正文標(biāo)題。例如,按正則模式“^[0-9]”定位后,若相鄰?fù)瑯邮菙?shù)字開始的段落,且前導(dǎo)數(shù)字與定位到的段落數(shù)字差1,說明所定位的區(qū)域是正文中的數(shù)字列表,若與該行比較接近的位置若存在節(jié)標(biāo)號(hào)段落,則可認(rèn)定這是章的標(biāo)題。
當(dāng)正文排版完成后,使用Document.Tables Of Contents屬性,就可以自動(dòng)生成目錄。
(四)定位準(zhǔn)確率的優(yōu)化
Word對(duì)象模型提供了Find對(duì)象和Replacement對(duì)象,可同時(shí)進(jìn)行多個(gè)查找與替換,支持通配符和正則表達(dá)式,還可以結(jié)合格式進(jìn)行準(zhǔn)確查找。
Python提供了強(qiáng)大的查找替換功能,可以使用字符串類型提供的find(? ? )或者index(? ? )方法查找指定的字符,也可以引用fnmatch庫實(shí)現(xiàn)使用通配符來查找字符串,減少定位的出錯(cuò)率。當(dāng)需要查找比較復(fù)雜的字符規(guī)則,可直接調(diào)用內(nèi)嵌集成的re模塊,來實(shí)現(xiàn)正則匹配。re模塊中有findall、finditer、match、search四個(gè)方法用于匹配字符串,可根據(jù)不同要求采用其中的一種方法,sub函數(shù)通過正則表達(dá)式,實(shí)現(xiàn)比普通字符串的replace更加強(qiáng)大的替換功能,可替換所有的匹配項(xiàng)。
四、結(jié)論
本研究嘗試不直接對(duì)原始論文調(diào)整其格式,模擬人工填寫文檔內(nèi)容的方式,提取未排版的原始論文數(shù)據(jù)替換模板范例數(shù)據(jù)的方法實(shí)現(xiàn)自動(dòng)排版。充分利用模板上已有的格式,減少對(duì)論文具體的排版操作,這樣事半功倍,其優(yōu)點(diǎn)明顯。
參考文獻(xiàn):
[1]季金奎.淺談學(xué)生畢業(yè)論文格式排版的問題與對(duì)策[J].福建電腦,2016(8):155,159.
[2]胡海英.基于Word VBA技術(shù)的試卷自動(dòng)排版系統(tǒng)的設(shè)計(jì)[J].電子技術(shù)與軟件工程,2014(3):64.
[3]馬吉權(quán).畢業(yè)論文自動(dòng)排版系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].中國科教創(chuàng)新導(dǎo)刊,2013(26):189-190.
◎編輯 張 俐