C# PrintDocument打印 多页 打印预览

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 ;

 

        

 

        

 

     //1、实例化打印文档

 

     PrintDocument pdDocument = new PrintDocument();

 

     private string [] lines;

 

     private int linesPrinted;

 

 

 

 

 

     public PrintTxt( string filepath, string filetype)

 

     {

 

          

 

 

 

          Filename = Path.GetFileNameWithoutExtension(filepath);

 

 

 

         //订阅BeginPrint事件

 

         pdDocument.BeginPrint += new PrintEventHandler(pdDocument_BeginPrint);

 

         //訂閱EndPrint事件,释放资源

 

       

 

          

 

         pdDocument.PrintPage += new PrintPageEventHandler(OnPrintPage);

 

 

 

 

 

         //订阅Print打印事件,该方法必须放在订阅打印事件的最后

 

         FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read);

 

         StartPrint(fs, filetype);

 

 

 

 

 

         //打印结束

 

         pdDocument.EndPrint += new PrintEventHandler(pdDocument_EndPrint);

 

 

 

 

 

 

 

     }
//2、启动Print打印方法
     public   void StartPrint(Stream streamToPrint, string streamType)
     {
 
         //返回值的PageSettings A4\A5
         PageSettings ps = new PageSettings();
          //显示设置打印页对话框
      PageSetupDialog Psdl = new PageSetupDialog();
 
         //打印多份设置,注意,该方法需放在printpage方法后面。
      PrintDialog pt = new PrintDialog();
         pt.AllowCurrentPage = true ;
         pt.AllowSomePages = true ;
         pt.AllowPrintToFile = true ;
 
          StreamToPrint = streamToPrint; //打印的字节流
      StreamType = streamType; //打印的类型
      pdDocument.DocumentName = Filename; //打印的文件名
 
      Psdl.Document = pdDocument;
         PrintPreview.Document = pdDocument;
         pt.Document = pdDocument;
 
         Psdl.PageSettings = pdDocument.DefaultPageSettings;
         try
         {
             //显示对话框
 
             if (Psdl.ShowDialog() == DialogResult.OK)
             {
                 ps = Psdl.PageSettings;
                 pdDocument.DefaultPageSettings = Psdl.PageSettings;
             }
 
             if (pt.ShowDialog() == DialogResult.OK)
             {
                 pdDocument.PrinterSettings.Copies = pt.PrinterSettings.Copies;
                 pdDocument.Print();
             }
            if (PrintPreview.ShowDialog()==DialogResult.OK )
             //调用打印
               pdDocument.Print();
 
              
              * PrintDocument对象的Print()方法在PrintController类中执行PrintPage事件。
              */
         }
         catch (InvalidPrinterException ex)
         {
             MessageBox.Show(ex.Message, "Simple Editor" , MessageBoxButtons.OK, MessageBoxIcon.Error);
             throw ;
         }
     }
 
/// <summary>
     /// 3、得到打印內容
     /// 每个打印任务只调用OnBeginPrint()一次。
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     void pdDocument_BeginPrint( object sender, PrintEventArgs e)
     {
         char [] param = { '\n' };
         char [] trimParam = { '\r' }; //回车
 
         switch (StreamType)
         {
             case "txt" :
                 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);
                     }
                 }
 
                 break ;
             case "image" :
                 image = System.Drawing.Image.FromStream(StreamToPrint);
                 break ;
             default :
                 break ;
         }
 
     }
 
 
 
     /// <summary>
     /// 4、绘制多个打印界面
     /// printDocument的PrintPage事件
     /// </summary>
     /// <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);    //顶边距
         switch (StreamType)
         {
             case "txt" :
                 while (linesPrinted < lines.Length)
                 {
                     //向画布中填写内容
                     e.Graphics.DrawString(lines[linesPrinted++], new Font( "Arial" , 10), Brushes.Black, leftMargin, topMargin, new StringFormat());
 
                     topMargin += 55; //行高为55,可调整
 
                     //走纸换页
                     if (topMargin >= e.PageBounds.Height - 60) //页面累加的高度大于页面高度。根据自己需要,可以适当调整
                     {
                         //如果大于设定的高
                         e.HasMorePages = true ;
 
                          /*
                          * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
                          * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
                          */
                         return ;
                     }
                 }
 
                 break ;
             case "image" : //一下涉及剪切图片,
                 int width = image.Width;
                 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;
                 }
                 else
                 {
                     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.HasMorePages = true ;
 
                         /*
                         * PrintPageEventArgs类的HaeMorePages属性为True时,通知控件器,必须再次調用OnPrintPage()方法,打印一个页面。
                         * PrintLoopI()有一个用於每个要打印的页面的序例。如果HasMorePages是False,PrintLoop()就会停止。
                         */
                         return ;
                     }
                 }
              
                 break ;
         }
 
         //打印完毕后,画线条,且注明打印日期
         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());
         linesPrinted = 0;
         //绘制完成后,关闭多页打印功能
         e.HasMorePages = false ;
 
     }
/// <summary>  
     ///5、EndPrint事件,释放资源
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     void pdDocument_EndPrint( object sender, PrintEventArgs e)
     {
 
         //变量Lines占用和引用的字符串数组,现在释放
         lines = null ;
     }
     
}
//PrintTxt simple = new PrintTxt("D:\\Mainsoft\\12.txt", "txt");

 

 

转载于:https://www.cnblogs.com/smallsoftfox/archive/2012/06/25/2562723.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值