前情提要:前陣子,小閃光抱怨家裡的 Fuji Xerox M225dw 印表機的掃描功能只能用電腦操作,沒法由手機掃描直接下載圖檔。我心生一計,家裡的迷你家用伺服器平日閒閒沒事,都快變成冗員,何不寫個 ASP.NET Core 網站放在上面跑。研究了一下,還真找到在 CentOS 安裝事務機驅動程式進行掃描的方法,完成第一步。文章分享後,讀者 smfself 熱心分享其實 FUJIFILM 有出 App 支援手機掃描功能,不過,廠商寫的 App 怎麼比得上針對自己需求量身打造的程式呢?沒有一絲多餘功能,用最少操作步驟得到結果。於是,我的 Side-Project 繼續進行...

之所以想把這個網站寫完,是因為其中有幾項實用技巧,我想加進技能樹:

  1. 從 ASP.NET Core 操作外部程式
    當特殊需求,有現成的 .exe 或 Linux 程式可用,除非呼叫頻率很高、耗用資源較高需共用,或有特殊權限需求,否則直接呼叫外部程式是最簡單粗暴的解法,可輕鬆秒殺。
  2. 接收外部程式輸出
    程式輸出管道分為 stdout 及 stderr,如果大家有 Follow 近期文章,應該已知道如何應用。
  3. 以串流方式即時傳輸到瀏覽器
    掃描程式執行過程會有百分比數字跳動,我想將這個資訊即時同步到瀏覽器上。原本計劃用 Response.Body.FlushAsync() 實現簡易即時進度回報,恰巧因工作專案需求研究到 Server-Sent Events,感覺非適合這個單向傳輸情境,決定一試。

花了點時間,我已經寫好雛型,來看看成果:

展示影片

我是用 .NET 6 寫 ASP.NET Core 專案,操作畫面用 Razor Page + Vue.js + Bootstrap,執行掃描寫在 MVC Controller 中,呼叫 Linux 外部程式 scanimage,由 stderr 接收進度資訊、stdout 接收掃瞄 TIFF 圖檔,再用 ImageSharp 將 TIFF 轉成 JPG。

整個網站全為了專心做好掃描這件事,只有一個介面,選擇彩色灰階或黑白、設 DPI、調紙張大小,按下掃描鈕,即時顯示掃描進度,自動下載圖檔,一氣喝成,沒有半個多餘動作,效率與方便性完全輾壓廠商的 App 呀! (敝帚自珍的極致表現,噗)

專案用到的技術都已有專文分享過,加上有相同需求家裡又剛好有家用伺服器的人數理論值為零,程式部分就不花篇幅介紹了,想參考的同學可至我的 Github 專案結緣。

My side project to provide scan to image service with ASP.NET core.


Comments

Be the first to post a comment

Post a comment