報表工具有哪些打印技術?

在 C/S 時代,報表是由應用程序顯示的,可以直接操控打印機來實現打印。進入到 B/S 時代後,報表呈現變成瀏覽器的事情了,而瀏覽器中的 JS 編程不能直接控制打印機,只能依靠瀏覽器本身的打印能力。這種方式下的問題很多,比如不能精確分頁,瀏覽器一般是根據用戶設置的頁面大小和 web 頁面的內容多少來自行決定分頁位置,程序員很難控制;再比如不能準確對齊邊邊距及打印文字,無法實現發票套打等功能。

瀏覽器爲彌補這些能力,提供了 ActiveX 控件,這相當於把原來的 C/S 前端程序搬進了瀏覽器,這樣就可以解決打印精確度和分頁可控性等問題。但是 ActiveX 有很嚴重的安全問題:只要電腦的用戶可以完成的任務,它都可以完成,比如它可以存取註冊表、可以隨意訪問本地文件系統等。這一點嚴重違背了瀏覽器的原則,所以後來逐漸被禁用了。

很多報表工具是 Java 寫成的,而 ActiveX 技術常常和 Java 並不相容。爲了更好的兼容 Java,瀏覽器也提供了 Java Applet 來嵌入 Java 程序,可以把 Applet 理解爲用 Java 編寫的 ActiveX。這樣也就可以在瀏覽器端利用 Java 的能力實現打印了,也就是 Applet 打印。Applet 打印對於精確度和分頁的處理幾乎做到了完美,而且打印速度也比較快:

imagepng

但是,Applet 打印也有不足之處,主要體現在兩方面:一個是 Applet 方式本身的配置要求嚴格,一個是 Java 和瀏覽器的升級引起的一系列問題。Applet 要求客戶端至少安裝了 jre,這點操作對人員要求有點高了。雖然 Applet 比 ActiveX 的安全性要好一點,但仍有安全問題。近年來瀏覽器都強化了安全性,對 Java Applet 也進行了限制,要求進行數字簽名,所以 Java7 以上版本打印時容易彈出以下對話框,添加了用戶操作:

imagepng

谷歌瀏覽器乾脆從 42 版本開始禁用了 Java 插件,火狐瀏覽器也隨後禁用了 Java 插件,目前就只有 IE 內核的瀏覽器支持,雖然現在適用面很窄了,但也有一些用戶仍然選擇使用該方式。

Flash 是瀏覽器中一直可以使用且安裝率很高的通用插件,它有較強的圖形呈現等能力,而且可以編程,於是被想到用來實現打印。Flash 打印方式的出現解決了打印操作複雜度高、瀏覽器資源佔用多的問題。它的實現原理是:客戶端點擊打印後會觸發 Flash Player 插件(插件幾乎瀏覽器都自帶,一般不會給終端帶來安裝的麻煩,而且瀏覽器資源佔用少),Flash 會按照傳遞過來的內容再畫到自己的面板中,然後傳到打印機打印,總體來看打印速度也挺快的。Flash 打印也屬於精確打印,矢量打印模式下內容不失真。

imagepng

現在雖然用 Flash 打印的比較多,但是 Flash 打印有個無法解決的弊端,就是它自身的安全沙箱機制,這個機制不允許傳遞紙張信息,那麼就會造成一個問題:客戶在打印前需要手動調整紙張。

PDF 打印也是替代 applet 打印的一種常用打印方式,它的實現的原理是是從服務器端下載一個 PDF 文件流,然後調用 Adobe Reader,從而利用 Adobe 實現打印功能。也因此要給瀏覽器安裝對應插件,不過一般情況下系統安裝 Adobe Reader 後會自動給 瀏覽器安裝對應插件。

PDF 打印是 Adobe Reader 打印的,前端並沒有自編的代碼了,好處是徹底沒有安全性問題了,不用擔心服務器端的惡意代碼攻擊本地電腦,但缺點是無法進行復雜的邏輯控制,比如無法在打印界面進行打印縮放、清除圖層、鏡像打印、分欄等設置。

小結 1

每種打印方式都有它各自的優勢和不足,一個好的報表工具,除了 ActiveX 外,應當同時支持其他幾種打印方式,以便於讓用戶在不同需求場景下自由選擇使用。

以上技術解決了精確打印的問題,而報表打印還有些其他常見的特殊需求:

靜默打印

靜默打印是指點擊打印時不彈出選項窗口和打印機設置窗口,直接把報表結果輸出到打印機。報表工具應提供靜默打印前臺實現方式。

例如提供前臺 js 方法:

Applet 直接打印:directPrintReport(‘report1’)

Flash 直接打印:directFlashPrintReport(‘report1’)

Pdf 直接打印:directPdfPrintReport(‘report1’)

套打

套打是基於一個模板文件,把數據打印到指定位置的一種打印方式,這種打印需求實現的難點在於如何對內容進行精準定位,以及多頁打印下的處理。類 excel 或者 excel 報表工具可以方便製作模板文件:

imagepng

分頁處理應該由報表工具自行處理,不需要用戶額外添加相關代碼,強制分頁機制要健全且易操作:

imagepng

批量打印

批量打印是指點擊一次打印按鈕就可以實現多張報表的打印輸出。報表工具應該本身提供批量打印功能,且支持的打印方式越多越好。使用方式也要儘可能的簡單易用,例如通過 URL 直接拼不同報表參數實現 pdf 批量打印:http://localhost:6868/demo/reportJsp/pdfBatchPrint.jsp?report={t1.rpx}{t2.rpx(arg1=1;arg2=2)} 由 URL 可以看出可以支持拼接不同帶參數的報表文件,這一點也是需要批量打印支持的,另外,報表工具提供的批量打印還需要支持縮放打印、橫縱向混合打印。

小結 2

靜默打印、套打、批量打印一般也是報表工具自有的功能,只是可能提供的實現方案不一樣。當然,報表工具提供的實現操作配置越簡單越好。

擴展閱讀:
淺談報表工具的打印方案
如何實現報表直接打印需求
如何實現報表的批量打印需求
報表工具實現單據套打

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章