Print. rdlc отчет без предварительного просмотра
Я создал .с отчетами отчет с использованием VB.NET а теперь я хочу напечатать этот отчет без предварительного просмотра... пожалуйста, кто-нибудь может мне помочь?
спасибо.....
class ReportPrintDocument : System.Drawing.Printing.PrintDocument { private PageSettings m_pageSettings; private int m_currentPage; private List<stream> m_pages = new List<stream>(); private static Dictionary<string,> ReportingExtensions; public ReportPrintDocument(ServerReport serverReport) : this((Report)serverReport) { RenderAllServerReportPages(serverReport); } public ReportPrintDocument(LocalReport localReport, string filePath) : this((Report)localReport) { ReportingExtensions = new Dictionary<string,>(); ReportingExtensions.Add(".XLS", "Excel"); ReportingExtensions.Add(".XLSX", "Excel"); ReportingExtensions.Add(".PDF", "PDF"); ReportingExtensions.Add(".TIF", "Image"); RenderAllLocalReportPages(localReport, filePath); } private ReportPrintDocument(Report report) { // Set the page settings to the default defined in the report ReportPageSettings reportPageSettings = report.GetDefaultPageSettings(); // The page settings object will use the default printer unless // PageSettings.PrinterSettings is changed. This assumes there // is a default printer. m_pageSettings = new PageSettings(); m_pageSettings.PaperSize = reportPageSettings.PaperSize; m_pageSettings.Margins = reportPageSettings.Margins; } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { foreach (Stream s in m_pages) { s.Dispose(); } m_pages.Clear(); } } protected override void OnBeginPrint(PrintEventArgs e) { base.OnBeginPrint(e); m_currentPage = 0; } protected override void OnPrintPage(PrintPageEventArgs e) { base.OnPrintPage(e); Stream pageToPrint = m_pages[m_currentPage]; pageToPrint.Position = 0; // Load each page into a Metafile to draw it. using (Metafile pageMetaFile = new Metafile(pageToPrint)) { Rectangle adjustedRect = new Rectangle( e.PageBounds.Left - (int)e.PageSettings.HardMarginX, e.PageBounds.Top - (int)e.PageSettings.HardMarginY, e.PageBounds.Width, e.PageBounds.Height); // Draw a white background for the report e.Graphics.FillRectangle(Brushes.White, adjustedRect); // Draw the report content e.Graphics.DrawImage(pageMetaFile, adjustedRect); // Prepare for next page. Make sure we haven't hit the end. m_currentPage++; e.HasMorePages = m_currentPage < m_pages.Count; } } protected override void OnQueryPageSettings(QueryPageSettingsEventArgs e) { e.PageSettings = (PageSettings)m_pageSettings.Clone(); } private void RenderAllServerReportPages(ServerReport serverReport) { string deviceInfo = CreateEMFDeviceInfo(); NameValueCollection firstPageParameters = new NameValueCollection(); firstPageParameters.Add("rs:PersistStreams", "True"); // GetNextStream returns the next page in the sequence from the background process // started by PersistStreams. NameValueCollection nonFirstPageParameters = new NameValueCollection(); nonFirstPageParameters.Add("rs:GetNextStream", "True"); string mimeType; string fileExtension; Stream pageStream = serverReport.Render("IMAGE", deviceInfo, firstPageParameters, out mimeType, out fileExtension); // The server returns an empty stream when moving beyond the last page. while (pageStream.Length > 0) { m_pages.Add(pageStream); pageStream = serverReport.Render("IMAGE", deviceInfo, nonFirstPageParameters, out mimeType, out fileExtension); } } private void RenderAllLocalReportPages(LocalReport localReport, string filePath) { string extension = Path.GetExtension(filePath); string format = ""; if (ReportingExtensions.ContainsKey(extension.ToUpper())) { format = ReportingExtensions[extension.ToUpper()]; } else { format = ReportingExtensions[".TIF"]; } string deviceInfo = CreateEMFDeviceInfo(); string mimeType = null; string encoding = null; string fileNameExtension = null; string[] stream = null; Warning[] warnings; var list = localReport.ListRenderingExtensions(); //localReport.Render("IMAGE", deviceInfo, LocalReportCreateStreamCallback, out warnings); Byte[] bytes = localReport.Render(format, null, out mimeType, out encoding, out fileNameExtension, out stream, out warnings); FileStream fs = new FileStream(filePath, FileMode.Create); fs.Write(bytes, 0, bytes.Length); fs.Close(); } private Stream LocalReportCreateStreamCallback( string name, string extension, Encoding encoding, string mimeType, bool willSeek) { MemoryStream stream = new MemoryStream(); m_pages.Add(stream); return stream; } private string CreateEMFDeviceInfo() { PaperSize paperSize = m_pageSettings.PaperSize; Margins margins = m_pageSettings.Margins; // The device info string defines the page range to print as well as the size of the page. // A start and end page of 0 means generate all pages. return string.Format( CultureInfo.InvariantCulture, "<deviceinfo><outputformat>emf</outputformat><startpage>0</startpage><endpage>0</endpage><margintop>{0}</margintop><marginleft>{1}</marginleft><marginright>{2}</marginright><marginbottom>{3}</marginbottom><pageheight>{4}</pageheight><pagewidth>{5}</pagewidth></deviceinfo>", ToInches(margins.Top), ToInches(margins.Left), ToInches(margins.Right), ToInches(margins.Bottom), ToInches(paperSize.Height), ToInches(paperSize.Width)); } private static string ToInches(int hundrethsOfInch) { double inches = hundrethsOfInch / 100.0; return inches.ToString(CultureInfo.InvariantCulture) + "in"; } }</stream></stream>
Как мне использовать второе решение?
Я смог использовать отчет rdlc, который имеет трехстраничную область печати, но он печатает дополнительные 2 пустые страницы между печатными страницами... ..по этой причине теперь я использую crystal report...теперь ... кто-нибудь знает, как удалить лишние страницы ?...и его предварительный просмотр печати очень грубый..
Добавление к решению, чтобы печатать непосредственно на принтере по умолчанию
Использование
PrintRDLCReport.PrintToPrinter
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Globalization; using System.IO; using System.Text; using Microsoft.Reporting.WinForms; namespace AHS_EMRReprint.Controllers { public static class PrintRDLCReport { private static int m_currentPageIndex; private static IList<Stream> m_streams; private static PageSettings m_pageSettings; public static Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { Stream stream = new MemoryStream(); m_streams.Add(stream); return stream; } public static void Export(LocalReport report, bool print = true) { PaperSize paperSize = m_pageSettings.PaperSize; Margins margins = m_pageSettings.Margins; // The device info string defines the page range to print as well as the size of the page. // A start and end page of 0 means generate all pages. string deviceInfo = string.Format( CultureInfo.InvariantCulture, "<DeviceInfo>" + "<OutputFormat>EMF</OutputFormat>" + "<PageWidth>{5}</PageWidth>" + "<PageHeight>{4}</PageHeight>" + "<MarginTop>{0}</MarginTop>" + "<MarginLeft>{1}</MarginLeft>" + "<MarginRight>{2}</MarginRight>" + "<MarginBottom>{3}</MarginBottom>" + "</DeviceInfo>", ToInches(margins.Top), ToInches(margins.Left), ToInches(margins.Right), ToInches(margins.Bottom), ToInches(paperSize.Height), ToInches(paperSize.Width)); Warning[] warnings; m_streams = new List<Stream>(); report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) stream.Position = 0; if (print) { Print(); } } // Handler for PrintPageEvents public static void PrintPage(object sender, PrintPageEventArgs e) { Stream pageToPrint = m_streams[m_currentPageIndex]; pageToPrint.Position = 0; // Load each page into a Metafile to draw it. using (Metafile pageMetaFile = new Metafile(pageToPrint)) { Rectangle adjustedRect = new Rectangle( e.PageBounds.Left - (int)e.PageSettings.HardMarginX, e.PageBounds.Top - (int)e.PageSettings.HardMarginY, e.PageBounds.Width, e.PageBounds.Height); // Draw a white background for the report e.Graphics.FillRectangle(Brushes.White, adjustedRect); // Draw the report content e.Graphics.DrawImage(pageMetaFile, adjustedRect); // Prepare for next page. Make sure we haven't hit the end. m_currentPageIndex++; e.HasMorePages = m_currentPageIndex < m_streams.Count; } } public static void Print() { if (m_streams == null || m_streams.Count == 0) throw new Exception("Error: no stream to print."); PrintDocument printDoc = new PrintDocument(); if (!printDoc.PrinterSettings.IsValid) { throw new Exception("Error: cannot find the default printer."); } else { printDoc.PrintPage += new PrintPageEventHandler(PrintPage); m_currentPageIndex = 0; printDoc.Print(); } } public static void PrintToPrinter(this LocalReport report) { m_pageSettings = new PageSettings(); ReportPageSettings reportPageSettings = report.GetDefaultPageSettings(); m_pageSettings.PaperSize = reportPageSettings.PaperSize; m_pageSettings.Margins = reportPageSettings.Margins; Export(report); } public static void DisposePrint() { if (m_streams != null) { foreach (Stream stream in m_streams) stream.Close(); m_streams = null; } } private static string ToInches(int hundrethsOfInch) { double inches = hundrethsOfInch / 100.0; return inches.ToString(CultureInfo.InvariantCulture) + "in"; } } }
Кто-то, возможно, ищет ответ, я был там, и я понял это с его решением
То, что ты так меня опозорил, когда я дал рабочий ответ, делает тебя счастливым? лол
на него уже ответили 7 лет назад.
Спасибо за дополнительную информацию.
У меня была похожая проблема, и я решил ее, изменив размеры страницы.
Изменение размеров страницы не будет печататься без предварительного просмотра - что и было оригинальным постом 4 года назад. Если вы пытаетесь ответить на комментарий используйте ссылку ответить рядом с этим комментарием