按照已有的模板打印小票<二>
——調用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("\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方法傳入帶有字體樣式的內容的參數,就可以了。
如果打印的模板沒有這么多的樣式變化。代碼還可以更簡便些。。和我寫的加以綜合自己摸索摸索吧。