C#打印條碼BarTender SDK打印之路和離開之路(web平凡之路)

       歷來沒想過本身會寫一篇博客,鑑於此次從未知的探索到一個個難點的攻破再到順利打印,很想記錄這些點滴,讓後人少走彎路。web

       下面走進正題。sql

       需求:取數據庫裏的相應的字段數據,並生成條形碼,能夠批量、單條打印。大概意思就是你要搞出來一個高大上的標籤,能夠貼在個人貨堆上。打印機我已經給你買好了,本身看着辦。數據庫

       第一次接觸打印機器,我有點不知所錯。雖然在懵逼中恍惚了一會,可是打印機一到,三七二十一,紅紅火火恍恍惚惚,對於拼機器,我老是樂此不疲,半個小時搞定。直接給你們看下安裝好了的成果。好,上圖。安全

 

                                                            

      這就是支撐咱們此次革命的硬件設施之一,條碼打印機。服務器

      好了,打印機方面的事情就不作過多贅述。鑑於打印機裏有BarTender安裝的軟件,因而我走到了Bartender這條不歸路。工具

      下面給你們聊下在BarTender上我走過的辛酸路。網站

      首先打開BarTender,新建空標籤,過來人告訴你記得拿尺子量好標籤紙的長寬以及標籤紙間距設置完很省心不少,對於橫向縱向本身摸索,太細緻的說我可能一兩天也說不完。ui

而後你能夠按照需求作出你要的模版,大概就是醬紫。spa

                                                       

       模版好了之後,下面就在於取數據上了,在網上搜了好多關於BarTender數據源的方法。本身也作了嘗試,總結一下歸爲兩類,一類是數據庫的鏈接,一類就是文檔信息讀取如(Excel).net

在綁定好數據源之後,就能夠對你想要的個別字段進行數據綁定。

                            

           若是隻是在本機打印的話,你基本上能夠隨心所欲。當時爲了區分已打印和未打印,蛋疼了好久,結果後來發現Bartender支持存儲過程,本機打印的,這絕對是福音,看下圖的自定義sql。綁定的數據源,能夠取出你想要的數據,在處理已打印和未打印的問題上,存儲過程,你值得擁有!

               

在綁定好數據源後,在代碼中進程調用exe便可打印:代碼以下

/// <summary>       
///
/// </summary>
/// <param name="filePath">程序路徑</param>       
/// <param name="BTW_File_Name">模版名稱</param>       
/// <returns></returns>

