突破技術限制,實現Web端靜默打印

作爲Web開發的同僚們,估計都有一個共同的煩惱,Web端爲什麼不能夠像 CS端那樣直接打印預覽?直接移除掉打印預覽界面不就可以了?

真實情況是Web端受限於瀏覽器的權限,無法直接訪問打印機等本機資源。所以,在Web上實現無預覽和打印並不是一個簡單的問題,而是突破權限、突破平臺的問題。這就導致了用戶在打印報表時,至少需要點擊兩個按鈕才能完成打印,如果是需要批量打印的場景,用戶則需要重複多次點擊按鈕,非常麻煩。

而不瞭解詳細內情的甲方則會非常不解,這麼簡單的一個訴求,只是省去點擊一個操作步驟,爲什麼你們辦不到呢?

這種對於我們卑微乙方的靈魂拷問,讓我們也很頭疼,不是我們辦不到,是客觀條件不允許我們辦到。

作爲一個資歷比較老的 Wyn Enterprise(讀音:One)嵌入式BI和ActiveReports報表控件的技術顧問,這兩年接觸的客戶,基本不再使用 Winform或WPF了,大部分項目都遷移到B/S 端,採用前後端分離的架構,或者 MVC。

在這種情況下,客戶都會面臨需要打印卻無法直接連接打印機,進行默認打印的能力。如果是物流行業的企業或者生產製造企業,網頁端打印,都是批量性的操作,比如物流單,每次批量打印上千張,如果每打印一張彈出一次打印預覽界面,可能用不了多久,我們的可愛的甲方會將我們的電話打爆炸。

在如此嚴峻的形勢之下,外加衆多用戶都追着詢問這個問題,靜默打印在 Web端的功能實現也是非常急迫的。

現在大部分打印過程基本是將需要打印的內容導出爲PDF文件,然後調用瀏覽器的打印預覽,進行打印。既然有了第一步,就一定有直接實現靜默打印的方法,。以下是本人搜索全網,覺得比較合適的內容,現將結果分享給大家。

實現思路有兩種:

  1. 設置瀏覽器
  2. 安裝插件,使用代理軟件

話不多說直接乾貨,看看測試結果。

設置瀏覽器

有限制的地方就會有需求,既然打印時瀏覽器限制,那麼就一定也有別的用戶也有我們同樣的需求,方法總比困難多。搜索後,我們找到在Chrome 和火狐瀏覽器的設置中,有解決的方法,這法子看着像模像樣,點贊也很多:

大致內容是:

  1. 進入 Chrome的高級設置,設置瀏覽器默認的主頁爲我們的 Web應用需要靜默打印的頁面。跟着介紹,我們也操作起來。
  • 點擊設置
  • 外觀-設置顯示主頁按鈕,並輸入我們要訪問的 Web頁面。

  • 打開桌面快捷方式,修改在後綴輸入--kiosk --kiosk-printing。

而走到這一步,此路就不通了。系統會一直彈出如下的錯誤,無法修改。

讓我們換個瀏覽器試試。

  1. 修改-火狐瀏覽器

  2. 在瀏覽器輸入:about:config

  3. 在輸入框輸入 print.always_print_silent

並設置爲Boolean 類型,點+號

  1. 重啓-測試打印

此時系統依然會彈出打印預覽對話框,此方法依舊無效。

使用代理軟件

JSPrint

使用方法簡單,先用Demo網站調用JSPrintManager打印藉口接口,然後使用客戶端進行代理,就可以實現打印。支持的平臺有:windows 10, IE,Edge, 火狐,Chrome,Safari。

下面是一些常用能介紹。

使用用戶選擇打印機代碼示例:

const cpj = new JSPM.ClientPrintJob();

cpj.clientPrinter =  new JSPM.UserSelectedPrinter();

const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);

cpj.files.push(printFile);

await cpj.sendToClient();

會出現打印對話框

使用默認打印機

const cpj = new JSPM.ClientPrintJob();

cpj.clientPrinter =  new JSPM.DefaultPrinter();

const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);

cpj.files.push(printFile);

await cpj.sendToClient();

使用安裝的打印機

const cpj = new JSPM.ClientPrintJob();

cpj.clientPrinter =  new JSPM.InstalledPrinter('Microsoft Print to PDF);

const printFile = new JSPM.PrintFilePDF(fileUrl, JSPM.FileSourceType.URL, fileName, copiesNumber);

cpj.files.push(printFile);

await cpj.sendToClient();

獲取打印機列表:

const printersInfo = await JSPM.JSPrintManager.getPrintersInfo();

console.log(printersInfo);

JSPrintManager使用起來並不難,但在的使用過程中,存在一些較爲明顯的技術限制。 在測試過程中,我們發現由於未知的因素,會出現舊示例無法使用工作,需要我們新建一個示例來完成JSPrint的靜默打印的調用;除此之外,這種方法在火狐瀏覽器中無法正常執行。如果你是Mac OS需要注意,一旦試用JSPrintManager將無法卸載。

Wyn Enterpriese

實現在線報表設計,預覽及靜默打印一體功能 Wyn Enterprise V5.0 Update1 帶來了突破性的報表打印——靜默打印。

示例下載:

https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MTgzNDk3fDg2YWRhNTgyfDE2NDA1OTEzMzd8MjkzODJ8MTM2MTU1

操作步驟:

1 、啓動打印代理服務(打印代理是使用PowerShell腳本完成的)

包含文件如下:

啓動代理必須的環境資源: 1、【Visual Studio 2022】(https://visualstudio.microsoft.com/vs/) 17.0 及以上版本(編譯實例需要) 2、【.NET 6.0 SDK】 (https://www.microsoft.com/net/download) 3、【.NET Core Hosting Bundle】(https://docs.microsoft.com/en-us ... view=aspnetcore-5.0) (IIS 部署環境)

資源文件介紹:

./switchPrinter.ps1   切換默認的打印機資源

`./start.ps1`  啓動和安裝打印服務

./stop.ps1  停止服務
 ./build.ps1  如果修改了 src文件夾下的文件,需要啓動該腳本,進行重新編譯,編譯的項目會放置在./PrintAgent 文件夾中
 ./debug.ps1 如果修改了src文件夾,可以使用該腳本進行調試。

啓動代理服務器: 將示例下載後,以管理員權限打開powershell 工具可先執行以下命令:

  • 執行命令 Set-ExecutionPolicy Bypass -Scope CurrentUser -Force 啓用執行腳本功能

  • 調用 ./switchPrinter.ps1 命令選擇默認的打印機

  • 使用 ./start.ps1 命令啓動服務,如果結束後,調用./stop.ps1 關閉案例

2、啓動成功後,我們再來運行WynReportDesigner 或WynViewer示例: 執行這些示例,會自動加載到默認的打印機選項,。實現打印需求。

該示例代理使用葡萄城內部的PDF打印庫進行無聲打印。 可以通過附件中的powerhellpowershell腳本啓動Agent並在Windows 10上註冊其自動運行。

配置成功後,可以看到點擊打印按鈕後,後臺會連接默認的打印機進行打印。

總結

解決靜默打印是沒有捷徑可以走的,設置瀏覽器該方法是看着是非常便捷,但是結果是並無效果。這時使用代理是一個行之有效的方法,但是現成的智慧結晶往往需要一些知識付費。Anyway,方法總比困難多,如果大家在遇到類似的需求時,也不用發愁,現在市面上已經出現了行之有效的方法解決問題。去解決這個問題。

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