c#打印文本文件简单实例

发布时间:2009年06月04日      浏览次数:973 次
实例代码如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;
using System.Text;
using System.Drawing.Printing;
namespace PrintDemo
{
/**//// <summary>
/// Form1 的摘要说明。
/// </summary>
public class DemoForm : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox txtDoc;
private System.Windows.Forms.MainMenu mnuMain;
private System.Windows.Forms.MenuItem mnuFile;
private System.Windows.Forms.MenuItem mnuFileOpen;
private System.Windows.Forms.MenuItem mnuFilePrint;
private System.Windows.Forms.MenuItem mnuFormat;
private System.Windows.Forms.MenuItem mnuFormatFont;
private System.Windows.Forms.OpenFileDialog dlgOpen;
private System.Windows.Forms.FontDialog dlgFont;
private System.Drawing.Printing.PrintDocument pdoc;
/**//// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.MenuItem mnuFilePrintPreview;
private System.Windows.Forms.MenuItem mnuFilePageSetup;
private System.Windows.Forms.PrintPreviewDialog ppd;
private System.Windows.Forms.PageSetupDialog dlgPageSetup;
private System.Windows.Forms.PrintDialog dlgPrinterSetup;
private int totalLines;
public DemoForm()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/**//// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
Windows 窗体设计器生成的代码#region Windows 窗体设计器生成的代码
/**//// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(DemoForm));
this.txtDoc = new System.Windows.Forms.TextBox();
this.mnuMain = new System.Windows.Forms.MainMenu();
this.mnuFile = new System.Windows.Forms.MenuItem();
this.mnuFileOpen = new System.Windows.Forms.MenuItem();
this.mnuFilePrint = new System.Windows.Forms.MenuItem();
this.mnuFormat = new System.Windows.Forms.MenuItem();
this.mnuFormatFont = new System.Windows.Forms.MenuItem();
this.dlgOpen = new System.Windows.Forms.OpenFileDialog();
this.dlgFont = new System.Windows.Forms.FontDialog();
this.pdoc = new System.Drawing.Printing.PrintDocument();
this.mnuFilePrintPreview = new System.Windows.Forms.MenuItem();
this.mnuFilePageSetup = new System.Windows.Forms.MenuItem();
this.ppd = new System.Windows.Forms.PrintPreviewDialog();
this.dlgPageSetup = new System.Windows.Forms.PageSetupDialog();
this.dlgPrinterSetup = new System.Windows.Forms.PrintDialog();
this.SuspendLayout();
//
// txtDoc
//
this.txtDoc.Dock = System.Windows.Forms.DockStyle.Fill;
this.txtDoc.Location = new System.Drawing.Point(0, 0);
this.txtDoc.Multiline = true;
this.txtDoc.Name = "txtDoc";
this.txtDoc.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.txtDoc.Size = new System.Drawing.Size(560, 309);
this.txtDoc.TabIndex = 0;
this.txtDoc.Text = "";
this.txtDoc.WordWrap = false;
this.txtDoc.TextChanged += new System.EventHandler(this.txtDoc_TextChanged);
//
// mnuMain
//
this.mnuMain.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuFile,
this.mnuFormat});
//
// mnuFile
//
this.mnuFile.Index = 0;
this.mnuFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuFileOpen,
this.mnuFilePageSetup,
this.mnuFilePrintPreview,
this.mnuFilePrint});
this.mnuFile.Text = "文件(&F)";
//
// mnuFileOpen
//
this.mnuFileOpen.Index = 0;
this.mnuFileOpen.Text = "打开(&O)";
this.mnuFileOpen.Click += new System.EventHandler(this.mnuFileOpen_Click);
//
// mnuFilePrint
//
this.mnuFilePrint.Index = 3;
this.mnuFilePrint.Text = "打印(&P)";
this.mnuFilePrint.Click += new System.EventHandler(this.mnuFilePrint_Click);
//
// mnuFormat
//
this.mnuFormat.Index = 1;
this.mnuFormat.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.mnuFormatFont});
this.mnuFormat.Text = "格式(&F)";
//
// mnuFormatFont
//
this.mnuFormatFont.Index = 0;
this.mnuFormatFont.Text = "字体(&O)";
this.mnuFormatFont.Click += new System.EventHandler(this.mnuFormatFont_Click);
//
// dlgOpen
//
this.dlgOpen.Filter = "文本文件|*.txt|所有文件|*.*";
//
// pdoc
//
this.pdoc.DocumentName = "abc";
this.pdoc.BeginPrint += new System.Drawing.Printing.PrintEventHandler(this.pdoc_BeginPrint);
this.pdoc.EndPrint += new System.Drawing.Printing.PrintEventHandler(this.pdoc_EndPrint);
this.pdoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pdoc_PrintPage);
//
// mnuFilePrintPreview
//
this.mnuFilePrintPreview.Index = 2;
this.mnuFilePrintPreview.Text = "打印预览";
this.mnuFilePrintPreview.Click += new System.EventHandler(this.mnuFilePrintPreview_Click);
//
// mnuFilePageSetup
//
this.mnuFilePageSetup.Index = 1;
this.mnuFilePageSetup.Text = "页面设置";
this.mnuFilePageSetup.Click += new System.EventHandler(this.mnuFilePageSetup_Click);
//
// ppd
//
this.ppd.AutoScrollMargin = new System.Drawing.Size(0, 0);
this.ppd.AutoScrollMinSize = new System.Drawing.Size(0, 0);
this.ppd.ClientSize = new System.Drawing.Size(400, 300);
this.ppd.Document = this.pdoc;
this.ppd.Enabled = true;
this.ppd.Icon = ((System.Drawing.Icon)(resources.GetObject("ppd.Icon")));
this.ppd.Location = new System.Drawing.Point(317, 17);
this.ppd.MinimumSize = new System.Drawing.Size(375, 250);
this.ppd.Name = "ppd";
this.ppd.TransparencyKey = System.Drawing.Color.Empty;
this.ppd.Visible = false;
//
// dlgPageSetup
//
this.dlgPageSetup.Document = this.pdoc;
//
// dlgPrinterSetup
//
this.dlgPrinterSetup.Document = this.pdoc;
//
// DemoForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(560, 309);
this.Controls.Add(this.txtDoc);
this.Menu = this.mnuMain;
this.Name = "DemoForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "打印";
this.ResumeLayout(false);
}
#endregion
/**//// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new DemoForm());
}
private void mnuFileOpen_Click(object sender, System.EventArgs e)
{
if (dlgOpen.ShowDialog()==DialogResult.OK)
{
StreamReader sr=null;
try
{
sr=new StreamReader(dlgOpen.FileName,Encoding.Default,true);
txtDoc.Text=sr.ReadToEnd();
}
catch
{
MessageBox.Show("打开文件失败!","错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
}
finally
{
if (sr!=null) sr.Close();
}
}
}
private void mnuFormatFont_Click(object sender, System.EventArgs e)
{
dlgFont.Font=txtDoc.Font;
if (dlgFont.ShowDialog()==DialogResult.OK)
{
txtDoc.Font=dlgFont.Font;
}
}
private void pdoc_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
//MessageBox.Show("开始打印啦");
}
private void pdoc_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
//MessageBox.Show("打印结束");
}
private void pdoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Graphics g=e.Graphics;
float lineHeight=txtDoc.Font.GetHeight(g);
int linesPerPage=(int)(e.MarginBounds.Height/lineHeight);
int count=0; //本页已打印行数
while (count<linesPerPage && totalLines<txtDoc.Lines.Length)
{
g.DrawString(txtDoc.Lines[totalLines],txtDoc.Font,Brushes.Black,e.MarginBounds.X,e.MarginBounds.Y+lineHeight*count);
count++;
totalLines++;
}
if (totalLines<txtDoc.Lines.Length)
{
e.HasMorePages=true;
}
else
{
e.HasMorePages=false;
totalLines=0;
}
}
private void mnuFilePrint_Click(object sender, System.EventArgs e)
{
if (dlgPrinterSetup.ShowDialog()==DialogResult.OK)
{
pdoc.Print(); //开始执行打印
}
}
private void txtDoc_TextChanged(object sender, System.EventArgs e)
{

}
private void mnuFilePrintPreview_Click(object sender, System.EventArgs e)
{
ppd.ShowDialog();
}
private void mnuFilePageSetup_Click(object sender, System.EventArgs e)
{
Margins oldMargins=dlgPageSetup.PageSettings.Margins;
dlgPageSetup.PageSettings.Margins=new Margins((int)(oldMargins.Left*2.54),(int)(oldMargins.Right*2.54),(int)(oldMargins.Top*2.54),(int)(oldMargins.Bottom*2.54));
if (dlgPageSetup.ShowDialog()==DialogResult.Cancel)
{
dlgPageSetup.PageSettings.Margins=oldMargins;
}
}
}
}
这个实例存在一下缺陷,就是没有实现分行打印,不过这个问题其实比较复杂,要考虑并计算一行能打印多少个字符,尤其是在分页处还要判断上一页中分行都是否还有没有打印的文本需要有限处理,有兴趣的可以研究一下。
其实在实际开发应用中可能对文本文件打印是应用并不是太多,可以编辑、打印文本文件的工具比较多,并且功能都比较完善。
免责声明:本站相关技术文章信息部分来自网络,目的主要是传播更多信息,如果您认为本站的某些信息侵犯了您的版权,请与我们联系,我们会即时妥善的处理,谢谢合作!