public Result<string> Print(string filePath, string BTW_File_Name) { try { Process myprocess = new Process(); myprocess.StartInfo.FileName = "bartend.exe";//須要啓動的程序名 if (System.IO.File.Exists(Path.Combine(filePath, "bartend.exe")) && System.IO.File.Exists(Path.Combine(filePath, BTW_File_Name + ".btw"))) { myprocess.StartInfo.FileName = "bartend.exe";//須要啓動的程序名 myprocess.StartInfo.Arguments = "\"/f=" + BTW_File_Name + ".btw\" /p /x";//啓動參數 myprocess.StartInfo.WorkingDirectory = filePath;//須要啓動的程序所在文件夾 myprocess.Start();//啓動 Process[] KillmyProcess = Process.GetProcessesByName("bartend.exe"); foreach (Process process in KillmyProcess) { process.Kill(); } return new Result<string>(true, "打印模版沒數據!"); } else { return new Result<string>(false, "請確保BarTend應用程序和模版是否存在!"); } } catch (Exception ex) { return new Result<string>(false, ex.ToString()); } }

以上是缺陷就是數據源必須寫死,根據一個字段來區分已打印和未打印。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------          

 -------------------------------華麗分割線------------------------------------------------------------------------------------------------------------------------------

以上方法沒有涉及到 BarTender的SDK方法。下面給你們說下利用Bartender中的Seagull.BarTender.Print.dll進行相應的開發。(Bartender安裝文件下的權限最好加一個everone加上全部的權限)

 try
                {
                    string PrintName = "TSC TTP-243E Pro";//"TSC TTP-243E Pro"
                    AppLogger.Warn("引擎new以前");//"記錄日誌方便查找問題緣由"
                    Engine btEngine = new Engine();
                    AppLogger.Warn("引擎new完後,start前");
                    btEngine.Start();
                    AppLogger.Warn("引擎開啓");
                    LabelFormatDocument btFormat = btEngine.Documents.Open(Path.Combine("C://Program Files (x86)//Seagull//BarTender Suite", "模版1" + ".btw"));
                    AppLogger.Warn("模版打開");
                    btFormat.SubStrings["ProjectNo"].Value = DataImportOld.Project_Name;//對模版相應字段進行賦值
                    btFormat.SubStrings["ProjectName"].Value = DataImportOld.Material_Name;
                    btFormat.SubStrings["GroupName"].Value = DataImportOld.WorkingGroup_Name;
                    btFormat.SubStrings["Type"].Value = DataImportOld.Material_Type;
                    btFormat.SubStrings["Color"].Value = DataImportOld.Color;
                    btFormat.SubStrings["Num"].Value = Convert.ToString(True_Number);
                    btFormat.SubStrings["BarCodeName"].Value = builder.ToString();
                    btFormat.SubStrings["Batch"].Value = DataImportOld.Batch;
                    AppLogger.Warn("模版賦值");
                    //btFormat.PrintSetup.Cache.FlushInterval = CacheFlushInterval.PerSession;
                    //btFormat.Close(SaveOptions.DoNotSaveChanges);//不保存對打開模板的修改
                    btFormat.PrintSetup.PrinterName = PrintName;
                    //尋找打印機
                    PrinterSettings.StringCollection snames = PrinterSettings.InstalledPrinters;
                    bool PrintIsExist = false;
                    string logPringter = "";
                    foreach (string Name in snames)
                    {
                        logPringter += Name + ";";
                        if (Name.ToLower().Trim() == PrintName.ToLower().Trim())
                        {
                            PrintIsExist = true;
                        }
                    }
                    AppLogger.Warn("搜索的打印機有" + logPringter);

                    if (!PrintIsExist)
                    {
                        return new Result<string>(false, "打印機不存在");
                    }
                    AppLogger.Warn("開始打印");
                    btFormat.Print();
                    AppLogger.Warn("打印成功");
                    AppLogger.Warn("開始關閉引擎");
                    btEngine.Stop();
                    AppLogger.Warn("關閉引擎成功");
                }
                catch (Exception ex)
                {
                    AppLogger.Warn(string.Format("Exception: " + ex.Message));
                    return new Result<string>(false, string.Format("Exception: " + ex.Message));
                }

        上面截取了一段代碼,徹底能夠實現模版下的隨心所欲。規定好模版,而後把你取的數據賦值到相應的標籤下便可。

        例如:btFormat.SubStrings["ProjectNo"].Value = "隨心所欲";
當時在作模版Btw的時候確實蛋疼過這個ProjectNo怎麼標識讓程序讀懂,綁定數據源又不能夠直接綁定,着實瘋了一段時間,最後摸索出來Bartender下如何設置標識。上圖:

           就這麼簡單。。。。。。不過摸索起來,本身一個一個打印嘗試簡直要人命,我不肯回憶。。。

           好了,說到這裏你們以爲個人問題基本解決了。過了段日子,當我把網站部署到服務器上的時候,而後想到條碼打印這塊,隱約感受到!@#¥%@#¥%%……&對,這就是個人心情

           發佈到iis 涉及不少權限問題,網上扒了一下,有以下幾個方法解決相關問題,感謝這些給出解決方法的達人們。

     「iis默認是用network service這個帳戶去執行一系列操做的,包括以前SDK中寫到的,btEngine.Start();這句代碼。這就跟在web上執行打開excel或word文件是同樣的。network service帳戶默認是沒有對bartender模板文件的讀寫權限的。因此這裏咱們須要設置一下network service的權限。控制面板》管理工具》組件服務》計算機》個人電腦》DCOM配置找到以bartender單詞開頭的幾個服務。右擊服務》屬性》安全 所有改成自定義 而且這三項編輯裏面添加帳戶,加入 network service帳戶,並給與其最大權限。而後咱們回到iis上,選擇咱們發佈的網站》雙擊身份驗證(在內容視圖界面)右鍵ASP.NET模擬》編輯》特定用戶》設置》填寫administrator帳戶及密碼(注意必須爲administrator帳戶設置密碼)」

          發佈到服務器上之後就遇到了客戶端打印的問題。

          在解決web客戶端打印的問題上推薦一篇很好文章http://blog.csdn.net/thecityofsky/article/details/6713870。其實最好的方法是作個相應的插件,惋惜本身對插件這塊仍是一片空白,因此在糾結完各類方法後。本身仍是作了一個super simple客戶端,經過wcf對相應數據進行監控,數據推送打印任務後調用客戶端的打印機進行打印。儘管方法不如插件之類的高大上,可是解決了現有的問題。下面展現下打印的成果,關於隱私的東西已經打碼,哈哈哈

         好了,到這裏已經差很少了,相關的dll和樣例我都打包在這裏了http://download.csdn.net/detail/jafic/9585409。有興趣的能夠下載看看。

        

         Ps:30天過去了,Barternder試用功能沒有了。鑑於工廠須要多臺打印機購買安裝正版Bartender須要很大的成本,因而我走上了告別Bartender之路。

       

         鑑於咱們的打印機是TSC,它也提供了相關的接口dll,所以最後直接告別Bartender軟件直接打印條碼。

 

        關於TSC的解決方案、dll我都打包在了這裏,有興趣的能夠下載看看http://download.csdn.net/detail/jafic/9585459

 

 

                                                                                                                                             謝謝你們,轉載請標註來源~

                                                                                                                                                    技術無罪,請尊重知識分享

相關文章
相關標籤/搜索