代码之家  ›  专栏  ›  技术社区  ›  Sarathi Jayapal

C#RDLC报告-直接打印-格式折叠

  •  0
  • Sarathi Jayapal  · 技术社区  · 6 年前

    我在WPF应用程序中使用ssrs客户端rdlc报告(3英寸打印机)。 当报表呈现为.PDF并将其保存到临时路径,然后打印PDF时,表示它工作正常。 但是,当我试图直接将报表打印到打印机时,报表会呈现为图像(MSDN站点建议的打印代码),但在打印机中只打印报表的一半,而且太难看了,因为它看起来像一个拖拽。

    报告宽度:3.5英寸
    请看下面我使用的代码,并提出您的意见。

        // RDLC InvoicePrintReport - Report Ready with Data Source and Parameters
          Export(InvoicePrintReport);
          Print();
    
        //Report Printing Section
        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;
                //PaperSize pkCustomSize1 = new PaperSize("First custom size", 100, 200);
                //printDoc.DefaultPageSettings.PaperSize = pkCustomSize1;
    
                printDoc.Print();
            }
        }
    
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            System.Drawing.Imaging.Metafile pageImage =
                new System.Drawing.Imaging.Metafile(m_streams[m_currentPageIndex]);
    
            // Adjust rectangular area with printer margins.
            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);
    
            // Draw a white background for the report
            ev.Graphics.FillRectangle(System.Drawing.Brushes.White, adjustedRect);
    
            // Draw the report content
            ev.Graphics.DrawImage(pageImage, adjustedRect);
    
            // Prepare for the next page. Make sure we haven't hit the end.
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
    

    reference:printing local report

    1 回复  |  直到 6 年前
        1
  •  0
  •   Sarathi Jayapal    6 年前

    几乎在我的问题中找到了答案。问题在于纸张大小属性。 现在改变纸张尺寸如下所述为3英寸打印做的把戏。

        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;
                PaperSize pkCustomSize1 = new PaperSize("First custom size", 350, 700);
                printDoc.DefaultPageSettings.PaperSize = pkCustomSize1;
    
                printDoc.Print();
            }
        }
    

    350-宽-百分之一英寸 700-高度-百分之一英寸(自动剪切将在热敏打印机中完成其余操作,因此不需要700英寸)