天天看點

封裝一個列印的公共類,跟童鞋們分享一下

ImagePrinter 類是封裝好的列印類,列印前需要調用 public bool PrinterReady(Bitmap printContent) 方法傳入一個圖檔檔案,
之後就可以調用 PrintView() 進行列印浏覽,調用 PrintOut()  就可以列印了。
ExpressPrinter 類是調用 ImagePrinter 列印封裝類的一個執行個體,旨在與看看怎麼使用GDI+繪制需要列印的内容和字型。
================================================
using System;
 using System.Collections.Generic;
 using System.Drawing.Imaging;
 using System.Linq;
 using System.Text;
 using System.Drawing;
 using System.Windows.Forms;
 using System.Drawing.Printing;
 using Lib.Biz.ClientService;
 using Lib.Utility.Extension;
 using PrintOrder.Utility;


 namespace PrintOrder.ExpressPrinter.PrintDoc
 {
   /// <summary>
   /// 列印圖檔内容
   /// </summary>
   public class ExpressPrinter
   {
     /// <summary>
     /// 建立快遞單列印對象執行個體
     /// </summary>
     /// <param name="printerName">列印機名稱,如果為空将使用預設列印機</param>
     /// <param name="template">列印模闆</param>
     /// <param name="items">列印項</param>
     /// <param name="isCoordinateRule">是否列印定位标尺</param>
     public ExpressPrinter(string printerName, Print_Template template, List<Print_Item> items, bool isCoordinateRule)
     {
       m_template = template;
       m_items = items;
       m_print = new ImagePrinter(printerName);
       m_isCoordinateRule = isCoordinateRule;
       InitPrinter();
     }
     #region 變量


     private Print_Template m_template;
     private List<Print_Item> m_items;
     private Bitmap m_bitmap = new Bitmap(10, 10);
     private Brush m_brush = new SolidBrush(Color.Black);
     private ImagePrinter m_print = null;
     private bool m_isCoordinateRule = false;
     #endregion
     /// <summary>
     /// 設定紙張大小
     /// </summary>
     private void SetPrintPageSize()
     {
       //使用百分之一英寸為機關重新建立繪圖圖面
       using (Graphics g = Graphics.FromImage(m_bitmap))
       {
         //注:使用百分之一為機關
         SizeF sizeF = new SizeF(
          CommonMethod.PixelsToInches(m_template.Width,g.DpiX)*100,
          CommonMethod.PixelsToInches(m_template.Height,g.DpiY)*100);
         Size size = Size.Ceiling(sizeF);
         m_print.DefaultPaperSize = new PaperSize("NewPage", size.Width,size.Height);
       }
       m_print.DefaultMargins = new Margins(0, 0, 0, 0);
       m_print.PrintDocName = string.Format("{0}({1})",m_template.TemplateName,m_template.Modifier);
     }
     /// <summary>
     /// 列印前初始化
     /// </summary>
     private void InitPrinter()
     {
       SetPrintPageSize(); //設定紙張大小
       m_bitmap = new Bitmap(m_template.Width, m_template.Height);
       Func<Print_Item, Font> getFont = (o =>
       {
         FontStyle fontStyle = FontStyle.Regular;
         if (o.FontBold == 1)
           fontStyle = fontStyle | FontStyle.Bold;
         if (o.FontItalic == 1)
           fontStyle = fontStyle | FontStyle.Italic;
         if (o.FontStrikeout == 1)
           fontStyle = fontStyle | FontStyle.Strikeout;
         if (o.FontUnderline == 1)
           fontStyle = fontStyle | FontStyle.Underline;
         Font font = new Font(o.FontName, o.FontSize, fontStyle);
         return font;
       });
       using (Graphics g = Graphics.FromImage(m_bitmap))
       {
         g.PageUnit = GraphicsUnit.Pixel;
         //填充資料到圖檔模闆(位置要在制作圖檔模闆的時候度量好)
         g.FillRectangle(Brushes.White, 0f, 0f
           ,m_template.Width
           ,m_template.Height);
         //測試紙張大小
         //this.DrawTestRectangle(g);
         if (m_isCoordinateRule)
         {
           TestPageSize(g);
         }
         foreach (Print_Item item in m_items)
         {
           g.DrawString(
             item.Text
             , getFont(item)
             , Brushes.Black
             , new RectangleF(
                item.Offset_X + m_template.Offset_X   //設定全局列印偏移 X 坐标
               ,item.Offset_Y + m_template.Offset_Y //設定全局列印偏移 Y 坐标
               ,item.Width
               ,item.Height));
         }
         g.Dispose();
       }
       //m_bitmap.Save(@"D:\WorkTest\temp\express.jpg");
       m_print.PrinterReady(m_bitmap);
     }


     private void DrawTestRectangle(Graphics g)
     {
       g.PageUnit = GraphicsUnit.Pixel;
       SizeF size = new SizeF(
         Utility.CommonMethod.MillimetersToPixel(30, g.DpiX)
         , Utility.CommonMethod.MillimetersToPixel(30, g.DpiY));
       g.DrawRectangle(new Pen(Color.Black, 1), 50, 50, size.Width, size.Height);
     }
     /// <summary>
     /// 列印标尺
     /// </summary>
     private void TestPageSize(Graphics g)
     {
       g.PageUnit = GraphicsUnit.Pixel;
       //八個定位方格
       Size size = new Size(20,20);
       Point ltop = new Point(0,0);
       Point rtop = new Point(m_template.Width - size.Width, 0);
       Point ldwn = new Point(0,m_template.Height - size.Height);
       Point rdwn = new Point(m_template.Width - size.Width, m_template.Height - size.Height);
       Point tmdio = new Point(m_template.Width/2-size.Width/2,0);
       Point dmdio = new Point(m_template.Width / 2 - size.Width/ 2, m_template.Height - size.Height);
       Point lmdio = new Point(0, m_template.Height / 2 - size.Height / 2);
       Point rmdio = new Point(m_template.Width - size.Width, m_template.Height / 2 - size.Height / 2);
       //Point mdio = new Point(m_template.Width / 2 - size.Width / 2, m_template.Height / 2 - size.Height / 2);
       //左下和右上的限度矩形
       Size tRec = new Size(m_template.Width/4,10);
       Size lRec = new Size(10, m_template.Height / 4);
       Point ldRec = new Point(0, lmdio.Y + size.Height + lRec.Height);//左下
       Point rtRec = new Point(tmdio.X + size.Width + tRec.Width, 0);//右上
       //十字中心
       Size tdCrossSize = new Size(10,50);
       Size lrCrossSize = new Size(50,10);
       Point tdCrossPnt = new Point(m_template.Width / 2 - tdCrossSize.Width / 2, m_template.Height / 2 - tdCrossSize.Height/2);
       Point lrCrossPnt = new Point(m_template.Width / 2 - lrCrossSize.Width / 2, m_template.Height / 2 - lrCrossSize.Height / 2);
       
       g.FillRectangle(m_brush, new Rectangle(ltop, size));
       g.FillRectangle(m_brush, new Rectangle(rtop, size));
       g.FillRectangle(m_brush, new Rectangle(ldwn, size));
       g.FillRectangle(m_brush, new Rectangle(rdwn, size));
       g.FillRectangle(m_brush, new Rectangle(tmdio, size));
       g.FillRectangle(m_brush, new Rectangle(dmdio, size));
       g.FillRectangle(m_brush, new Rectangle(lmdio, size));
       g.FillRectangle(m_brush, new Rectangle(rmdio, size));
       
       g.FillRectangle(m_brush, new Rectangle(rtRec, tRec));
       g.FillRectangle(m_brush, new Rectangle(ldRec, lRec));


       g.FillRectangle(m_brush, new Rectangle(tdCrossPnt, tdCrossSize));
       g.FillRectangle(m_brush, new Rectangle(lrCrossPnt, lrCrossSize));


       string defaultSize = string.Format("紙張:{0}X{1}(px),{2}X{3}(mm)"
         , CommonMethod.InchesToPixels(m_print.DefaultPaperSize.Width / 100f,g.DpiX)
         , CommonMethod.InchesToPixels(m_print.DefaultPaperSize.Height / 100f, g.DpiY)
         , CommonMethod.PixelToMillimeters(m_print.DefaultPaperSize.Width,g.DpiX)
         , CommonMethod.PixelToMillimeters(m_print.DefaultPaperSize.Height, g.DpiY));
       g.DrawString(defaultSize,new Font("宋體",9), m_brush,50,50);


       string defaultMargin = string.Format("頁邊距:上={0},下={1},左={2},右={3}"
         , CommonMethod.InchesToPixels(m_print.DefaultMargins.Top, g.DpiY)
         , CommonMethod.InchesToPixels(m_print.DefaultMargins.Bottom, g.DpiY)
         , CommonMethod.InchesToPixels(m_print.DefaultMargins.Left/ 100f,g.DpiX)
         , CommonMethod.InchesToPixels(m_print.DefaultMargins.Right/ 100f,g.DpiX));
       g.DrawString(defaultMargin, new Font("宋體", 12), m_brush, 50, 70);


       string lrCrossStr = string.Format("左右各{0}毫米"
         , CommonMethod.PixelToMillimeters(m_template.Width / 2F, g.DpiX));
       g.DrawString(lrCrossStr, new Font("宋體", 12)
         , m_brush
         , m_print.DefaultPaperSize.Width / 3F
         , m_print.DefaultPaperSize.Height / 2 + 30);
       string tdCrossStr = string.Format("上下各{0}毫米"
         , CommonMethod.PixelToMillimeters(m_template.Height / 2F, g.DpiY));
       g.DrawString(tdCrossStr, new Font("宋體", 12)
         , m_brush
         , m_print.DefaultPaperSize.Width / 3F
         , m_print.DefaultPaperSize.Height / 2 + 45);
     }




     #region 公共方法
     /// <summary>
     /// 列印預覽
     /// </summary>
     /// <returns></returns>
     public DialogResult PrintProview()
     {
       return m_print.PrintView();
     }
     /// <summary>
     /// 開始列印
     /// </summary>
     public void PrintOut()
     {
       m_print.PrintOut();
     }
     #endregion
   }
 }======================================================
