通用打印

    技术2022-05-19  22

    这里的打印采用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();

            }

        }

     

     即使是更加复杂的打印,也可以采用同样的道理打出来,只需要校准好位置即可。为了演示,文中的字段值都是直接简单赋值,当然可以采用从输入设备中读取的值。

     


    最新回复(0)