唐俊杰
(昆山市房屋維修資金管理中心,昆山215300)
房屋維修資金是房屋公共部位維修改造的保障資金,因此房屋維修資金的收取至關重要[1-2]。溫州市房屋維修資金管理中心李彥[3]科長談到,收據由管理中心負責打印,新建房屋的維修資金由開發商代繳代收,房屋交付時,開發商再向業主收取,并提供統一的收款收據。房屋維修資金收據有著重要意義,它是業主繳納房屋維修資金的唯一憑證,紅河州住宅專項維修資金管理中心趙群[4]談到改善房屋維修資金管理的措施中,提到需要做好房屋維修資金收據的日常管理。收據打印作為收據管理的第一環節,尤為重要。通過對江蘇、浙江地區的調研,發現收據打印的共性問題,即無法通過現有的系統進行收據打印。近幾年來,房屋維修資金在管理中暴露出越來越多的問題,很多政府部門都希望建立新的房屋維修資金信息化系統來解決突出問題[5],構建新的信息化系統或者在原有系統上做功能更新又需要一定的時間成本和金錢成本。本文針對以上問題,使用PHP、二維碼[6-9]等技術,以較低的成本,幫助暫時不打算更換現有系統的政府部門實現收據批量打印及信息化管理。
使用PHP、JavaScript、HTML作為軟件開發語言,UltraEdit作為軟件開發IDE、文本編輯器,Apache作為Web服務器軟件,Lodop作為Web打印控件,通過APPserv實現在Web服務器上一鍵安裝PHP、Apache等軟件。
打印方案的實現,主要需要考慮如下問題:①打印機的選擇;②如何獲取打印數據;③如何實現批量打印,避免打印偏移。
房屋維修資金收據一般由財政局提供,一式四聯,具有復寫功能,為此噴墨打印機、激光打印機雖然有著自己的優勢,卻無法實現多聯紙的打印,而針式打印機利用機械原理,在打印時,用打印針撞擊色帶和多聯收據,完成打印任務。針式打印機一般有9針、24針兩種規格,9針的針式打印機打印分辨率一般橫向小于160 dpi,縱向小于144 dpi,不支持縱向、橫向相同分辨率,無法打印二維碼[10],而24針的打印機,每一個平方英寸水平、垂直各打印360個點,打印分辨率可以達到360 dpi,由于房屋維修資金收據打印,涉及二維碼的打印,而二維碼對打印分辨率要求較高,因此選擇24針的針式打印機。
目前政府部門使用的房屋維修資金管理軟件產品有很多。浙江省75%的城市都使用由杭州安創科技有限公司開發的房屋維修資金管理系統;蘇州大市范圍內,使用博彥泓智科技(上海)有限公司開發的房屋維修資金管理系統;昆山市2015年之前,使用由杭州安創科技有限公司開發的房屋維修資金管理系統,2015年之后使用由建行軟件中心開發的房屋維修資金管理系統。
本文以昆山市為例,實現收據批量打印信息化。昆山市房屋維修資金現有系統支持繳款明細數據的導出,因此打印數據的獲取,可以通過系統查詢并將數據下載到本地,再通過程序讀取本地數據的方式來實現。
廠家印制的收據與針式打印機兼容性不好,批量打印收據時,往往打印收據數一多,上下偏移現象嚴重。根據此現象,針對針式打印機實際使用情況,以組為單位,每次打印一組,設計相關打印邏輯,調用相應的打印控件,進行收據打印。如何調用打印控件,實現精準打印,也有很多解決方案。
在硬件方面,需要一臺普通的辦公電腦,一臺針式打印機。本文選擇富士通DPK500作為測試機型,該機型打印頭上的打印針數量是24根,打印分辨率可達360 dpi。在軟件方面,除了Ul?traEdit、Lodop是付費軟件,其他都是開源軟件,總體成本并不高。
程序主要有以下4大功能組成,即數據讀取、明細預覽、收據二維碼生成、收據批量打印。數據讀取功能主負責將下載好的數據文件讀到內存中;明細預覽功能負責將讀取到內存中的數據有選擇性的顯示到網頁中,供用戶預覽、確認;收據二維碼生成功能負責將房屋維修資金系統中的房屋ID轉換成二維碼圖片;收據批量打印功能負責將用戶需要的信息打印打印到收據上,并與針式打印機聯動,實現收據批量打印,同時執行打印優化邏輯,降低打印偏移率。
由用戶將明細數據保存到指定的數據文件中print.txt,PHP頁面實現數據文件的讀取。PHP核心代碼如下:

通過數據讀取功能,獲取相應的字段,通過PHP程序,動態地生成靜態HTML網頁代碼,并將字段內容也一并嵌入的HTML代碼中。PHP核心代碼如下:


