zoukankan      html  css  js  c++  java
  • C#中进行文本打印


    问题描述:
          做了个记事本程序,要求能按标准打印其中的文档,包括在每行文字数目上进行控制等。
    解决方法:
     一、搞清楚打印的过程:
          1、定义PrintDocument类,并且声明其PrintPage事件。
       
    private void PrintDocument()
            
    {
                printDocument 
    = new PrintDocument();
                printDocument.PrintPage 
    += new PrintPageEventHandler(printDocument_PrintPage);
            }
         2、实现PrintPage事件(关键):
        
        /// <summary>
            
    /// 用来处理打印过程的核心事件。
            
    /// </summary>
            
    /// <param name="sender"></param>
            
    /// <param name="e"></param>
            
    /// <remarks></remarks>

            void printDocument_PrintPage(object sender, PrintPageEventArgs e)
            
    {
                
    //StringReader lineReader = new StringReader(textBox.Text);
                Graphics graphic = e.Graphics;//获取绘图对象
                float linesPerPage = 0;//页面行号
                float yPosition = 0;//绘制字符串的纵向位置
                float leftMargin = e.MarginBounds.Left;//左边距
                float topMargin = e.MarginBounds.Top;//上边距
                string line = string.Empty;//读取的行字符串
                int currentPageLine=0;//当前页读取的行数
                Font charFont = richTextBox1.Font;//获取打印字体
                SolidBrush brush = new SolidBrush(Color.Black);//刷子
                linesPerPage = e.MarginBounds.Height / charFont.GetHeight(graphic);//每页可打印的行数
                
    //countNum记录全局行数,currentPageLine记录当前打印页行数。
                while (countNum < richTextBox1.Lines.Length)
                    
    {
                        
    if (currentPageLine < linesPerPage)
                        
    {
                            line 
    = richTextBox1.Lines[countNum].ToString();
                            
    if (line.Length <= 50)
                            
    {
                                yPosition 
    = topMargin + (currentPageLine * charFont.GetHeight(graphic));
                                
    //绘制当前行
                                graphic.DrawString(line, charFont, brush, leftMargin, yPosition, new StringFormat());
                                countNum
    ++;
                                currentPageLine
    ++;
                            }

                            
    else
                            
    {
                                
    //拆分后的行数
                                int moreLine = line.Length / 50 + 1;
                                
    string tempLine;
                                
    for (int i = 0; i < moreLine; i++)
                                
    {
                                    
    //获得当前行的子串
                                    if ((line.Length - i * 50>= 50)
                                    
    {
                                         tempLine 
    = line.Substring(i * 5050);
                                    }

                                    
    else
                                    
    {
                                        tempLine 
    = line.Substring(i * 50, line.Length - i * 50);
                                    }

                                    yPosition 
    = topMargin + (currentPageLine * charFont.GetHeight(graphic));
                                    
    //绘制当前行
                                    graphic.DrawString(tempLine, charFont, brush, leftMargin, yPosition, new StringFormat());
                                    
    //当前打印页行数加1
                                    currentPageLine++;
                                }

                                
    //总行数加1
                                countNum++;
                            }

                        }

                        
    else
                        
    {
                            line 
    = null;
                            
    break;
                        }

                    }

                
    //一页显示不完时自动重新调用此方法
                if (line == null)
                
    {
                    e.HasMorePages 
    = true;
                }

                
    else
                
    {
                    e.HasMorePages 
    = false;
                }

                
    //每次打印完后countNum清0;
                if (countNum >= richTextBox1.Lines.Length)
                
    {
                    countNum 
    = 0;
                }

            }
         3、使用 printDocument.Print()进行打印
     private void 打印PToolStripButton_Click(object sender, EventArgs e)
            
    {
               
    // tsmSave_Click(sender, e);
                
    //初始化PrintDocument()
                this.PrintDocument();
                PrintDialog print 
    = new PrintDialog();
                
    //将初始化后的printDocument赋给print.Document
                print.Document = printDocument;
                
    try
                
    {
                    
    if (print.ShowDialog() == DialogResult.OK)
                    
    {
                        
    //打印时直接调用PrintDocument的Print方法
                        printDocument.Print();
                    }

                }

                
    catch (Exception ex)
                
    {
                    MessageBox.Show(
    "打印出错:" + ex.ToString());
                    
    //出错则结束打印过程
                    printDocument.PrintController.OnEndPrint(printDocument, new PrintEventArgs());
                }

            }
        4、定义打印预览(可选)
      private void 打印预览VToolStripMenuItem_Click(object sender, EventArgs e)
            
    {
                PrintPreviewDialog printPreview 
    = new PrintPreviewDialog();
                
    //初始化PrintDocument
                this.PrintDocument();
                
    //将初始化后的printDocument赋给print.Document
                printPreview.Document = printDocument;
                
    try
                
    {
                    printPreview.ShowDialog();
                }

                
    catch (Exception ex)
                
    {
                    MessageBox.Show(ex.ToString());
                }

            }
    完整代码下载/Files/seek/NotePad.rar
    SIGNATRUE-----------------------------------
    龟看上去很慢很慢,而且还有些憨,虽然没有兔子跑的快,但是只要有坚持不懈的毅力,就一定会到达成功的比彼岸.如果自己是龟,就不要试图把自己变成兔子,我就是那只憨龟。
  • 相关阅读:
    javaweb请求编码 url编码 响应编码 乱码问题 post编码 get请求编码 中文乱码问题 GET POST参数乱码问题 url乱码问题 get post请求乱码 字符编码
    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
    javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
    ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
    HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码
    Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制
    linq查询语句转mongodb
    winddows rabbitmq安装与配置
    Redis For Windows安装及密码
    出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  • 原文地址:https://www.cnblogs.com/seek/p/1192421.html
Copyright © 2011-2022 走看看