c#打印

Posted Jacklovely

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#打印相关的知识,希望对你有一定的参考价值。

柴门闻狗吠,风雪夜归人。野旷天低树,江清月近人。香雾云鬟湿,清辉玉臂寒。莫愁前路无知己,天下谁人不识君。常将冷眼
看螃蟹,看你横行到几时。要在vs2005中实现最基本的打印文本基本上需要以下几个步骤

1 新建项目(窗体)

2 在窗体上添加printDocument 控件 添加 Button textBox 控件

在 printDocument 控间的 PrintPage 事件中添加代码

e.Graphics.DrawString(textBox1.Text,new Font("Arial", 20, FontStyle.Bold), Brushes.Black, 150, 125);

4 为 button 控件添加 Click 事件 在事件中添加以下代码

 1 PrintDialog printDialog1 = new PrintDialog(); // 声明定义 打印对话框
 3 printDialog1.Document = printDocument1;
 5 DialogResult result = printDialog1.ShowDialog();
 7 if (result == DialogResult.OK)
 8 { 
 9   printDocument1.Print();
10 }

5 为printDocument 控件 添加 EndPrint 事件比如 在打印技术后 有一提示语

6 在msdn中有“页边距和纸张方向的设置要用到 PageSetupDialog 类“的说明 个人认为设置并不是很方便 由于前面已经
创建了 printDilog的实例 printDilog1,因此可以通过改变对话框的某些默认设置来改变打印方 式,例如:下面的例子设
定了默认打印方向为横向

printDialog1.Document.DefaultPageSettings.Landscape = true;

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对象添加打印事件

1 PrintDocument printDocument;private void InitializeComponent()
2 {
3   ...
4   printDocument=new PrintDocument();
5   printDocument.PrintPage += new PrintPageEventHandler (this.printDocument_PrintPage);
6   ...
7 }

 

实现打印事件功能打印和绘图类似都是调用Graphics 类的方法进行画图 不同的是一个在显示器上一个在打印纸上并且打印要进
行一些复杂的计算 如换行 分页等。

 1 private void printDocument_PrintPage(object sender,PrintPageEventArgs e)
 2 {
 3   Graphics g = e.Graphics; //获得绘图对象
 4   float linesPerPage = 0; //页面的行号
 5   float yPosition = 0; //绘制字符串的纵向位置
 6   int count = 0; //行计数器
 7   float leftMargin = e.MarginBounds.Left; //左边距
 8   float topMargin = e.MarginBounds.Top; //上边距
 9   string line = null; //行字符串
10   Font printFont = this.textBox.Font; //当前的打印字体
11   SolidBrush myBrush = new SolidBrush(Color.Black);//刷子
12   linesPerPage = e.MarginBounds.Height / printFont.GetHeight(g);//每页可打印的行数 //逐行的循环打印一页
13   while(count < linesPerPage && ((line=lineReader.ReadLine()) != null))
14   {
15   yPosition = topMargin + (count * printFont.GetHeight(g));
16   g.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
17   count++;
18   }

如果本页打印完成而line不为空说明还有没完成的页面这将触发下一次的打印事件在下一次的打印中lineReader会 自动读取上次
没有打印完的内容因为lineReader是这个打印方法外的类的成员它可以记录当前读取的位置

1 if(line != null)
2 e.HasMorePages = true;
3 else
4 e.HasMorePages = false;
5 }

打印设置,构造打印对话框 将对话框中设置的Document属性赋给printDocument这样会将用户的设置自动保存到printDocument
的PrinterSettings属性中

1 protected void FileMenuItem_PrintSet_Click(object sender,EventArgs e)
2 {
3 PrintDialog printDialog = new PrintDialog();
4 printDialog.Document = printDocument;
5 printDialog.ShowDialog();
6 }

页面设置和打印预览与打印设置原理相同都是构造对话框将用户在对话框中的设置保存到相应的类的属性中

1 protected void FileMenuItem_PrintSet_Click(object sender,EventArgs e)
2 {
3 PrintDialog printDialog = new PrintDialog();
4 printDialog.Document = printDocument;
5 printDialog.ShowDialog();
6 }

打印预览

 1 protected void FileMenuItem_PrintView_Click(object sender,EventArgs e)
 2 {
 3  PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); printPreviewDialog.Document = printDocument;
 4 lineReader = new StringReader(textBox.Text);
 5 try
 6 { printPreviewDialog.ShowDialog(); } 
 7 catch(Exception excep)
 8 { 
 9 MessageBox.Show(excep.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
10 }
11 }

打印就可以直接调用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, "打印出错", essageBoxButtons.OK, MessageBoxIcon.Error); 
printDocument.PrintController.OnEndPrint(printDocument,new PrintEventArgs()); }
}
}

总结打印的过程是

1 在应用程序窗体初始化时构造PrintDocument对象 添加 printDocument 的 PrintPage 方法
2 实现PrintPage方法
4 在用户的单击事件中调用 printDocument 的 Print方法实现打印功能 在这中间可能要用到 PrintDialog
PrintPreviewDialog PageSetupDialog 设置和查看打印效 果这些方法通常是由菜单的单击触发的。
天街小雨润如酥,草色遥看近却无。醉卧沙场君莫笑,古来征战几人回!雪消门外千山绿,花发江边二月晴。信言不美,美言不

以上是关于c#打印的主要内容,如果未能解决你的问题,请参考以下文章

此 Canon SDK C++ 代码片段的等效 C# 代码是啥?

argparse 代码片段只打印部分日志

是否可以动态编译和执行 C# 代码片段?

C#常用代码片段备忘

优化 C# 代码片段、ObservableCollection 和 AddRange

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情