二維碼又稱二維條碼,目前常用的二維碼為QR Code(quick response),可以通過多種IT技術生成QR Code。如Google開放的API、PHP類庫PHPqrCode、基于jQuery框架的插件Qrcode.js[11]。
本文使用PHPqrCode類庫,通過include函數將phpqrcode目錄下的phpqrcode.php文件引用到PHP程序中。QRcode::png函數實現將房屋ID轉化為二維碼并以圖片的格式保存到指定的目錄中。為了使打印程序便捷的調用收據二維碼,文件名設置為房屋ID。
QRcode::png函數中,第一個參數表示待轉化的值,第二個參數表示生成圖片的目錄,如果不想生成,可以設置為false,第三個參數表示二維碼的容錯率(L表示7%,M表示15%,Q表示25%,H表示30%),表示可被覆蓋的區域百分比。第四個參數表示控制生成二維碼圖片的大小。
考慮到針式打印機的打印分辨率不高,所以因盡量根據實際情況,選擇與針式打印機相適應的容錯率及二維碼圖片大小。容錯率越高,存儲的信息也越多,二維碼也越復雜,對打印分辨率要求也越高。圖1展示了四張容錯率不同,內容相同的二維碼圖片,供讀者參考,內容為“Old_ID=B5226765”。

圖1 二維碼容錯率對比圖
為了區分二維碼的內容是現有系統的ID,還是以后新系統的ID,在現有系統不變更的情況下,將$ID_value的值設置為“Old_ID=”開頭,用以區分新老系統。
PHP核心代碼如下:

收據打印內容從HTML字段元素以及指定二維碼目錄中獲取。Web打印控件主要有三種:一種是微軟的WebBrowser控件,一種是由夢泰爾軟件工作室研發的Lodop打印控件,另一種是Java的Applet打 印 控 件。WebBrowser、Applet在 打 印控制方面、使用環境方面等存在一些不足[12-13],因此本文采用Lodop控件實現房屋維修資金收據精準打印。通過兩個函數實現收據打印功能。
3.4.1 打印控制函數MyPrint
該函數可以設置打印紙張的大小,設置打印邏輯,通過優化后的打印邏輯,做到了打印效率與打印上下偏移的平衡,用戶在網頁上點擊打印按鈕,首先會調用此函數。
本文以昆山市房屋維修資金收據為實驗對象,該收據的大小為:長190 mm,寬101 mm。通 過 函 數LODOP.SET_PRINT_PAGESIZE(1,"190 mm","101 mm","CreateCustomPage")設置紙張大小,經測試,始終無法完美匹配打印模板,打印5張收據就會發生向下偏移,經分析,偏移的原因可能是針式打印機、收據孔距之間不兼容,導致即便設置寬度101 mm,但實際打印效果卻并不正確。
寬度的設置至關重要,設想如果一張紙上打印字符的高度偏差1 mm,20張紙就要2 cm。通過反復測試,發現無論設置何種收據寬度,當收據打印到一定數量時,都無法避免收據內容上下偏移的現象。為此,根據針式打印機的卡紙頻率、線圈發熱以及打印效率等因素綜合考慮,優化打印邏輯,將寬度參數設置為101.6 mm,12張為一組,進行打印,打印結束,按針式打印機復位按鈕,復位第一張待打印的收據位置,復位完成后,繼續打印。
函數MyPrint程序流程圖圖2。

圖2 MyPrint程序流程
3.4.2 收據打印函數CreateOnePage
該函數可以實現將指定行打印到收據上。
函數CreateOnePage打印預覽效果見圖3,實際打印效果見圖4,為了保護業主房屋隱私,打印的房屋數據為本文虛構,核心PHP代碼如下:

//獲取該行的房屋維修資金房屋ID,通過HTML字段元素的值獲取


圖3 打印預覽

圖4 實際打印效果
房屋維修資金收據打印是維修資金歸集業務中必要環節,而有些政府部門的收據打印還處于較原始的階段。新系統的研發、新功能的升級,會涉及到方方面面,不一定容易推進下去。本文就以上矛盾問題,提出一種打印方案,幫助相關政府部門,在維持現有系統的基礎上,實現收據的批量打印,同時在收據上打印二維碼,為以后房屋維修資金業務拓展留了入口,對處于信息化系統建設過渡期的政府來說,是一個很好的打印思路。
本文通過PHP、Lodop、PHPqrCode類庫等Web技術,針對原有系統支持數據導出的政府部門,實現了房屋維修資金收據的批量打印,節省了政府部門的時間,降低了偏移概率。但是本文提出的收據打印邏輯還需要進一步研究,在實際工作中,發現印刷廠印刷的收據,可能因為生產工藝的問題,批次的不同,收據的寬度、孔距也會有略微的差異,這對預先設定好參數的打印優化邏輯有一定的影響,為此,如何針對不同批次的收據,通過程序識別自動調整,是下一步研究的方向。