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
[] param = {
'\n'
};
|
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)
|