









摘" 要:增值稅發票是各類經濟交易中最常用的支付憑證,財務報賬過程中人工處理發票效率低下。基于此,文章設計并實現了增值稅發票解析和識別系統。該系統對不同類型的發票文檔進行分類處理,文本類型的電子發票直接用XML文檔處理工具進行解析,紙質發票的掃描件使用PaddleOCR進行識別。在識別紙質發票掃描件之前先解析二維碼,得到二維碼的位置信息和文本內容。基于位置信息對發票圖像進行方向矯正,將矯正之后的圖像送入OCR識別模塊進行文字識別,并通過二維碼解析得到的內容對OCR識別結果進行驗證,從而提高識別結果的可靠性。
關鍵詞:增值稅發票;發票解析;發票識別
中圖分類號:TP311" " 文獻標識碼:A" 文章編號:2096-4706(2024)10-0107-06
Research and Implementation of Value Added Tax Invoice Parsing and Recognition System
WANG Xiangjun, LIN Bingqing, CHEN Yuqiang, LIU Huifen
(College of Big Data and Internet, Shenzhen Technology University, Shenzhen" 518118, China)
Abstract: Value added tax invoices are the most commonly used payment vouchers in various economic transactions, and manual processing of invoices during financial reporting is inefficient. Based on this, the paper designs and implements a value added tax invoice parsing and recognition system. The system classifies different types of invoice documents. Electronic invoices in text type are directly parsed using XML document processing tools, while scanned copies of paper invoices are recognized using PaddleOCR. Before identifying scanned copies of paper invoices, first parse the QR code to obtain the location information and text content of the QR code. Based on location information, the invoice image is directional corrected, and the corrected image is sent to the OCR recognition module for text recognition. The content obtained through QR code parsing is used to verify the OCR recognition results, thereby improving the reliability of the recognition results.
Keywords: value added tax invoice; invoice parsing; invoice recognition
0" 引" 言
隨著新一代信息技術浪潮襲來,新興技術層出不窮,各項技術不斷創新,相繼融入經濟社會發展的各個領域,展現出數字經濟的蓬勃活力。增值稅發票(以下簡稱“發票”)是記錄商品交易行為的一種重要憑證,分為增值稅普通發票和專用發票,主要有紙質和電子版兩種形態。電子增值稅發票因省卻了紙張成本以及便于傳遞,逐漸成為信息化支付和入庫的重要原始依據[1]。當前的電子增值稅發票主要有.ofd和.pdf兩種格式,這兩種格式的電子發票都可以使用對應的解析工具進行信息提取。而紙質發票則需要掃描成電子文檔后進行識別,百度和騰訊等大型IT公司都有提供對應的識別接口。由于發票信息的提取和識別直接關系到報賬業務的正確性,對信息準確率的要求非常高。本系統會根據發票的不同而采用不同的處理方式,最大限度地提高準確率。
1" 系統設計
1.1" 系統架構設計
本系統采用的是B/S架構,前端部分通過HTML、CSS、JS等進行頁面的開發和渲染,同時進行請求和響應。后端部分采用三層架構模型,由表現層、業務邏輯層、數據訪問層組成。當表現層將客戶請求下放時,業務邏輯層將調用業務邏輯進行業務處理,再對數據訪問層發起對數據庫增刪改查的請求,系統最終將業務邏輯層與數據訪問層交互的結果返回到表現層進行數據展示。系統架構圖如圖1所示。
1.2" 數據庫設計
數據庫是應用程序的關鍵要素之一,是系統設計的基石,好的數據庫設計應當做到為系統提供翔實細致的數據分析和清晰簡明的數據統計,做到具有較高的獨立性和較小的冗余度。本系統主要是通過關系型數據庫SQLite3實現的,數據庫E-R圖如圖2所示,分為用戶信息表和票據信息表。
用戶信息表用于存儲用戶相關的信息,以系統使用者的ID作為主鍵,主要有用戶名、密碼、聯系電話、地址等信息。創建用戶信息表能夠方便管理,提升效率。
用戶在系統中上傳發票后,系統會將識別后提取的內容存入票據信息表中供用戶查詢。其中以發票號碼為主鍵,還包含有銀行卡號、開戶行、開票日期、不含稅的開具金額、總金額五個字段。票據信息表會在內容展示頁中將內容呈現給用戶,用戶還可以選中其中的某項數據進行大小排序。
1.3" 系統功能設計
增值稅發票解析和識別系統主要是提供服務供財務報賬的中間流程調用,結合信息處理等基礎功能部署成Web系統,這樣用戶使用起來更加方便。針對該系統的目標用戶及其使用需求,發票解析和識別系統需要具備如下基本功能:注冊、登錄、發票上傳、發票識別、數據展示和數據下載等。
1.3.1" 注冊登錄
在用戶登錄模塊中,前端在獲取用戶輸入的登錄信息后會將賬號和密碼與數據庫中的賬號密碼進行比對。如果用戶信息正確,回傳系統主頁;如果賬號不存在,則提示用戶注冊賬號。在用戶注冊賬號時,前端會獲取到用戶填寫的信息并將用戶信息寫入數據庫。
當用戶需要修改用戶信息時,其提交修改信息,系統將用戶提交的修改信息與原有信息進行對比。倘若信息無變化,返回“您的資料沒有改動”,如果信息有變化,則存入數據庫,同時反饋“您的資料已重新提交”的提示信息。
1.3.2" 發票上傳
用戶打開“上傳文件”頁面時呈現上傳接口,在用戶點擊“上傳”按鈕后,系統對文件進行處理。
當用戶選擇文件時,前端會對文件類型進行判斷。系統可對OFD、PDF、PNG和JPG等格式的文件進行解析或識別,如果是其他格式的文件則提示用戶不支持該種類型文件的處理。在發票上傳時為發票自動識別創建進程,前端以進度條顯示當前處理進度,后端工作繼續運轉。
1.3.3" 發票識別
發票上傳到系統后臺后,后臺會根據發票類型對發票進行解析或識別,獲取發票上面的發票代碼、發票號碼、合計稅額、合計金額、開票日期、銷售方名稱、銷售方開戶行及賬號等信息返回給前端。
1.3.4" 發票下載
單次上傳發票成功后,可以將該次識別的數據下載下來以供后續審查和使用。在發票審核頁面中查詢到該用戶上傳過的全部發票時,也可以根據需求下載曾經處理過的原始發票和處理過的發票信息。下載后的發票信息以CSV格式保存到本地,文件中包含發票號碼、銀行卡號、開戶行等重要信息和金額核對等相關處理的結果。
2" 系統實現
本系統采用的是B/S架構,使用HTML、CSS、JavaScript以及開發框架Bootstrap進行前端開發。選用jQuery進行前后端數據交互和傳遞,采用jQuery作為微型JavaScript庫,通過創建服務端函數并在服務端與客戶端之間交換JSON數據,能夠很好地體現Web應用的動態性特點[2]。在功能邏輯的實現上采用了以Python語言編寫的Flask后臺框架,Flask的特點在于其小巧靈活,可以很好地結合MVC模式,非常適用于中小型網站的開發[3]。
發票提取識別模塊根據發票的類型進行相應的處理,電子發票一般有OFD和PDF兩種格式,紙質發票掃描件有PDF、PNG和JPG等圖片格式,不同格式發票需要采用不同的方法進行處理,OFD格式和文本格式的PDF文件可直接進行解析,而發票掃描件則需要進行文字識別。
2.1" 發票解析
OFD是開放版式文檔(Open Fixed-layout Document)的英文縮寫,是我國國家版式文檔格式《GB/T 33190—2016電子文件存儲與交換格式-版式文檔》標準[4]。OFD文檔不受設備影響,版式固定。在版式、版面、字體、字號等方面與紙質文件完全一致。版式文檔格式的特點使它成為嚴肅類電子文檔發布、數字化信息傳播和電子存檔的理想文檔格式,特別適合用于保存電子發票。
OFD文件本身是壓縮文件,在提取OFD格式的電子發票時,首先對文件進行解壓縮,在解壓的根目錄下面有OFD.xml文件,如圖3所示。
如圖3所示,OFD.xml文件包含發票代碼、發票號碼、合計稅額、合計金額和開票日期等信息,若要獲得銷售方名稱和銀行賬號等信息,需要對./Doc_0/Attachs目錄下的original_invoice.xml文件進行解析,該文件的部分內容如圖4所示。
如圖4所示,original_invoice.xml文件包含購買方名稱、銷售方名稱、納稅號、地址、開戶行等信息。OFD.xml和original_invoice.xml是xml格式的文件,利用xml解析庫就可以得到所需的字段信息。而后綴為.pdf的發票文件可能是文本格式的電子發票,也可能是紙質版發票的掃描件,前者可直接運用PDF解析工具進行信息提取,后者則需要使用OCR方法進行字符識別[5]。但是發票文件中沒有用以判斷一份PDF文件到底是文本格式文件還是掃描件的字段,可以借助pdfplumber庫來判斷[6]。pdfplumber是一個用于處理PDF文件的Python庫,可以提取文本、圖像、表格等元素。它的extract_words函數可以獲取文本類型PDF文件的文本內容,如果能夠獲取文本內容則為文本格式的PDF,否則就是掃描件。文本格式PDF文件利用pdfplumber的extract_text函數得到每一頁的文本,然后運用正則表達式提取所需的字段信息。
2.2" 發票識別
紙質發票掃描件需要使用光學字符識別技術(Optical Character Recognition, OCR)進行識別,OCR是采用光學的方式將紙質文檔中的文字轉換成為黑白點陣的圖像,并通過識別算法將圖像中的文字轉換成文本格式的一種技術[7,8]。隨著大數據以及人工智能掀起的狂潮,尤其是近年來深度學習的蓬勃發展,基于卷積神經網絡的OCR技術可以快速識別到重要的信息,而且能達到很高的準確率。
目前,國內主流的ICT公司(例如騰訊、阿里巴巴、百度、華為和字節跳動)都有提供OCR服務[9]。其中,百度的PaddleOCR是一個開源的超輕量級OCR模型庫[10],其通用OCR識別準確率已經超過95%,其端到端的識別模型將檢測和識別放到一個網絡結構中,使得訓練的效率更高,預測階段的資源開銷更少,所以我們選用PaddleOCR識別紙質發票掃描件。
PaddleOCR對圖片格式的發票進行識別,所以當發票掃描件為PDF格式時,需要先將其轉換成圖片。當前無論是增值稅普通發票還是增值稅專用發票都是橫板的,即從正向看(文字從左向右,從上向下排列)發票圖片的寬度比長度要大,但是發票掃描時可能會將紙質發票采集成豎版,所以還需要對發票的方向進行校正。當圖片的長大于寬時,代表圖片是豎直方向的,需要對圖片進行由豎直向水平方向的旋轉,但究竟是向左旋轉90度還是向右旋轉90度還需要做進一步的確定。
如圖5(a)所示的發票需要向右旋轉90度變為正向,而如圖5(b)所示的發票需要向左旋轉90度變成正向。我們可以借助發票上的二維碼來判斷發票當前的方向,圖5(a)發票上的二維碼在左下角,而圖5(b)發票上的二維碼在右上角。二維碼的識別可以借助微信開發團隊貢獻給OpenCV社區的二維碼掃描工具,先調用wechat_qrcode_WeChatQRCode()創建檢測實例,再調用該實例的detectAndDecode()方法檢測和識別二維碼,它不僅能定位二維碼所在的位置,還能解析二維碼上的文本信息,對圖5(b)發票調用二維碼識別接口,得到的二維碼識別結果如圖6所示。
在如圖6所示的二維碼識別結果中,最上面一行數據是二維碼的內容,其中的第三項044002000404是發票代碼,第四項22477767是發票號碼,第五項754.72是不含稅的發票金額,第六項20221128是開票日期。第二行行首的array部分是二維碼的坐標,每行有兩個浮點數,分別表示二維碼四個角的水平和豎直方向坐標。當二維碼在左下角時,水平方向坐標較小,而豎直方向的坐標較大。反之,當二維碼在右上角時,水平方向的坐標較大,豎直方向的坐標較小。我們可以根據二維碼的坐標來確定向左還是向右旋轉發票,將圖5(b)發票向左旋轉90度后得到矯正方向后的發票,如圖7所示。
矯正圖片方向后就可以調用PaddleOCR進行文字識別,調用PaddleOCR庫的PaddleOCR()方法創建實例,然后調用該實例的ocr(self, img, det, rec, cls)方法進行識別。OCR方法有五個參數,第一個參數self表示類的實例本身,第二個參數img表示要識別的對象,可以是ndarray對象,圖片的路徑或者是列表對象,第三至第五個參數分別表示是否進行文本檢測,是否進行文本識別,是否進行不同角度的識別,它們的默認值都是true。由于我們既要檢測文本的位置,又要識別文本的內容,所以第三和第四個參數就使用默認值,但是我們在將圖片對象送入OCR函數識別之前已經利用二維碼信息對圖片進行了方向矯正,所以將最后的參數cls設為1,這樣就不用在各個方向上進行識別,提高處理速度。對如圖7所示的發票進行OCR識別后得到如圖8所示的識別結果(部分截圖)。
每行結果是一個列表,每個列表有兩個元素,第一個元素是一個列表,該列表有四個元素,表示檢測到文本框四個角的x軸和y軸坐標,第二個元素是一個元組,元組的第一個元素是文本框中包含的文字,第二個元素是置信度。我們提取所有的文本框信息畫在原始發票圖片上,可以看到如圖9所示的文本框檢測結果。
從圖9可以看出,發票上絕大部分的文本框都檢測出來了,但是OCR識別并不能達到100%的準確率,而發票信息直接關系到財務的安全,容不得半點差錯。所以我們可以將如圖6所示二維碼識別結果和如圖8所示識別結果的相同字段進行比對,如果有不一致的地方說明出現了識別錯誤,當出現識別錯誤時將該信息傳遞到前臺界面,提示用戶進行人工比對和手動矯正。
最后,將識別結果返回到前端進行頁面展示,如圖10所示。
3" 結" 論
本文設計并實現了增值稅發票解析和識別系統,介紹了不同類型發票的解析和識別方法。利用二維碼解析工具對發票圖片的方向進行矯正,并對OCR的識別結果進行驗證,以此保證發票識別結果的可靠性。后續考慮對接國稅局的發票查詢系統,對發票的真偽進行驗證,進一步完善和提升系統的功能。
參考文獻:
[1] 唐詠,王偉波.基于大數據平臺的增值稅發票識別與管理 [J].物聯網技術,2022,12(6):125-126.
[2] 王夢梅,劉浩.基于jQuery Mobile的溫室智能控制系統 [J].信息技術與信息化,2021(6):222-224.
[3] 唐滿華,柳毅,段立軍,等.基于MVC模式的科技管理信息系統設計與實現 [J].計算機技術與發展,2020,30(9):165-170.
[4] 陳亞軍,張程,呂艷靜.《信息技術OFD 檔案應用指南》國家標準解讀 [J].信息技術與標準化,2023(6):11-15.
[5] 張曄.電子文件歸檔格式研究 [D].沈陽:遼寧大學,2021.
[6] 周璐喆.面向PDF文件的研招數據輔助整合軟件研發 [D].南昌:江西財經大學,2021.
[7] 劉艷菊,伊鑫海,李炎閣,等.深度學習在場景文字識別技術中的應用綜述 [J].計算機工程與應用,2022,58(4):52-63.
[8] 劉崇宇,陳曉雪,羅燦杰,等.自然場景文本檢測與識別的深度學習方法 [J].中國圖象圖形學報,2021,26(6):1330-1367.
[9] 仇建民.開源PaddleOCR技術在企業營業執照識別上的改進與實踐 [J].現代信息科技,2021,5(9):65-69+74.
[10] 成日冉.基于嵌入式圖像處理平臺的集裝箱編碼識別系統研發 [D].成都:電子科技大學,2022.
作者簡介:汪香君(1982.05—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:人臉識別、深度學習;林冰清(2000.08—),女,漢族,廣東深圳人,工程師,本科,研究方向:物聯網工程;陳玉強(2002.10—),男,漢族,廣東梅州人,本科在讀,研究方向:數據科學與大數據技術;劉會芬(1983.11—),女,漢族,湖北黃岡人,實驗師,碩士,研究方向:物聯網應用、軟件工程。