• C#多页打印实现


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Drawing.Printing;
    using System.Windows.Forms;
    using System.Drawing;
    
    namespace ConsoleApplication1
    {
        public partial class PrintTxt : Form
        {
            private PrintPreviewDialog PrintPreview = new PrintPreviewDialog();
            private string StreamType;
            private Image image = null;
            private Stream StreamToPrint = null;
            Font mainFont = new Font("宋体", 12);//打印的字体
            public string Filename = null;
    
            //1、实例化打印文档
            PrintDocument pdDocument = new PrintDocument();
            private string[] lines;
            private PrintPreviewControl printPreviewControl1;
            public PrintTxt()
            {
                InitializeComponent();
            }
    
            private int linesPrinted;
            public PrintTxt(string filepath, string filetype)
                : this()
            {
                Filename = Path.GetFileNameWithoutExtension(filepath);
                //订阅BeginPrint事件
                pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);
                //訂閱EndPrint事件,释放资源
                pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);
                //订阅Print打印事件,该方法必须放在订阅打印事件的最后
                FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);
                StartPrint(fs, filetype);
                //打印结束
                pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);
            }
    
            //2、启动Print打印方法
            public void StartPrint(Stream streamToPrint, string streamType)
            {
                //声明返回值的PageSettings A4/A5
                PageSettings ps = new PageSettings();
                //显示设置打印页对话框
                PageSetupDialog Psdl = new PageSetupDialog();
                //打印多页设置
                PrintDialog pt = new PrintDialog();
                pt.AllowCurrentPage = true;
                pt.AllowSomePages = true;
                pt.AllowPrintToFile = true;
    
                printPreviewControl1.Document = pdDocument;//form中的打印预览
                printPreviewControl1.Zoom = 1.0;
                printPreviewControl1.Dock = DockStyle.Fill;
                printPreviewControl1.UseAntiAlias = true;
    
                StreamToPrint = streamToPrint;//打印的字节流
                StreamType = streamType; //打印的类型
                pdDocument.DocumentName = Filename; //打印的文件名
    
                Psdl.Document = pdDocument;
                PrintPreview.Document = pdDocument;
                PrintPreview.SetDesktopLocation(300, 800);
                Psdl.PageSettings = pdDocument.DefaultPageSettings;
                pt.Document = pdDocument;
    
                try
                {
                    //显示对话框
                    if (Psdl.ShowDialog() == DialogResult.OK)
                    {
                        ps = Psdl.PageSettings;
                        pdDocument.DefaultPageSettings = Psdl.PageSettings;
                    }
    
                    if (pt.ShowDialog() == DialogResult.OK)
                    {
                        pdDocument.PrinterSettings.Copies = pt.PrinterSettings.Copies;
                    }
    
                    if (PrintPreview.ShowDialog() == DialogResult.OK)
                        //调用打印
                        pdDocument.Print();
    
                    // PrintDocument对象的Print()方法在PrintController类中执行PrintPage事件。
                }
                catch (InvalidPrinterException ex)
                {
                    MessageBox.Show(ex.Message, "Simple Editor", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    throw;
                }
            }
    
            /// <summary>
            /// 3、得到打印內容
            /// 每个打印任务只调用OnBeginPrint()一次。
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void pdDocument_BeginPrint(object sender, PrintEventArgs e)
            {
                char[] param = { (char)13 };
                char[] trimParam = { (char)10 };//回车
    
                switch (StreamType)
                {
                    case "txt":
                        StringBuilder text = new StringBuilder();
                        System.IO.StreamReader streamReader = new StreamReader(StreamToPrint, Encoding.Default);
                        while (streamReader.Peek() >= 0)
                        {
                            lines = streamReader.ReadToEnd().Split(param);
                            for (int i = 0; i < lines.Length; i++)
                            {
                                lines[i] = lines[i].TrimStart(trimParam);
                            }
                            //lines = lines.Where(l => l.Trim() != "").ToArray();
                        }
                        break;
                    case "image":
                        image = System.Drawing.Image.FromStream(StreamToPrint);
                        break;
                    default:
                        break;
                }
            }
    
            /// <summary>
            /// 4、绘制多个打印界面
            /// printDocument的PrintPage事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void OnPrintPage(object sender, PrintPageEventArgs e)
            {
                int leftMargin = Convert.ToInt32((e.MarginBounds.Left) * 3 / 4);  //左边距
                int topMargin = Convert.ToInt32(e.MarginBounds.Top * 2 / 3);    //顶边距
                switch (StreamType)
                {
                    case "txt":
                        while (linesPrinted < lines.Length)
                        {
                            //向画布中填写内容
                            e.Graphics.DrawString(lines[linesPrinted++], new Font("Arial", 10), Brushes.Black, leftMargin, topMargin, new StringFormat());
    
                            topMargin += 25;//行高为55,可调整
    
                            //走纸换页
                            if (topMargin >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
                            {
                                //如果大于设定的高
                                e.HasMorePages = true;
                                printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
                                /*
                                * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
                                * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
                                */
                                return;
                            }
                        }
                        break;
                    case "image"://一下涉及剪切图片,
                        int width = image.Width;
                        int height = image.Height;
                        if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height))
                        {
                            width = e.MarginBounds.Width;
                            height = image.Height * e.MarginBounds.Width / image.Width;
                        }
                        else
                        {
                            height = e.MarginBounds.Height;
                            width = image.Width * e.MarginBounds.Height / image.Height;
                        }
    
                        System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(topMargin, leftMargin, width, height);
                        //向画布写入图片
                        for (int i = 0; i < Convert.ToInt32(Math.Floor((double)image.Height / 820)) + 1; i++)
                        {
                            e.Graphics.DrawImage(image, destRect, i * 820, i * 1170, image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel);
                            //走纸换页
                            if (i * 1170 >= e.PageBounds.Height - 60)//页面累加的高度大于页面高度。根据自己需要,可以适当调整
                            {
                                //如果大于设定的高
                                e.HasMorePages = true;
                                printPreviewControl1.Rows += 1;//窗体的打印预览窗口页面自动加1
                                /*
                                * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
                                * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
                                */
                                return;
                            }
                        }
                        break;
                }
    
                //打印完毕后,画线条,且注明打印日期
                e.Graphics.DrawLine(new Pen(Color.Black), leftMargin, topMargin, e.MarginBounds.Right, topMargin);
    
                string strdatetime = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString();
                e.Graphics.DrawString(string.Format("打印时间:{0}", strdatetime), mainFont, Brushes.Black, e.MarginBounds.Right - 240, topMargin + 40, new StringFormat());
                linesPrinted = 0;
                //绘制完成后,关闭多页打印功能
                e.HasMorePages = false;
            }
    
    
            /// <summary>  
            ///5、EndPrint事件,释放资源
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void pdDocument_EndPrint(object sender, PrintEventArgs e)
            {
                //变量Lines占用和引用的字符串数组,现在释放
                lines = null;
            }
    
            private void InitializeComponent()
            {
                this.printPreviewControl1 = new System.Windows.Forms.PrintPreviewControl();
                this.SuspendLayout();
                // 
                // printPreviewControl1
                // 
                this.printPreviewControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                            | System.Windows.Forms.AnchorStyles.Left)
                            | System.Windows.Forms.AnchorStyles.Right)));
                this.printPreviewControl1.Location = new System.Drawing.Point(12, 3);
                this.printPreviewControl1.Name = "printPreviewControl1";
                this.printPreviewControl1.Size = new System.Drawing.Size(685, 511);
                this.printPreviewControl1.TabIndex = 0;
                // 
                // PrintTxt
                // 
                this.ClientSize = new System.Drawing.Size(696, 526);
                this.Controls.Add(this.printPreviewControl1);
                this.Name = "PrintTxt";
                this.ResumeLayout(false);
            }
        }
        //PrintTxt simple = new PrintTxt("D://Mainsoft//12.txt", "txt"); 
    }
  • 相关阅读:
    HttpClientUtil
    JacksonUtils
    spring-security oauth2.0简单集成
    python连接mysql
    钉钉机器人消息体
    Android Studio gradle
    Android Studio从Eclipse导项目
    Docker
    Unity WebGL
    主席树
  • 原文地址:https://www.cnblogs.com/AndyGe/p/3047151.html
Copyright © 2020-2023  润新知