主頁 > .NET開發 > 不干膠、熱敏列印

不干膠、熱敏列印

2020-09-14 15:03:51 .NET開發

倉儲物流的程序中往往少不了一些使用熱敏列印機或者碳帶列印機列印一些條碼、資訊貼在實物或者包裹上

最好的實作方式不過于直接使用熱敏代碼形成文本直接輸出到列印機做列印

但是熱敏代碼也是一門需要特殊的語言,需要學習

故為了更快更方便的實作,就用到了畫布繪制后形成image輸出到列印機

而image也是有要求的,比如輸出的格式、大小直接影響列印的質量

這里介紹下使用微軟的報表布局系結資料轉image輸出到列印機的方式

1、nuget上搜索Microsoft.ReportViewer.Common、Microsoft.ReportViewer.WebForms安裝

2、創建rdlc報表,繪制指定列印輸出的模板大小,對rdlc添加資料集,可以為物件,這里使用物件系結(后臺查詢資料映射給物件)

  可以為界面每個項的屬性進行設定:字體、大小、資料系結、對齊等,也可以動態使用運算式(資料源傳入指定值)

 

 

3、列印入口,為報表系結資料

  

 DeviceInfo的詳細說明見:

  https://docs.microsoft.com/zh-cn/sql/reporting-services/image-device-information-settings?redirectedfrom=MSDN&view=sql-server-ver15

  LocalReport.Render使用見

  https://docs.microsoft.com/zh-cn/previous-versions/dd468075(v=vs.140)

  注意:OutputFormat為EMF

      PageWidth、PageHeight為rdlc的大小

  如果需要使用到條碼資訊,則需要宣告byte[] 接收使用BarcodeLib.Barcode相關條碼類生成條碼圖片

  rdlc模板上添加影像控制元件欄位指向byte[]欄位,mime選擇image/png,大小顯示為:調整為合適大小

  測驗時可以保存為圖片,預覽效果圖

public string PrintOutPackage(string Consignee, string ContractCode,string ConsigneeAddress, int count, int cur, string printName, int type=1)
        {
            if (string.IsNullOrWhiteSpace(printName))
            {
                return "沒有選擇列印機";
            }

            using (LocalReport report = new LocalReport())
            {
                report.ReportPath = System.Windows.Forms.Application.StartupPath + "/Content/OutPackage.rdlc";
                report.DataSources.Clear();

                var printModel = new OutPackagePrintModel() { Consignee = Consignee, ContractCode = ContractCode, ConsigneeAddress = ConsigneeAddress, PackageCount = count, CurPackageCount = cur, ConsigneeFontSize = Consignee.Length <= 3 ? "28pt" : Consignee.Length <= 12 ? "16pt" : "12px" };

                var list = new List<OutPackagePrintModel>();
                list.Add(printModel);
                ReportDataSource ds = new ReportDataSource("OutPackage", list);//系結資料源
                report.DataSources.Add(ds);
                report.Refresh();
                string deviceInfo =
                    "<DeviceInfo>" +
                    "  <OutputFormat>EMF</OutputFormat>" +
                     "  <PageWidth>8cm</PageWidth>" +
                     "  <PageHeight>5cm</PageHeight>" +
                      "<PrintDpiX>300</PrintDpiX>" +
                      "<PrintDpiY>300</PrintDpiY>" +
                     "  <MarginTop>0pt</MarginTop>" +
                    "  <MarginLeft>0pt</MarginLeft>" +
                    "  <MarginRight>0pt</MarginRight>" +
                    "  <MarginBottom>0pt</MarginBottom>" +
                    "</DeviceInfo>";
                Warning[] warnings;
                m_streams = new List<Stream>();
                //將報表的內容按照deviceInfo指定的格式輸出到CreateStream函式提供的Stream中,
                report.Render("Image", deviceInfo, CreateStream, out warnings);
            }

            foreach (Stream stream in m_streams)
            {
                stream.Position = 0;
            }

            Image pageImage = Image.FromStream(m_streams[0]);

            if (type == 2)
            {
                //測驗時保存圖片
                pageImage.Save(@"d:\" + $"{cur}_{count}" + ".emf", ImageFormat.Tiff);
                return "已保存圖片";
            }

            //正式時呼叫列印機列印
            var r = Printer.PrintImageData(pageImage, printName, "0", "0");
            if (!r.IsSuccess)
                return r.Message;
            return "";
        }

        private Stream CreateStream(string name, string fileNameExtension,
          Encoding encoding, string mimeType, bool willSeek)
        {
            //如果需要將報表輸出的資料保存為檔案,請使用FileStream物件,
            Stream stream = new MemoryStream();
            BillPrintSteam = stream;
            m_streams.Add(stream);
            return stream;
        }

 

4、生成的圖片輸出到列印機列印:

  將生成的image在列印機端

  可使用PrinterSettings.StringCollection listPrint = PrinterSettings.InstalledPrinters;獲取所有列印機名稱

public static PrintModel PrintImageData(Image pageImage,string PrinterName,string PaperSizeWidth,string PaperSizeHeight)
        {
            bool PrintIsSuccess=false;
            Exception PrintException=null;
            //宣告PrintDocument物件用于資料的列印
            PrintDocument printDoc = new PrintDocument();
            printDoc.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0);
            //指定需要使用的列印機的名稱,使用空字串""來指定默認列印機
            //傳入列印機名稱 則使用傳入的,否則使用當前服務賬戶(登錄為)的默認列印機
            if (!string.IsNullOrWhiteSpace(PrinterName))
            {
                printDoc.PrinterSettings.PrinterName = PrinterName;
            }
            //判斷指定的列印機是否可用
            if (!printDoc.PrinterSettings.IsValid)
            {
                return PrintModel.CreateFailedResult("未能找到默認的列印機!");
            }

            if (!string.IsNullOrWhiteSpace(PaperSizeWidth) && PaperSizeWidth != "0" && !string.IsNullOrWhiteSpace(PaperSizeHeight) && PaperSizeHeight != "0")
            {
                var ps = new PaperSize("Your Paper Name", int.Parse(PaperSizeWidth), int.Parse(PaperSizeHeight)) { RawKind = 120 };//自定義紙張
                printDoc.DefaultPageSettings.PaperSize = ps;
            }
            printDoc.PrintPage += new PrintPageEventHandler(delegate (object sender, PrintPageEventArgs ev)
            {
                try
                {
                    ev.Graphics.PageUnit = GraphicsUnit.Document;
                    //ev.Graphics.CompositingQuality = CompositingQuality.HighQuality;
                    //ev.Graphics.PageScale = 1;
                    if (pageImage == null) return;
                    // Adjust rectangular area with printer margins.
                    Rectangle adjustedRect = new Rectangle(
                        ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                        ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
                        ev.PageBounds.Width,
                        ev.PageBounds.Height);

                    Rectangle srcRect = new Rectangle(0, 0, pageImage.Width, pageImage.Height);
                    // Draw a white background for the report
                    //ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
                    // Draw the report content
                    ev.Graphics.DrawImage(pageImage, srcRect);//, srcRect, GraphicsUnit.Pixel);
                    ev.HasMorePages = false;
                }
                catch (Exception ex)
                {
                    PrintException = ex;
                    PrintIsSuccess = false;
                }
            });

            try
            {
                if (pageImage == null)
                {
                    PrintIsSuccess = false;
                }
                else
                {
                    printDoc.Print();
                    PrintIsSuccess = true;
                }
            }
            catch (Exception ex)
            {
                PrintException = ex;
                PrintIsSuccess = false;
            }

            return PrintModel.Create(PrintIsSuccess, PrintIsSuccess ? "Print Success!" : "Print Fail!", PrintException);
        }
