using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Reporting.WinForms; using System.IO; using System.Drawing.Printing; using System.Drawing.Imaging; namespace FB.PrintHelper { public partial class StreamPrintDocument : System.Drawing.Printing.PrintDocument { private int m_CurrentPageIndex; private IList<Stream> m_EMFStreams; private Microsoft.Reporting.WinForms.LocalReport m_LocalReport = null; private System.Drawing.Imaging.Metafile m_PageImage = null; private string m_ErrorMessage = string.Empty;//错误信息 private string print_name = null;//打印机名称 private string paper_name = "PlaneTicket";//纸张名称 private float paper_width = 210.1F; private float paper_height = 112.1F; public string ErrorMessage { get { return this.m_ErrorMessage; } set { this.m_ErrorMessage = value; } } /// <summary> /// 构造函数 /// </summary> /// <param name="localReport"></param> /// <param name="ReportName"></param> public StreamPrintDocument(Microsoft.Reporting.WinForms.LocalReport localReport) : base() { string strMessage = string.Empty; print_name = Printer.GetDeaultPrinterName(); if (this.ReadSetting(out strMessage) == null) this.m_ErrorMessage = strMessage; if (this.m_ErrorMessage == string.Empty) { this.m_LocalReport = localReport; } } /// <summary> /// 设置打印配置,如有错误返回错误信息 /// </summary> /// <param name="WarningMessage"></param> /// <returns></returns> private DeviceInfo ReadSetting(out string WarningMessage) { WarningMessage = string.Empty; DeviceInfo emfdi = new DeviceInfo(); base.PrinterSettings.PrinterName = print_name; //没有指定的纸张配置 if (!Printer.FormInPrinter(print_name, paper_name)) { Printer.AddCustomPaperSize(print_name, paper_name, paper_width, paper_height); } //与指定的纸张大小不匹配 if (!Printer.FormSameSize(print_name, paper_name, System.Convert.ToDecimal(paper_width/10), System.Convert.ToDecimal(paper_height/10))) { Printer.DeleteCustomPaperSize(print_name, paper_name); Printer.AddCustomPaperSize(print_name, paper_name, paper_width, paper_height); } //设置将打印的纸张大小 foreach (System.Drawing.Printing.PaperSize ps in base.PrinterSettings.PaperSizes) { if (ps.PaperName == paper_name) { base.PrinterSettings.DefaultPageSettings.PaperSize = ps; base.DefaultPageSettings.PaperSize = ps; break; } } //DefaultPageSettings.Landscape如果页面应横向打印,则为 true;反之,则为 false。默认值由打印机决定。 base.DefaultPageSettings.Landscape = false; base.PrinterSettings.DefaultPageSettings.Landscape = false; emfdi.Landscape = false; this.bolOrientation = emfdi.Landscape; emfdi.PageWidth = System.Convert.ToDecimal(paper_width); emfdi.PageHeight = System.Convert.ToDecimal(paper_height); emfdi.MarginTop = System.Convert.ToDecimal(0);//margin top emfdi.MarginBottom = System.Convert.ToDecimal(0);//margin bottom emfdi.MarginLeft = System.Convert.ToDecimal(0);//margin left emfdi.MarginRight = System.Convert.ToDecimal(0);//margin right base.PrinterSettings.PrinterName = print_name; return emfdi; } private bool bolOrientation = false; private Stream CreateStream(string Name, string FileNameExtension, Encoding Encoding, string MimeType, bool WillSeek) { System.IO.Stream streamRet = new System.IO.MemoryStream(); this.m_EMFStreams.Add(streamRet); return streamRet; } private void Export(LocalReport Report) { string strMessage = string.Empty; DeviceInfo emfdi = this.ReadSetting(out strMessage); string strDeviceInfo = emfdi.DeviceInfoString; emfdi = null; Microsoft.Reporting.WinForms.Warning[] Warnings; this.m_EMFStreams = new System.Collections.Generic.List<System.IO.Stream>(); Report.Render("Image", strDeviceInfo, this.CreateStream, out Warnings); foreach (System.IO.Stream s in this.m_EMFStreams) s.Position = 0; } protected override void OnBeginPrint(PrintEventArgs ev) { base.OnBeginPrint(ev); } protected override void OnPrintPage(PrintPageEventArgs ev) { base.OnPrintPage(ev); if (this.m_EMFStreams == null || this.m_EMFStreams.Count == 0) { this.Export(this.m_LocalReport); this.m_CurrentPageIndex = 0; if (this.m_EMFStreams.Count == 0 || this.m_EMFStreams == null) return; } this.m_PageImage = new Metafile(this.m_EMFStreams[this.m_CurrentPageIndex]); ev.Graphics.DrawImageUnscaledAndClipped(this.m_PageImage, ev.PageBounds); this.m_CurrentPageIndex++; ev.HasMorePages = (this.m_CurrentPageIndex < this.m_EMFStreams.Count); if (this.m_CurrentPageIndex == this.m_EMFStreams.Count) { this.m_CurrentPageIndex = 0; this.m_EMFStreams.Clear(); this.m_EMFStreams = null; this.m_PageImage.Dispose(); base.Dispose(); } } } }
StreamPrintDocument.cs
最新推荐文章于 2022-01-06 12:38:30 发布