打印的原理是:生成mdi文件,系統碰到mdi的時候會自動以打印的方式處理。所以,不管用什么模板,什么方式;能在PrintPage事件處理中,生成一張要打印內容的圖片就OK了!
C#實現打印源碼如下:
#region?打印
????????private?void?btnPrint_Click(object?sender,?EventArgs?e)
????????{
????????????//打印預覽
????????????//PrintPreviewDialog?ppd?=?new?PrintPreviewDialog();
????????????PrintDocument?pd?=?new?PrintDocument();
????????????//設置邊距
????????????Margins?margin?=?new?Margins(20,?20,?20,?20);
????????????pd.DefaultPageSettings.Margins?=?margin;
????????????紙張設置默認
????????????//PaperSize?pageSize?=?new?PaperSize("First?custom?size",?800,?600);
????????????//pd.DefaultPageSettings.PaperSize?=?pageSize;
????????????//打印事件設置
????????????pd.PrintPage?+=?new?PrintPageEventHandler(this.pd_PrintPage);
????????????//ppd.Document?=?pd;
????????????//ppd.ShowDialog();
????????????try
????????????{
????????????????pd.Print();
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????MessageBox.Show(ex.Message,?"打印出錯",?MessageBoxButtons.OK,?MessageBoxIcon.Error);
????????????????pd.PrintController.OnEndPrint(pd,?new?PrintEventArgs());
????????????}
????????}
????????//打印事件處理
????????private?void?pd_PrintPage(object?sender,?PrintPageEventArgs?e)
????????{
????????????string?date?=?lblDate.Text;?//當前日期
????????????string?flowId?=?lblFlowId.Text;?//流水號
????????????string?payDate?=?PayDate.Year.ToString()?+?"年"?+?PayDate.Month.ToString()?+?"月";?//應收年月
????????????string?adminId?=?lblAdminId.Text;?//操作員編號
????????????string?baseExpense?=?lblBaseExpense.Text;?//應交基本費用
????????????string?fine?=?lblFine.Text;?//罰款數目
????????????string?upExpense?=?lblUpExpense.Text;?//上月上余
????????????string?actualExpense?=?txtActualExpense.Text;?//實際應交費用
????????????string?chineseExpense?=?DecimalToChinese.ConvertSum(actualExpense);?//實際應交費用的中文大寫
???//讀取圖片模板
????????????Image?temp?=?Image.FromFile(@"Receipts.jpg");
????????????GetResultIntoImage(ref?temp,?UserId,?flowId,?date,?baseExpense,?fine,?upExpense,?actualExpense,?chineseExpense,?payDate,?adminId);
????????????int?x?=?e.MarginBounds.X;
????????????int?y?=?e.MarginBounds.Y;
????????????int?width?=?temp.Width;
????????????int?height?=?temp.Height;
????????????Rectangle?destRect?=?new?Rectangle(x,?y,?width,?height);
????????????e.Graphics.DrawImage(temp,?destRect,?0,?0,?temp.Width,?temp.Height,?System.Drawing.GraphicsUnit.Pixel);
????????}
????????///?<summary>
????????///?將收費結果填充到圖片模板
????????///?</summary>
????????private?void?GetResultIntoImage(
????????????ref?Image?temp,
????????????string?userId,
????????????string?flowId,
????????????string?currentDate,
????????????string?baseExpense,
????????????string?fine,
????????????string?upExpense,
????????????string?actualExpense,
????????????string?chineseExpense,
????????????string?payDate,
????????????string?adminName)
????????{
????????????//讀取圖片模板
????????????Graphics?g?=?Graphics.FromImage(temp);
????????????Font?f?=?new?Font("宋體",?12);
????????????Brush?b?=?new?SolidBrush(Color.Black);
????????????
???//填充數據到圖片模板(位置要在制作圖片模板的時候度量好)
????????????g.DrawImage(temp,?0,?0,?temp.Width,?temp.Height);
????????????g.DrawString(userId,?f,?b,?168,?105);
????????????g.DrawString(UserName,?f,?b,?166,?134);
????????????g.DrawString(flowId,?f,?b,?535,?105);
????????????g.DrawString(currentDate,?f,?b,?535,?134);
????????????g.DrawString(baseExpense,?f,?b,?219,?202);
????????????g.DrawString(fine,?f,?b,?372,?202);
????????????g.DrawString(upExpense,?f,?b,?486,?202);
????????????g.DrawString(actualExpense,?f,?b,?596,?202);
????????????g.DrawString(chineseExpense,?f,?b,?196,?238);
????????????g.DrawString(payDate,?f,?b,?176,?269);
????????????g.DrawString(adminName,?f,?b,?497,?298);
????????????g.Dispose();
????????}
????????#endregion?
轉自:http://hi.baidu.com/zhaogaoyan8/blog/item/d50fbf9a3f66c0bdc9eaf4c7.html
?
?
本文轉自左正博客園博客,原文鏈接:http://www.cnblogs.com/justinw/,如需轉載請自行聯系原作者