这里的打印采用graphic去画出来,所以,可以根据不同的要求随意的设计模板。同时可以通过图片的形式加载模板。代码如下,此实例参考了网上的一些文章,具体的文字位置不是很准,只做演示:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnPrint_Click(object sender, EventArgs e)
{
//打印预览
PrintPreviewDialog printPreview = new PrintPreviewDialog();
PrintDocument printDocument = new PrintDocument();
//设置边距
Margins margin = new Margins(20, 20, 20, 20);
printDocument.DefaultPageSettings.Margins = margin;
//纸张设置默认
PaperSize paperSize = new PaperSize("First custom Size", 800, 600);
printDocument.DefaultPageSettings.PaperSize = paperSize;
//打印事件设置
printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);
printPreview.Document = printDocument;
printPreview.ShowDialog();
try
{
printDocument.Print();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
printDocument.PrintController.OnEndPrint(printDocument, new PrintEventArgs());
}
}
void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
string date = DateTime.Now.Date.ToShortDateString();//当前日期
string flowID = "20110308";//流水号
string payDate = DateTime.Now.Date.ToShortDateString();//应收日期
string adminID = "12345678";//操作员编号
string baseExpense = "2000";//应交基本费用
string fine = "500";//应交罚款数目
string upExpense = "5000";//上月结余
string actualExpense = "2500";//实际应交数目
//读取图片模板
Image temp = Image.FromFile(@"3dbg.jpg");
GetResultIntoImage(ref temp, flowID, date, baseExpense, fine, upExpense, actualExpense, payDate);
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 flowId,
string currentDate,
string baseExpense,
string fine,
string upExpense,
string actualExpense,
string payDate)
{
//读取图片模板
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(flowId, f, b, 335, 105);
g.DrawString(currentDate, f, b, 335, 134);
g.DrawString(baseExpense, f, b, 19, 202);
g.DrawString(fine, f, b, 172, 202);
g.DrawString(upExpense, f, b, 286, 202);
g.DrawString(actualExpense, f, b, 396, 202);
g.DrawString(payDate, f, b, 176, 269);
g.Dispose();
}
}
即使是更加复杂的打印,也可以采用同样的道理打出来,只需要校准好位置即可。为了演示,文中的字段值都是直接简单赋值,当然可以采用从输入设备中读取的值。