zoukankan      html  css  js  c++  java
  • 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二>

                                                            ——调用windows打印机打印 可设置字体样式

    之前写过一篇文章《按照已有的模板输出一(如发票)》,是关于如何给已有的模板赋值。在项目的实践过程中,我又遇到了如何调用windows打印机打印的情况,我觉得有必要记录与分享。

      

                                                                            如图1

     

    一、小票模板

    1)  Txt文件编写模板

    打印小票我们还是用我们一贯的做法,使用模板。先用txt文件写出如图1模板样式中的模板。如图2。(文中txt模板文件取名为排号机小票)

     

               图2

    2)  Txt模板文件放在项目文件下

    写完模板,将模板放在项目的目录下(排号机小票),如图3。

     

                                         图3

    3)  始终复制到输出目录

    将排号机小票模板放在项目中后,还有一个操作很重要,选中排号机小票模板——>右键属性——>复制到输出目录修改为始终复制,生成操作修改为无。如图4-5.

     这一操作是为了每次项目编译后,都能生成模板在bin目录下。

     

              图4

     

            图5

     

     

    4)  给模板赋值

    如图2,我们写了模板,但是并没有给模板赋值,接下来讲如何给模板赋值。

    a)       首先我们得有数据源。

      这里我新建一个类,保存数据源。

       public class PrintTicketModel

        {

            /// <summary>

            /// 烟点名称

            /// </summary>

            public string Ydmc { get; set; }

     

            /// <summary>

            ///序号

            /// </summary>

            public int  Xh { get; set; }

     

            /// <summary>

            /// 交售通道

            /// </summary>

            public int  Jstd { get; set; }

     

            /// <summary>

            /// 烟农姓名

            /// </summary>

            public string   Ynxm { get; set; }

     

            /// <summary>

            /// 卡号尾号

            /// </summary>

            public string  Yhwh { get; set; }

     

            /// <summary>

            /// 当日余量

            /// </summary>

            public decimal Dryl { get; set; }

     

            /// <summary>

            /// 合同余量

            /// </summary>

            public decimal Htyl { get; set; }

     

            /// <summary>

            /// 合同余量

            /// </summary>

            public decimal Zhtl { get; set; }

     

     

            /// <summary>

            /// 等待人数

            /// </summary>

            public int  Ddrs { get; set; }

     

            /// <summary>

            /// 时间

            /// </summary>

            public DateTime  Sj { get; set; }

    }

    b)       给类赋值

    窗体加载后我马上给数据源赋了初始值。

    private void FormPrintTicket_Load(object sender, EventArgs e)

            {

              

                //给默认值

                TicketModel.Ydmc = "姜州烟点";

                TicketModel.Xh = 1007;

                TicketModel.Jstd = 1;

                TicketModel.Ynxm = "张留高";

                TicketModel.Yhwh = "63959";

                TicketModel.Dryl = 598.08m;

                TicketModel.Htyl = 598.08m;

                TicketModel.Zhtl = 600.00m;

                TicketModel.Ddrs = 6;

                TicketModel.Sj = DateTime.Now;

                //赋值

                txtydmc.Text = TicketModel.Ydmc;

                txtxh.Text = TicketModel.Xh.ToString();

                txtjstd.Text = TicketModel.Jstd.ToString();

                txtynxm.Text = TicketModel.Ynxm;

                txtkhwh.Text = TicketModel.Yhwh;

                txtdryl.Text = TicketModel.Dryl.ToString();

                txthtyl.Text = TicketModel.Htyl.ToString();

                txthtzl.Text = TicketModel.Zhtl.ToString();

                txtddrs.Text = TicketModel.Ddrs.ToString();

     

            }

    c)       给排号机小票.txt模板赋值

    接下来讲的很重要,如何给排号机小票.txt模板赋值,以及修改字体样式。

       

          /// <summary>

            ///给模板赋值    

       /// </summary>

            /// <param name=" printTicket ">数据源 </param>

            /// <returns></returns>

     

            public List<ContentWithFontModel> GetTempleteDemo(PrintTicketModel printTicket)

            {

     

                StreamReader objReaderFp = new StreamReader("TicketTemplete\排号机小票.txt", Encoding.UTF8);

                string content = objReaderFp.ReadToEnd();

                //烟点名称

                content = content.Replace("{ybmc}", printTicket.Ydmc);

                //序号

                content = content.Replace("{xh}", printTicket.Xh.ToString());

                //交售通道 -

                content = content.Replace("{jstd}", printTicket.Jstd.ToString());

                //烟农姓名-

                content = content.Replace("{ynxm}", printTicket.Ynxm);

                //卡号尾号

                content = content.Replace("{yhwh}", printTicket.Yhwh);

                ////当日余量-

                content = content.Replace("{dryl}", (printTicket.Dryl).ToString());

                //合同余量-

                content = content.Replace("{htyl}", printTicket.Htyl.ToString());

                //总合同量; -

                content = content.Replace("{zhtl}", printTicket.Zhtl.ToString());

                //等待人数--

                content = content.Replace("{ddrs}", printTicket.Ddrs.ToString());

                //时间--

                content = content.Replace("{sj}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

                content = content.Replace(" ", " ");

                //将content按照 分开

                return GetFontChangeTemplete(content.Split(' '));

            }

          /// <summary>

            ///给模板设置字体样式

            /// </summary>

            /// <param name="contents">模板内容,按照行保存在数组中,以便每行设置字体样式</param>

            /// <returns></returns>

            private static List<ContentWithFontModel> GetFontChangeTemplete(string[] contents)

            {

                List<ContentWithFontModel> contentWithFontModels = new List<ContentWithFontModel>();

                //设置字体

                Font putongFont = new Font("仿宋", 12, FontStyle.Regular);

                Font disFont = new Font("仿宋", 22, FontStyle.Bold);

                //设置画刷

                SolidBrush solidBrush = new SolidBrush(Color.Black);

     

                //设置字体

                for (int i = 0; i < contents.Length; i++)

                {

                    ContentWithFontModel contentWithFontModel = new ContentWithFontModel();

                    if (i == 1)

                    {

                        contentWithFontModel.Content = contents[i];

                        contentWithFontModel.FontStyle = disFont;

                        contentWithFontModel.SolidBrushStyle = solidBrush;

                    }

                    else

                    {

                        contentWithFontModel.Content = contents[i];

                        contentWithFontModel.FontStyle = putongFont;

                        contentWithFontModel.SolidBrushStyle = solidBrush;

                    }

                    contentWithFontModels.Add(contentWithFontModel);

                }

                return contentWithFontModels;

            }

      /// <summary>

       /// 打印内容   字体样式  刷子样式

    /// </summary>

       public class ContentWithFontModel

        {

            /// <summary>

            /// 内容

            /// </summary>

            public string  Content { get; set; }

            /// <summary>

            /// 字体样式

            /// </summary>

            public Font FontStyle { get; set; }

            /// <summary>

            /// 刷子样式

            /// </summary>

            public SolidBrush SolidBrushStyle{ get; set; }

        }

    二、调用windows打印机打印

    以上内容我们已经完成了模板的内容,模板样式。现在就是讲解如何将模板的内容交给windows打印机打印。

      在窗体的工具箱内有一个控件PrintDocument,可以拖动控件编写。我这里没有推动控件,直接使用的PrintDocument类。直接使用PrintDocument要添加引用using System.Windows.Forms;

            /// <summary>

            /// 打印小票

            /// </summary>

            /// <param name="printcontents">带字体的模型</param>

         private void Print(List<ContentWithFontModel> printcontents)

            {

                PrintDocument printDocument = new PrintDocument();

                printDocument.PrintPage += (sender, e) =>

                {

                    int fontheight = 0;

                    foreach (var item in printcontents)

                    {

                        e.Graphics.DrawString(item.Content, item.FontStyle, item.SolidBrushStyle, new Point(0, fontheight));

                        fontheight += item.FontStyle.Height;

                    }

                };

     

                printDocument.Print();

            }

     调用Print方法传入带有字体样式的内容的参数,就可以了。

    如果打印的模板没有这么多的样式变化。代码还可以更简便些。。和我写的加以综合自己摸索摸索吧。

  • 相关阅读:
    ping与telnet的区别
    TCP连接的建立与关闭
    网络的7层协议
    oracle数据库中,分天查询数目
    求某个字符在字符串中的第5个位置
    高精度乘
    高精度加法
    二叉排序树(建树,先序,中序,后序遍历)
    求哈夫曼树的带权路径长度和
    HDU_1237_简单计算器
  • 原文地址:https://www.cnblogs.com/yaoxiaodan/p/6387435.html
Copyright © 2011-2022 走看看