PrintDocument实例所有的订阅事件如下:
1.创建一个PrintDocument的实例.如下:
System.Drawing.Printing.PrintDocument docToPrint =
new System.Drawing.Printing.PrintDocument();
2.设置打印机开始打印的事件处理函数.函数原形如下:
void docToPrint_PrintPage(object sender,
System.Drawing.Printing.PrintPageEventArgs e)
3.将事件处理函数添加到PrintDocument的PrintPage事件中。
docToPrint.PrintPage+=new PrintPageEventHandler(docToPrint_PrintPage);
4.设置PrintDocument的相关属性,如:
PrintDialog1.AllowSomePages = true;PrintDialog1.ShowHelp = true;
5.把PrintDialog的Document属性设为上面配置好的PrintDocument的实例:
PrintDialog1.Document = docToPrint;
6.调用PrintDialog的ShowDialog函数显示打印对话框:
DialogResult result = PrintDialog1.ShowDialog();
7.根据用户的选择,开始打印:
if (result==DialogResult.OK)
{
docToPrint.Print();
}
8.打印预览控件PrintPreviewDialog
例子如下:
使用时先创建PrintService类的实例,然后调用void StartPrint(Stream streamToPrint,string streamType)函数开始打印。其中streamToPrint是要打印的内容(字节流),streamType是流的类型(txt表示普通文本,image表示图像);
public partial class PrintTxt |
private PrintPreviewDialog PrintPreview = new PrintPreviewDialog(); |
private string StreamType; |
private Image image = null ; |
private Stream StreamToPrint = null ; |
Font mainFont = new Font( "宋体" , 12); |
public string Filename = null ; |
PrintDocument pdDocument = new PrintDocument(); |
private int linesPrinted; |
public PrintTxt( string filepath, string filetype) |
Filename = Path.GetFileNameWithoutExtension(filepath); |
pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint); |
pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage); |
FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read); |
StartPrint(fs, filetype); |
pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint); |
public void StartPrint(Stream streamToPrint, string streamType) |
PageSettings ps = new PageSettings(); |
PageSetupDialog Psdl = new PageSetupDialog(); |
PrintDialog pt = new PrintDialog(); |
pt.AllowCurrentPage = true ; |
pt.AllowSomePages = true ; |
pt.AllowPrintToFile = true ; |
StreamToPrint = streamToPrint; |
pdDocument.DocumentName = Filename; |
Psdl.Document = pdDocument; |
PrintPreview.Document = pdDocument; |
pt.Document = pdDocument; |
Psdl.PageSettings = pdDocument.DefaultPageSettings; |
if (Psdl.ShowDialog() == DialogResult.OK) |
pdDocument.DefaultPageSettings = Psdl.PageSettings; |
if (pt.ShowDialog() == DialogResult.OK) |
pdDocument.PrinterSettings.Copies = pt.PrinterSettings.Copies; |
if (PrintPreview.ShowDialog()==DialogResult.OK ) |
* PrintDocument对象的Print()方法在PrintController类中执行PrintPage事件。 |
catch (InvalidPrinterException ex) |
MessageBox.Show(ex.Message, "Simple Editor" , MessageBoxButtons.OK, MessageBoxIcon.Error); |
/// 每个打印任务只调用OnBeginPrint()一次。 |
/// <param name="sender"></param> |
/// <param name="e"></param> |
void pdDocument_BeginPrint( object sender, PrintEventArgs e) |
char [] trimParam = { '\r' }; |
StringBuilder text = new StringBuilder(); |
System.IO.StreamReader streamReader = new StreamReader(StreamToPrint, Encoding.Default); |
while (streamReader.Peek() >= 0) |
lines = streamReader.ReadToEnd().Split(param); |
for ( int i = 0; i < lines.Length; i++) |
lines[i] = lines[i].TrimEnd(trimParam); |
image = System.Drawing.Image.FromStream(StreamToPrint); |
/// printDocument的PrintPage事件 |
/// <param name="sender"></param> |
/// <param name="e"></param> |
private void OnPrintPage( object sender, PrintPageEventArgs e) |
int leftMargin = Convert.ToInt32((e.MarginBounds.Left) * 3 / 4); |
int topMargin = Convert.ToInt32(e.MarginBounds.Top * 2 / 3); |
while (linesPrinted < lines.Length) |
e.Graphics.DrawString(lines[linesPrinted++], new Font( "Arial" , 10), Brushes.Black, leftMargin, topMargin, new StringFormat()); |
if (topMargin >= e.PageBounds.Height - 60) |
int height = image.Height; |
if ((width / e.MarginBounds.Width) > (height / e.MarginBounds.Height)) |
width = e.MarginBounds.Width; |
height = image.Height * e.MarginBounds.Width / image.Width; |
height = e.MarginBounds.Height; |
width = image.Width * e.MarginBounds.Height / image.Height; |
System.Drawing.Rectangle destRect = new System.Drawing.Rectangle(topMargin, leftMargin, width, height); |
for ( int i = 0; i < Convert.ToInt32(Math.Floor(( double )image.Height/ 820)) + 1; i++) |
e.Graphics.DrawImage(image, destRect, i*820,i*1170 , image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel); |
if (i * 1170 >= e.PageBounds.Height - 60) |
e.Graphics.DrawLine( new Pen(Color.Black), leftMargin, topMargin, e.MarginBounds.Right, topMargin); |
string strdatetime = DateTime.Now.ToLongDateString() + DateTime.Now.ToLongTimeString(); |
e.Graphics.DrawString( string .Format( "打印时间:{0}" , strdatetime), mainFont, Brushes.Black, e.MarginBounds.Right-240, topMargin+40, new StringFormat()); |
/// <param name="sender"></param> |
/// <param name="e"></param> |
void pdDocument_EndPrint( object sender, PrintEventArgs e) |