public static List<PrinterModel> GetPrinterList()
        {
            PrinterSettings ps = new PrinterSettings();
            PrinterSettings.StringCollection listPrint = PrinterSettings.InstalledPrinters;
            List<PrinterModel> pList = new List<PrinterModel>();
            for (int i = 0; i < listPrint.Count; i++)
            {
                PrinterModel pm = new PrinterModel();
                ps.PrinterName = listPrint[i];
                pm.PrinterName = ps.PrinterName;
                pm.IsDefaultPrinter = ps.IsDefaultPrinter;
                pm.OrderBy = pm.IsDefaultPrinter ? -1 : i;
                pList.Add(pm);
            }
            return pList.OrderBy(x => x.OrderBy).ToList();
        }

 

以上cs結構下不需要特殊權限

如果為bs結構下或者需要ajax調取列印機的(電子稱重同理可借鑒):

1、可以將列印圖片的方法作為介面宿主到windowsservice上開放埠,安裝在需要列印的電腦上,

  接收的不是image改為圖片的url,得到url后進行download后輸出到列印機

  可以增加介面判斷列印服務是否可用

在app.config增加

<services>
      <service behaviorConfiguration="EnableMetadataBehaviors" name="Shangpin.Logistic.WindowsService.ClientPrintService.ServiceLibrary.PrintService">
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="WebScriptBehavior" bindingConfiguration="HttpJsonpBinding" contract="Shangpin.Logistic.WindowsService.ClientPrintService.ServiceLibrary.IPrintService" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:41943/PrintService" />
          </baseAddresses>
        </host>
      </service>

2、形成圖片的方法作為服務端介面可得到圖片,介面url可匿名給列印服務獲取圖片

在網頁的按鈕上實作ajax跨域請求:

$.ajax({
    url: "http://localhost:41943/PrintService/Print?jsoncallback=?",
    dataType: 'jsonp',
    data: { url: imageUrl, printerName: $("#PrinterList").find("option:selected").val(), paperSizeWidth: paperSizeWidth, paperSizeHeight: paperSizeHeight },
    success: function (data) {
        if (!data.IsSuccess) {
            LG.showError("明細編號" + printArr[i] + "列印失敗:" + data.Message, function () {
                JudgePrintAgain(printArr, i, url, paperSizeWidth, paperSizeHeight);//回圈列印
            });
        } else {
            JudgePrintAgain(printArr, i, url, paperSizeWidth, paperSizeHeight);
        }
    },
    error: function (result) {
        LG.tip('發現系統錯誤 <br />錯誤碼:' + result.status);
    }
});

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/36085.html

標籤:C#

上一篇:關于讀取Excel模板對模板讀寫操作

下一篇:C#中的關于Table的Merge()

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more