您的位置:首页 > 编程语言 > C#

C#打印文本文件实例详解

2010-08-15 11:19 417 查看
C#打印文本文件是如何实现的呢?C#打印文本文件用到的类是什么呢?C#打印文本文件实现的效果是什么呢?那么本文就向你介绍具体的内容。

 

这是一个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)  

d8c5
{  
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 == nullbreak;  
}  
if (line == nullreturn;  
currPage++;  
}  
if (currPage >   
ev.PageSettings.PrinterSettings.ToPage) return;  
}  
for (int count = 0; count < linesPerPage; count++)  
{  
line = srToPrint.ReadLine();  
if (line == nullbreak;  
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#打印文本文件有所帮助。

 

 ********************************************************************************

 

这个程序我试过了,需要将代码复制到vs2008创建的窗体程序的相应部分,然后要将计算机服务的Print Spooler设置为启动才能看的打印预览,不然会一直提示要装打印机。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息