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