Soft009 Ответов: 4

Print. rdlc отчет без предварительного просмотра


Я создал .с отчетами отчет с использованием VB.NET а теперь я хочу напечатать этот отчет без предварительного просмотра... пожалуйста, кто-нибудь может мне помочь?

4 Ответов

Рейтинг:
31

Scubapro

Возможно, будет полезно следующее:

http://msdn.microsoft.com/en-us/library/ms252091.aspx[]


Soft009

спасибо.....

Рейтинг:
2

Paurush Kumar

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>


Faruk Sikder

Как мне использовать второе решение?

Naveen Roy

Я смог использовать отчет rdlc, который имеет трехстраничную область печати, но он печатает дополнительные 2 пустые страницы между печатными страницами... ..по этой причине теперь я использую crystal report...теперь ... кто-нибудь знает, как удалить лишние страницы ?...и его предварительный просмотр печати очень грубый..

Рейтинг:
0

Allan Chong

Добавление к решению, чтобы печатать непосредственно на принтере по умолчанию

Использование

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";
        }
    }
}


Allan Chong

Кто-то, возможно, ищет ответ, я был там, и я понял это с его решением

То, что ты так меня опозорил, когда я дал рабочий ответ, делает тебя счастливым? лол

Kats2512

на него уже ответили 7 лет назад.

Destiny777

Спасибо за дополнительную информацию.

Рейтинг:
0

Member 10190914

У меня была похожая проблема, и я решил ее, изменив размеры страницы.


CHill60

Изменение размеров страницы не будет печататься без предварительного просмотра - что и было оригинальным постом 4 года назад. Если вы пытаетесь ответить на комментарий используйте ссылку ответить рядом с этим комментарием