using ryPrint; using ryPrint.Mod; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Printing; using System.Linq; using System.Text; using System.Windows.Forms; namespace RyPrint { /// /// 如果涉及到分页打印,切勿在PrintPage事件中多次实例化 /// public class SmartPrint { private Hashtable dt_list = new Hashtable(); /// /// 设置获取加载的模板 /// public string Mod_Xml { get; set; } = ""; private PrintDocument _Print_Doc = null; public SmartPrint(string mod_xml,PrintDocument Print_Doc) { Mod_Xml = mod_xml; Print_Doc.BeginPrint += Print_Doc_BeginPrint; Print_Doc.PrintPage += Print_Doc_PrintPage; _Print_Doc = Print_Doc; } public SmartPrint(PrintDocument Print_Doc) { Print_Doc.BeginPrint += Print_Doc_BeginPrint; Print_Doc.PrintPage += Print_Doc_PrintPage; _Print_Doc = Print_Doc; } public SmartPrint() { } /// /// 显示打印预览窗口 /// public void ShowPreviewForm() { if (!_Print_Doc.PrinterSettings.IsValid) { MessageBox.Show("当前打印机无效。请确认是否已安装打印机。","提示",MessageBoxButtons.OK,MessageBoxIcon.Information); return; } IsPreview = true; frmPrintPreview frm = new frmPrintPreview(); frm._SmartPrint = this; frm.PrintDoc = _Print_Doc; frm.ShowDialog(); } private void Print_Doc_PrintPage(object sender, PrintPageEventArgs e) { Print(Mod_Xml, e, IsPreview); } private void Print_Doc_BeginPrint(object sender, PrintEventArgs e) { StartPrint(); } /// /// 左边距 /// public int MarginLeft { get; set; } = 0; /// /// 顶部边距 /// public int MarginTop { get; set; } = 0; /// /// 单位是否是英寸,如果false,则是毫米,默认false。 /// public bool IsInch { get; set; } = false; /// /// 是否是预览 /// public bool IsPreview { get; set; } = false; public string FontName { get; set; } = "黑体"; private int _curPageIndex = 0; /// /// 获取或设置当前打印的是第几页,从0开始计数 /// public int curPageIndex { get { return _curPageIndex; } set { if (value < 0) { _curPageIndex=0; } else { _curPageIndex= value; } } } private int _MaxPage = -1; /// /// 获取或设置当前最多打印到第几页,从0开始计数,-1表示打印到结束 /// public int MaxPage { get { return _MaxPage; } set { if (value < 0) { _MaxPage = -1; } else { _MaxPage = value; } } } /// /// 设置纸张名称 /// public string PaperName { get; set; } = "打印内容"; /// /// 是否横向打印 /// public bool Landscape { get; set; } = true; /// /// 是否打印多页,如果设为true,有多页文本,则打印多页,没有则打印一页。 /// public bool PrintMorePages { get; set; } = true; public delegate void DataSetHandler(string DataSource,out DataTable ds); [Description("获取数据表时激发")] public event DataSetHandler OnDataSet; public void StartPrint() { //curPageIndex = 0; dt_list.Clear(); ryCommon.Storage tStor_set = new ryCommon.Storage(Mod_Xml); tStor_set.SelectNode2("id", "set"); double mmWidth = tStor_set.GetAttrValue("Width", 0d); double mmHeight = tStor_set.GetAttrValue("Height", 0d); PaperSize sPSize = new PaperSize(PaperName, (int)RySet.MMToInches(mmHeight * 100), (int)RySet.MMToInches(mmWidth * 100));//267为英寸转厘米为8厘米 //PaperSize sPSize = new PaperSize("快递单", (int)pixelsToInches(image.Width * 100), (int)pixelsToInches(image.Height * 100)); if (!Landscape) { sPSize = new PaperSize(PaperName, (int)RySet.MMToInches(mmWidth * 100), (int)RySet.MMToInches(mmHeight * 100));//267为英寸转厘米为8厘米 } _Print_Doc.DefaultPageSettings.PaperSize = sPSize; } public void Print() { curPageIndex = 0; MaxPage = -1; IsPreview = false; _Print_Doc.PrinterSettings.FromPage = 0; _Print_Doc.Print(); } /// /// 打印 /// /// 打印模板 /// 打印参数 /// 是否是预览 public void Print(string mod_xml, PrintPageEventArgs e,bool isPreview) { try { e.Graphics.PageUnit = IsInch ? GraphicsUnit.Inch : GraphicsUnit.Millimeter; #region 根据模板打印 ryCommon.Storage tStor_set = new ryCommon.Storage(mod_xml); tStor_set.SelectNode2("id", "set"); double mmWidth = tStor_set.GetAttrValue("Width", 0d); double mmHeight = tStor_set.GetAttrValue("Height", 0d); if (IsInch) { mmWidth = RySet.MMToInches(mmWidth); mmHeight = RySet.MMToInches(mmHeight); } string picPath = RySet.GetTruePath(tStor_set.GetAttrValue("PreviewPicPath", "")); tStor_set.SelectNode2("id", "print_xml"); ryCommon.Storage tStor = new ryCommon.Storage(tStor_set.GetAttrValue("Value")); System.Xml.XmlNodeList list = tStor.GetList(); if (System.IO.File.Exists(picPath)) { Image image = Image.FromFile(picPath); if (isPreview) { Bitmap pic = (Bitmap)image; //pic.SetResolution(dpiValue, dpiValue); e.Graphics.DrawImage(pic, 0, 0, (float)mmWidth, (float)mmHeight); } } for (int i = 0; i < list.Count; i++) { tStor.SelectNode3(list[i]); Font _Font = new Font(FontName, tStor.GetAttrValueByInt("FontSize", 10), FontStyle.Regular); bool Multiline = tStor.GetAttrValueByBool("Multiline", false); SizeF size = new SizeF((float)(tStor.GetAttrValue("Width", 100f)), (float)(tStor.GetAttrValue("Height", 21f))); PointF location = new PointF((float)(tStor.GetAttrValue("Left", 0f) + MarginLeft), (float)(tStor.GetAttrValue("Top", 0f) + MarginTop)); if (IsInch) { size = new SizeF(RySet.MMToInches(size.Width), RySet.MMToInches(size.Height)); location = new PointF(RySet.MMToInches(location.X), RySet.MMToInches(location.Y)); } string title = tStor.GetAttrValue("Title"); ClsProperty.En_Type _type = ClsProperty.En_Type.自定义; try { _type = (ClsProperty.En_Type)tStor.GetAttrValueByInt("sType", 0); } catch { } List value_list = new List(); #region 转换值 switch (_type) { case ClsProperty.En_Type.自定义: string format = tStor.GetAttrValue("format"); if (format == "") { if (tStor.GetAttrValue("value") == "") { value_list.Add(title); } else { value_list.Add(tStor.GetAttrValue("value")); } } else { value_list.Add(DateTime.Now.ToString(format)); } break; case ClsProperty.En_Type.数据字段: string datasource = tStor.GetAttrValue("DataSource"); if (datasource != "") { DataTable dt = new DataTable(); HashItem item = new HashItem(); if (!dt_list.ContainsKey(datasource)) { OnDataSet?.Invoke(datasource, out dt); item.dt = dt; dt_list.Add(datasource, item); } else { item = (HashItem)dt_list[datasource]; if (item.dt!= null) dt = item.dt; } if (!dt.Columns.Contains(tStor.GetAttrValue("value"))) { item.ReadEnd = true; continue; } int PageCount = tStor.GetAttrValue("PageCount", 0); int startRow = curPageIndex* PageCount; int endRow = dt.Rows.Count; if(PageCount>0) { if((curPageIndex+1) * PageCount>= dt.Rows.Count) { endRow = dt.Rows.Count; item.ReadEnd = true; } else { endRow = (curPageIndex + 1) *PageCount; } } else { item.ReadEnd = true; } dt_list[datasource] = item; for (int m = startRow; m < endRow; m++) { value_list.Add(dt.Rows[m][tStor.GetAttrValue("value")].ToString()); } } break; } #endregion float total_top = location.Y; #region 打印内容 for (int k = 0; k < value_list.Count; k++) { location.Y = total_top; string value = value_list[k]; float rowHeight = e.Graphics.MeasureString(value + "有", _Font).Height; if (value != "") { StringFormat sf = new StringFormat(); Brush fontBrush = Brushes.Black; if (tStor.GetAttrValue("NoPrint", false)) { if (isPreview) { fontBrush = Brushes.Blue; } else { continue; } } if (Multiline) { //sf.Alignment = StringAlignment.Center; //sf.LineAlignment = StringAlignment.Center; RectangleF rect = new RectangleF(location, size); rowHeight = rect.Height; e.Graphics.DrawString(value, _Font, fontBrush, rect, sf); } else { #region 单行打印 switch (tStor.GetAttrValue("align")) { case "Left": sf.Alignment = StringAlignment.Near; break; case "Right": sf.Alignment = StringAlignment.Far; break; case "Center": sf.Alignment = StringAlignment.Center; break; } //sf.LineAlignment = sf.Alignment; if (sf.Alignment == StringAlignment.Center) { SizeF _size = e.Graphics.MeasureString(value, _Font); if (size.Width < _size.Width) { size.Width = _size.Width; } size.Height = _size.Height; RectangleF rect = new RectangleF(location, size); sf.LineAlignment = sf.Alignment; e.Graphics.DrawString(value, _Font, fontBrush, rect, sf); } else { e.Graphics.DrawString(value, _Font, fontBrush, location, sf); } #endregion } } if (IsInch) { total_top += rowHeight + RySet.MMToInches(tStor.GetAttrValue("LineSpace", 0)); } else { total_top += rowHeight + tStor.GetAttrValue("LineSpace", 0); } } #endregion } #endregion } catch { } #region 判断记录是否已经打印完 bool PageEnd = true; foreach (DictionaryEntry de in dt_list) { HashItem _item = (HashItem)de.Value; if (!_item.ReadEnd) { PageEnd = false; break; } } if (PageEnd) { e.HasMorePages = false; }///如果已经是尾页,则不继续打印 else { if(MaxPage>0) { if(curPageIndex>= MaxPage) { e.HasMorePages = false; return; } } e.HasMorePages = true; curPageIndex++; } #endregion } } class HashItem { public DataTable dt=new DataTable(); public bool ReadEnd = false; } }