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

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

  

java 实现pdf发票二次打印_Text

 

                                                                        如图1

 

一、小票模板

1)  Txt文件编写模板

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

 

java 实现pdf发票二次打印_Text_02

 

           图2

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

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

 

java 实现pdf发票二次打印_java 实现pdf发票二次打印_03

 

                                     图3

3)  始终复制到输出目录

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

 

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

 

java 实现pdf发票二次打印_List_04

 

          图4

 

java 实现pdf发票二次打印_java 实现pdf发票二次打印_05

 

        图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("\r\n", "\n");
            //将content按照\n分开
            return GetFontChangeTemplete(content.Split('\n'));
        }
 
      /// <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方法传入带有字体样式的内容的参数,就可以了。

 

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