C#实现打印与打印预览功能


发表日期:2010年12月31日   作者:whitewin   点击:102次

在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这几个组件的使用还是很复杂的,有必要解释一下。
打印操作通常包括以下四个功能:
1 打印设置 设置打印机的一些参数,比如更改打印机驱动程序等;
2 页面设置 设置页面大小纸张类型等
3 打印预览 类似于word中的打印预览
4 打印

实现打印功能的核心是PrintDocument类这个类属于System.Drawing.Printing名字空间这个类封装了当前的打印设置页面设置以及所有的与打印有关的事件和方法
这个类包括以下几个属性,事件和方法
1、PrinterSettings 属性
  存放打印机的设置信息,这个属性不需要程序员设置,因为它是由打印对话框获取的.
2、PrintCountroller 属性 
  控制打印过程
3、DefaultPageSettings 属性
  存放页面设置信息,打印纸大小方向等,也不需要程序员设置,因为它是由页面设置对话框获取的.
4、DocumentName 属性
  指定文档名称,出现在打印机状态窗口中 
1。 BeginPrint事件
  在打印之前发出
2. PrintPage事件
  每打印一页是发出,事件接受一个PrintPageEventArgs参数该参数封装了打印相关的信息

PrintPageEventArgs参数有很多重要的属性
  1 Cancel 取消打印
  2 Graphics 页面的绘图对象
  3 HasMorePages 是否还有要打印的页面
Print方法:该方法没有参数 调用它将按照当前设置开始打印.
若实现打印功能首先构造PrintDocument对象添加打印事件
PrintDocument printDocument;
private void InitializeComponent()
{
    ...
 // 这里的printDocument对象可以通过将PrintDocument控件拖放到窗体上来实现,注意要设置该控件的PrintPage事件。
    printDocument=new PrintDocument();
    printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
...
}
实现打印事件功能
打印和绘图类似都是调用Graphics 类的方法进行画图 不同的是一个在显示器上一个在打印纸上并且打印要进行一些复杂的计算
如换行、分页等。 
private void printDocument_PrintPage(object sender,PrintPageEventArgs e)
{
    Graphics g = e.Graphics; //获得绘图对象
    float linesPerPage = 0; //页面的行号
    float yPosition = 0;   //绘制字符串的纵向位置
    int count = 0; //行计数器
    float leftMargin = e.MarginBounds.Left; //左边距
    float topMargin = e.MarginBounds.Top; //上边距
    string line = null; 行字符串
    Font printFont = this.textBox.Font; //当前的打印字体
    SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
    linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数
 //逐行的循环打印一页
    while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
    {
       yPosition = topMargin + (count * printFont.GetHeight(g));
       g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
       count++;
    }
 // 注意:使用本段代码前,要在该窗体的类中定义lineReader对象:
 //       StringReader lineReader = null;
    //如果本页打印完成而line不为空,说明还有没完成的页面,这将触发下一次的打印事件。在下一次的打印中lineReader会
    //自动读取上次没有打印完的内容,因为lineReader是这个打印方法外的类的成员,它可以记录当前读取的位置
    if(line != null)
        e.HasMorePages = true;
    else
 {
        e.HasMorePages = false; 
  // 重新初始化lineReader对象,不然使用打印预览中的打印按钮打印出来是空白页
  lineReader = new StringReader(textBox.Text); // textBox是你要打印的文本框的内容
 }
}
打印设置,构造打印对话框 将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument
的PrinterSettings属性中
protected  void FileMenuItem_PrintSet_Click(object sender,EventArgs e)
{
    PrintDialog printDialog = new PrintDialog();
    printDialog.Document = printDocument;
    printDialog.ShowDialog();
}
页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中
protected  void FileMenuItem_PageSet_Click(object sender,EventArgs e)
{
    PageSetupDialog pageSetupDialog = new PageSetupDialog();
    pageSetupDialog.Document = printDocument;
    pageSetupDialog.ShowDialog();
}
打印预览
protected void FileMenuItem_PrintView_Click(object sender,EventArgs e)
{
   PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog();
   printPreviewDialog.Document = printDocument;
   lineReader = new StringReader(textBox.Text);
   try
   {
        printPreviewDialog.ShowDialog();
   }
   catch(Exception excep)
   {
        MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }
}
打印就可以直接调用printDocument的Print()方法因为用户可能在打印之前还要再更改打印设置所以
在这里再次显示打印设置对话框
  protected void FileMenuItem_Print_Click(object sender,EventArgs e)
  {
   PrintDialog printDialog = new PrintDialog();
   printDialog.Document = printDocument;
   lineReader = new StringReader(textBox.Text);
   if (printDialog.ShowDialog() == DialogResult.OK)
   {
       try
       {
         printDocument.Print();
       }
       catch(Exception excep)
       {
              MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
              printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs());
       }
    }
  }
总结打印的过程是 
1 在应用程序窗体初始化时构造PrintDocument对象,添加 printDocument 的 PrintPage 方法 
2 实现PrintPage方法
3 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能
在这中间可能要用到  PrintDialog PrintPreviewDialog PageSetupDialog 设置和查看打印效果这些方法通常是由菜单的单击触发的。

