作為Web開發的同僚們,估計都有一個共同的煩惱,Web端為什麼不能夠像 CS端那樣直接列印預覽?直接移除掉列印預覽介面不就可以了?
真實情況是Web端受限於瀏覽器的許可權,無法直接訪問印表機等本機資源。所以,在Web上實現無預覽和列印並不是一個簡單的問題,而是突破許可權、突破平臺的問題。這就導致了使用者在列印報表時,至少需要點選兩個按鈕才能完成列印,如果是需要批量列印的場景,使用者則需要重複多次點選按鈕,非常麻煩。
而不瞭解詳細內情的甲方則會非常不解,這麼簡單的一個訴求,只是省去點選一個操作步驟,為什麼你們辦不到呢?
這種對於我們卑微乙方的靈魂拷問,讓我們也很頭疼,不是我們辦不到,是客觀條件不允許我們辦到。
作為一個資歷比較老的 Wyn Enterprise(讀音:One)嵌入式BI和ActiveReports報表控制元件的技術顧問,這兩年接觸的客戶,基本不再使用 Winform或WPF了,大部分專案都遷移到B/S 端,採用前後端分離的架構,或者 MVC。
在這種情況下,客戶都會面臨需要列印卻無法直接連線印表機,進行預設列印的能力。如果是物流行業的企業或者生產製造企業,網頁端列印,都是批量性的操作,比如物流單,每次批量列印上千張,如果每列印一張彈出一次列印預覽介面,可能用不了多久,我們的可愛的甲方會將我們的電話打爆炸。
在如此嚴峻的形勢之下,外加眾多使用者都追著詢問這個問題,靜默列印在 Web端的功能實現也是非常急迫的。
現在大部分列印過程基本是將需要列印的內容匯出為PDF檔案,然後呼叫瀏覽器的列印預覽,進行列印。既然有了第一步,就一定有直接實現靜默列印的方法,。以下是本人搜尋全網,覺得比較合適的內容,現將結果分享給大家。
實現思路有兩種:
- 設定瀏覽器
- 安裝外掛,使用代理軟體
話不多說直接乾貨,看看測試結果。
設定瀏覽器
有限制的地方就會有需求,既然列印時瀏覽器限制,那麼就一定也有別的使用者也有我們同樣的需求,方法總比困難多。搜尋後,我們找到在Chrome 和火狐瀏覽器的設定中,有解決的方法,這法子看著像模像樣,點贊也很多:
大致內容是:
- 進入 Chrome的高階設定,設定瀏覽器預設的主頁為我們的 Web應用需要靜默列印的頁面。跟著介紹,我們也操作起來。
- 點選設定
- 外觀-設定顯示主頁按鈕,並輸入我們要訪問的 Web頁面。
- 開啟桌面快捷方式,修改在字尾輸入--kiosk --kiosk-printing。
而走到這一步,此路就不通了。系統會一直彈出如下的錯誤,無法修改。
讓我們換個瀏覽器試試。
- 修改-火狐瀏覽器
- 在瀏覽器輸入:about:config
- 在輸入框輸入 print.always\_print\_silent
並設定為Boolean 型別,點+號
- 重啟-測試列印
此時系統依然會彈出列印預覽對話方塊,此方法依舊無效。
使用代理軟體
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...;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,方法總比困難多,如果大家在遇到類似的需求時,也不用發愁,現在市面上已經出現了行之有效的方法解決問題。去解決這個問題。