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

bubblegum發表於2020-07-20

在 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 批次列印: 由 URL 可以看出可以支援拼接不同帶引數的報表檔案,這一點也是需要批次列印支援的,另外,報表工具提供的批次列印還需要支援縮放列印、橫縱向混合列印。

小結 2

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

擴充套件閱讀:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2701474/,如需轉載,請註明出處,否則將追究法律責任。

相關文章