本文来自: 中科软件园(www.4oa.com) 详细出处参考:http://www.4oa.com/Article/html/6/34/501/2005/18114.html
作者做了部分修改和注释。

C#实现打印与打印预览功能相关推荐

  1. 网页中JS实现(调用)打印预览功能

    近期的项目中需要在页面中实现打印预览功能--点击网页中的"打印"(Print),弹出打印预览窗口,点击窗口页面中的"开始打印"(Print),则出现浏览器的打印 ...

  2. DELPHI 打印预览功能

    在很多应用程序中,都需要程序具有打印预览功能,以避免用户由于选择不当出现打印错误. 预览实现方式为通过创建一个Tpanel的派生类并公开它的canvas属性比例尺或视区范围,使用较为不方便,笔者通过实 ...

  3. MFC 基于多文档的打印和打印预览功能的实现

    一.基础知识 1 网上有很多的关于打印的程序,一定要看清楚,是基于对话框dialog的打印功能,还是基于文档的打印功能. 如果分不清基于对话框和文档的区别,建议新建一个单文档.多文档和对话框的工程,看 ...

  4. 敲的php代码怎么预览,php如何实现打印预览功能

    php实现打印预览功能的方法:首先获取当前页的html代码:然后设置打印开始区域和打印结束区域:接着从开始和结束代码向后取html:最好确定要打印的内容即可. 推荐:<PHP视频教程> p ...

  5. Lodop中特殊符号¥打印设计和预览不同

    Lodop中¥符号样式改变问题 Lodop中对超文本样式的解析,虽然说是按照调用的本机ie引擎,但是调用的ie版本可能不同,导致在ie下是一种样式,预览又是另一种样式.可能是有些样式没有具体设置,走的 ...

  6. 用友T6软件设置打印模板后预览没有变化-用友T6

    设置打印模板后预览没有变化 原因分析:操作员在进行打印预览时如果在预览界面选择"保存当前设置",此时会在C盘下生成一个XML格式的文件,无论如何修改单据打印模板,预览调取的都是保存 ...

  7. 自定义模板、自定义打印机、自动打印:grid++ report自动打印、clodop预览和自动打印(electron+vue)

    一.grid++ report选择模板预览和自动打印 这里主要是前后端配合,数据前端传入,打印后端配置. IGridppReport 成员: 封装立即打印,数据格式为: {"reportDa ...

  8. JS - 实现word预览功能

    前端实现word预览功能 一. 文档地址要求 二. 调用方法 1. html方式 2. script方式 XDOC文档预览云服务:http://view.xdocin.com/ 重要的事情说三遍: 注 ...

  9. 关于Java项目中,word和Excel类型文件的预览功能实现

    关于Java项目中,word和Excel类型文件的预览功能实现 背景 Aspose说明 Aspose.Words Aspose.Cells pom依赖引入 引入license.xml(授权文件) 创建 ...

最新文章

  1. 华为正式发布鸿蒙2.0,更新人数太多挤爆服务器,P50也官宣了!
  2. python在中小学教学中的应用-在python程序中的进程操作
  3. 关于同源策略的一些想法
  4. 迁移聊天记录到Teams
  5. 操作系统上机作业--使用条件变量解决生产者、计算者、消费者问题(多线程)
  6. IDEA配置 及 快捷键
  7. NLP——序列标注之命名实体识别
  8. android surfaceview 清屏
  9. 9day条件语句和基本数据类型
  10. php错误日志框架,错误与日志 - Laravel - 为 WEB 艺术家创造的 PHP 框架。
  11. windows黑客编程系列(二):DLL延迟加载和资源释放
  12. php手机号最新正则表达式,最新手机号码正则表达式
  13. lldp协议代码阅读_软件实现LLDP协议HaneWin LLDP Service
  14. 虚幻4皮肤材质_虚幻4果真被玩坏了?浅谈光影与材质带来的极致体验
  15. jquery九宫格抽奖转盘插件
  16. git错误集(updating)
  17. pstl连接数据库时出现ORA-12154:TNS:could not resolve service name错误。
  18. linux怎么恢复删除的文件
  19. ECMAScript6面对大于0xFFFF的Unicode字符如何正确返回长度
  20. 洛谷P4942 小凯的数字

热门文章

  1. hibernate中的映射文件xxx.hbm.xml详解总结
  2. SpringMVC上传文件配置
  3. 综合应用题:多线程复制文件(知识点:多线程、随机读写流)
  4. 解析字符串,每8位将2进制转为16进制
  5. Android从普通发送和接收短信到对短信进行拦截
  6. C语言实现字符串的加密和解密
  7. linux重点知识:网络通信
  8. 【干货】超全!华为交换机端口vlan详解~
  9. java hashtable 数据结构_数据结构--哈希表(Java)
  10. 实验Matlab数值运算,MATLAB数值实验一(数据的插值运算及其应用完整版