using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Drawing;
 using System.Windows.Forms;
 using System.Drawing.Printing;
 using Lib.Utility.Extension;
 using PrintOrder.Utility;


 namespace PrintOrder.ExpressPrinter.PrintDoc
 {
   /// <summary>
   /// 列印圖檔内容
   /// </summary>
   public class ImagePrinter:IDisposable
   {
     public ImagePrinter(string printerName)
     {
       if (!printerName.IsNullOrEmpty())
         this.DefaultPrinterName = printerName;
       //列印事件設定
       m_printDoc.PrintPage += new PrintPageEventHandler(this.m_printDoc_PrintPage);
     }


     #region 變量
     /// <summary>
     /// 列印内容
     /// </summary>
     protected Bitmap m_printContent = null;
     /// <summary>
     /// 列印機名稱
     /// </summary>
     protected string m_printerName = string.Empty;
     /// <summary>
     /// 列印預覽
     /// </summary>
     PrintPreviewDialog m_printPreview = new PrintPreviewDialog();
     /// <summary>
     /// 待列印文檔
     /// </summary>
     PrintDocument m_printDoc = new PrintDocument();
     #endregion


     #region 屬性
     /// <summary>
     /// 待列印文檔名,列印隊列中的顯示值
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111216 12:13)</remarks>
     public string PrintDocName
     {
       set { m_printDoc.DocumentName = value; }
       get { return m_printDoc.DocumentName ; }
     }
     /// <summary>
     /// 擷取或設定預設紙張名稱
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111216 12:13)</remarks>
     public string DefaultPrinterName
     {
       set { m_printDoc.DefaultPageSettings.PrinterSettings.PrinterName = value; }
       get { return m_printDoc.DefaultPageSettings.PrinterSettings.PrinterName; }
     }
     /// <summary>
     /// 擷取或設定預設紙張大小
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111216 12:13)</remarks>
     public PaperSize DefaultPaperSize
     {
       set { m_printDoc.DefaultPageSettings.PaperSize = value; }
       get { return m_printDoc.DefaultPageSettings.PaperSize; }
     }
     /// <summary>
     /// 擷取或設定預設頁邊距
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111216 12:13)</remarks>
     public Margins DefaultMargins
     {
       set { m_printDoc.DefaultPageSettings.Margins = value; }
       get { return m_printDoc.DefaultPageSettings.Margins; }
     }
     
     #endregion


     #region 方法
     /// <summary>
     /// 準備列印
     /// </summary>
     /// <param name="printContent">列印内容</param>
     /// <returns></returns>
     /// <remarks>建立人員(日期):★草青工作室★(111217 16:45)</remarks>
     public bool PrinterReady(Bitmap printContent)
     {
       m_printContent = printContent;
       //列印事件設定
       m_printDoc.PrintPage += new PrintPageEventHandler(this.m_printDoc_PrintPage);
       return true;
     }
     /// <summary>
     /// 列印浏覽
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111215 21:50)</remarks>
     public DialogResult PrintView()
     {
       //列印預覽
       PrintPreviewDialog ppd = new PrintPreviewDialog();
       ppd.Document = m_printDoc;
       return ppd.ShowDialog();
     }
     /// <summary>
     /// 開始列印
     /// </summary>
     /// <remarks>建立人員(日期):★草青工作室★(111215 21:50)</remarks>
     public void PrintOut()
     {
       try
       {
         m_printDoc.Print();
       }
       catch (Exception ex)
       {
         //RegisterLog.ExceptionsStack.RegisterError(ex);
         MessageBox.Show(ex.Message, "列印出錯,詳見異常日志!", MessageBoxButtons.OK, MessageBoxIcon.Error);
         m_printDoc.PrintController.OnEndPrint(m_printDoc, new PrintEventArgs());
       }
     }
     /// <summary>
     /// 列印事件處理
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     private void m_printDoc_PrintPage(object sender, PrintPageEventArgs e)
     {
       e.Graphics.PageUnit = GraphicsUnit.Pixel;
       //目标大小(注:列印區域使用的是‘百分之一英寸’為機關)
       int x = e.MarginBounds.X;
       int y = e.MarginBounds.Y;
       float width = CommonMethod.InchesToPixels((float)Math.Round(e.MarginBounds.Width/100.0,2),e.Graphics.DpiX);
       float height = CommonMethod.InchesToPixels((float)Math.Round(e.MarginBounds.Height / 100.0, 2), e.Graphics.DpiY);
       RectangleF destRectF = new RectangleF(x, y, width, height);//目标大小
       //原圖大小
       Rectangle srcRectF = new Rectangle(0, 0, m_printContent.Width, m_printContent.Height); 
       //繪制列印内容
       e.Graphics.DrawImage(m_printContent
         , destRectF, srcRectF
         , GraphicsUnit.Pixel);
     }


     #endregion




     public void Dispose()
     {
       if(m_printDoc != null)
         m_printDoc.PrintPage -= new PrintPageEventHandler(this.m_printDoc_PrintPage);
     }
   }
 }