I am using a ssrs client rdlc report (3-inch printer) in our WPF application. when the report rendered to.PDF and save it to a temporary path, and then prints the PDF means it works perfectly. But when I try to directly print the report to the printer, the report renders as Image (code for printing suggested from MSDN site), but prints only the half of the report in the printer and that too ugly to see as it looks like a drag.
Report Width : 3.5in Report Height: 7in
please take a look at the code below I use and suggest your opinions.
- // RDLC InvoicePrintReport - Report Ready with Data Source and Parameters
- Export(InvoicePrintReport);
- Print();
-
- private int m_currentPageIndex;
- private IList<Stream> m_streams;
- private Stream CreateStream(string name, string fileNameExtension, System.Text.Encoding encoding,
- string mimeType, bool willSeek)
- {
- Stream stream = new MemoryStream();
- m_streams.Add(stream);
- return stream;
- }
- private void Export(LocalReport report)
- {
- string deviceInfo = @"<DeviceInfo><OutputFormat>EMF</OutputFormat><PageWidth>3.5in</PageWidth><MarginTop>0.01in</MarginTop><MarginLeft>0.01in</MarginLeft><MarginRight>0.1in</MarginRight><MarginBottom>0.01in</MarginBottom></DeviceInfo>";
- Microsoft.Reporting.WinForms.Warning[] warnings;
- m_streams = new List<Stream>();
- report.Render("Image", deviceInfo, CreateStream, out warnings);
- foreach (Stream stream in m_streams) stream.Position = 0;
- }
- private 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();
- }
- }
- private void PrintPage(object sender, PrintPageEventArgs ev)
- {
- System.Drawing.Imaging.Metafile pageImage =
- new System.Drawing.Imaging.Metafile(m_streams[m_currentPageIndex]);
-
- System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle(
- ev.PageBounds.Left - (int) ev.PageSettings.HardMarginX,
- ev.PageBounds.Top - (int) ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height);
-
- ev.Graphics.FillRectangle(System.Drawing.Brushes.White, adjustedRect);
-
- ev.Graphics.DrawImage(pageImage, adjustedRect);
-
- m_currentPageIndex++;
- ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
- }