打印文件预览文件

C#打印文本文件实例详解
2009-08-26 11:53 skyivben 博客园 字号:T | T
C#打印文本文件是如何实现的呢?C#打印文本文件用到的类是什么呢?C#打印文本文件实现的效果是什么呢?那么本文就向你介绍具体的内容。

AD:51CTO学院:IT精品课程在线看!


这是一个C#打印文本文件的实现类库,这个程序的功能包括:C#打印文本文件预览、C#打印文本文件。C#文本文件的打印时可以选择打印机,可以指定文本文件打印的页码范围。调用方法非常简单,让我们开始吧:

TextFilePrinter p = new TextFilePrinter(tbxFileName.Text);  p.View();// 打印预览  p.Print(); // 打印文件 使用 TextFilePrinter 类的以下构造函数可以指定打印时使用的字体:

TextFilePrinter(string fileName,    Encoding theEncode, Font theFont)  下面测试C#打印文本文件实现程序运行时的截图:

 

点击“预览”按钮后:

 

点击“打印”按钮后:

 

这幅图中的打印机:“Microsoft Office Doument Image Writer”是 Microsoft Office 2003 软件提供一个虚拟打印机,用来调试打印程序非常方便(使用“打印预览”也可以调试打印程序,但“打印预览”只能使用默认的打印机和默认的打印属性,也不能设置页码范围),可以设置打印属性和页码范围以及打印份数。使用它来调试打印程序,可以节省不少打印纸。为建设节约型社会作贡献 :)

 

这幅图就是该虚拟打印机在屏幕上的显示的结果。

这里是测试C#打印文本文件程序的源代码:

// PrintFile.cs - 文件打印程序  // 编译方法: csc /t:winexe PrintFile.cs TextFilePrinter.cs   using System;  using System.Drawing;  using System.Windows.Forms;  using Skyiv.Util;   namespace Skyiv.Ben.Test  {  class PrintFileForm : Form  {  TextBox tbxFileName;   public PrintFileForm()  {  SuspendLayout();   Button btnFileName = new Button();  btnFileName.Text = "文件名";  btnFileName.Location = new Point(10, 10);  btnFileName.Size = new Size(60, 24);  btnFileName.Click += new EventHandler(BtnFileName_Click);   Button btnPrint = new Button();  btnPrint.Text = "打印";  btnPrint.Location = new Point(75, 10);  btnPrint.Size = new Size(60, 24);  btnPrint.Click += new EventHandler(BtnPrint_Click);   Button btnView = new Button();  btnView.Text = "预览";  btnView.Location = new Point(140, 10);  btnView.Size = new Size(60, 24);  btnView.Click += new EventHandler(BtnView_Click);   tbxFileName = new TextBox();  tbxFileName.Text = "PrintFile.cs";  tbxFileName.Location = new Point(10, 44);  tbxFileName.Size = new Size(190, 20);  tbxFileName.ReadOnly = true;  tbxFileName.Anchor = (  AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right);   Controls.AddRange(new Control[]{  btnFileName, btnPrint, btnView, tbxFileName});  Text = "文本文件打印程序";  ClientSize = new Size(210, 80);   ResumeLayout(false);  }   void BtnFileName_Click(object sender, EventArgs e)  {  OpenFileDialog dlg = new OpenFileDialog();  if(dlg.ShowDialog() != DialogResult.OK) return;  tbxFileName.Text = dlg.FileName;  }   void BtnPrint_Click(object sender, EventArgs e)  {  TextFilePrinter p = new TextFilePrinter(tbxFileName.Text);  p.Print();  }   void BtnView_Click(object sender, EventArgs e)  {  TextFilePrinter p = new TextFilePrinter(tbxFileName.Text);  p.View();  }   static void Main()  {  Application.Run(new PrintFileForm());  }  }  }  这里是C#打印文本文件实现类的源代码:

using System;  using System.Drawing;  using System.Drawing.Printing;  using System.Windows.Forms;  using System.IO;  using System.Text;   namespace Skyiv.Util  {  sealed class TextFilePrinter  {  string fileName;  Encoding theEncode;  Font theFont;  StreamReader srToPrint;  int currPage;   public TextFilePrinter(string fileName)  : this(fileName,   Encoding.GetEncoding("GB18030"), new Font("新宋体", 10))  {  }   public TextFilePrinter(string fileName,   Encoding theEncode, Font theFont)  {  this.fileName = fileName;  this.theEncode = theEncode;  this.theFont = theFont;  }   public void Print()  {  using (srToPrint =   new StreamReader(fileName, theEncode))  {  PrintDialog dlg = new PrintDialog();  dlg.Document = GetPrintDocument();  dlg.AllowSomePages = true;  dlg.AllowPrintToFile = false;  if (dlg.ShowDialog() ==   DialogResult.OK) dlg.Document.Print();  }  }   public void View()  {  using (srToPrint =   new StreamReader(fileName, theEncode))  {  PrintPreviewDialog dlg = new PrintPreviewDialog();  dlg.Document = GetPrintDocument();  dlg.ShowDialog();  }  }   PrintDocument GetPrintDocument()  {  currPage = 1;  PrintDocument doc = new PrintDocument();  doc.DocumentName = fileName;  doc.PrintPage +=   new PrintPageEventHandler(PrintPageEvent);  return doc;  }   void PrintPageEvent(object sender,   PrintPageEventArgs ev)  {  string line = null;  float linesPerPage =   ev.MarginBounds.Height / theFont.GetHeight(ev.Graphics);  bool isSomePages =   ev.PageSettings.PrinterSettings.PrintRange ==   PrintRange.SomePages;  if (isSomePages)  {  while (currPage   < ev.PageSettings.PrinterSettings.FromPage)  {  for (int count = 0; count   < linesPerPage; count++)  {  line = srToPrint.ReadLine();  if (line == null) break;  }  if (line == null) return;  currPage++;  }  if (currPage >   ev.PageSettings.PrinterSettings.ToPage) return;  }  for (int count = 0; count < linesPerPage; count++)  {  line = srToPrint.ReadLine();  if (line == null) break;  ev.Graphics.DrawString(line,   theFont, Brushes.Black, ev.MarginBounds.Left,  ev.MarginBounds.Top + (  count * theFont.GetHeight(ev.Graphics)),   new StringFormat());  }  currPage++;  if (isSomePages &&   currPage > ev.PageSettings.PrinterSettings.ToPage) return;  if (line != null) ev.HasMorePages = true;  }  }  }  这些程序都相当简当明了,这里就不再解释了。

这个类库有个缺点:当C#文本文件中的一行不能在打印纸的一行中打印完时,该行的后半部就丢失了。

C#打印文本文件的具体内容就向你介绍到这里,希望对你了解和学习C#打印文本文件有所帮助。

来自http://developer.51cto.com/art/200908/146940.htm

posted @ 2014-05-07 17:35  yufeiyunsui  阅读(296)  评论(0编辑  收藏  举报