今天附屬公司那邊丟了個需求來,要在微軟報表格服務2005 (SSRS 2005)列印的表單上加上條碼。問我們有沒有外掛程式什麼的能做到這需求。
SSRS 的 Image,可以是 External 來自 URL,我爽快地說“簡單,一個鐘後寫給你”。心想,用 iTextSharp 做個 web ,接受 request 參數是單號,response 個 Image 格式 是 JPEG,多簡單呀。原來,是個悲劇,真丟人。
關鍵是,SSRS 運行時候,URL 中含 ? 號時候,它根本提取不了圖案。它必須是固定路徑的一張圖。要我寫個圖片檔放在臨時目錄什麼的嗎,這樣的事我幹不出來接受不了。SSRS 的另一個問題,是它的重複地區高度無法固定。簡單來說,它是不適合用來列印表格。我是這麼說服自己的。
時間關係,我馬上提出用 ASP 做 report viewer 代替,Report Viewer 當然是用其他控制項,不是 SSRS 那個。那邊接受了,反正他們那個用戶端也只是 Process.Start iexplorer.exe 來顯示單據列印的… ,而且能用的話他們也沒管那麼多。馬上動手,開啟了 RadControls 內的 Reporting 準備匯入 RDL 時候,又發現它不支援 RDL 匯入,只支援 DevExpress、CrystalReport 等等的報表定義匯入。又一個悲劇。
用極速把表格在 RadControls 的 Reporting 內重畫一次,弄個 Report Viewer 控制項在 ASP,測一下還 OK。已經用了兩個鐘了,還沒放條碼上去呢。因為 RadControls Reporting 沒有二維碼,附屬公司他們要 Data Matrix 格式,還是用 iTextSharp 拿 System.Drawings.Image,然後發現出來那個圖案小得可憐…。任由 Reporting 自己 scratch 大小,圖案會變得不清晰,這又要自己 resize 了,白癡一點,做個新的 bitmap 重新畫一次唄。
Code Snippet
- System.Drawing.Image barcode = IPE.BarCode.BarCodeFactory.GetDMCode(textBeforeEncode);
- System.Drawing.Image enlarged = new System.Drawing.Bitmap(barcode.Width * 4, barcode.Height * 4);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(enlarged);
-
- g.DrawImage(barcode, 0, 0, barcode.Width * 4, barcode.Height * 4);
- g.Dispose();
-
- ...
圖案是這樣:
在 IE 上看還是有點模糊,再改一下:
Code Snippet
- System.Drawing.Image barcode = IPE.BarCode.BarCodeFactory.GetDMCode(textBeforeEncode);
- System.Drawing.Image enlarged = new System.Drawing.Bitmap(barcode.Width * 4, barcode.Height * 4);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(enlarged);
-
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
- g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
- g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
- g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
-
- g.DrawImage(barcode, 0, 0, barcode.Width * 4, barcode.Height * 4);
- g.Dispose();
-
- ...
這就 ok 了…。
連部署和測試合計用了足足三個小時,與當初牛逼哄哄的一個鐘相比,唉。