C# RDLC 报告 - 直接到打印机 - 格式崩溃

C# RDLC Report - Directly to Printer - Format Collapses

我在 WPF 应用程序中使用 ssrs 客户端 rdlc 报告(3 英寸打印机)。 当报告呈现 to.PDF 并将其保存到临时路径,然后打印 PDF 时,意味着它可以完美运行。 但是当我尝试直接将报告打印到打印机时,报告呈现为图像(从 MSDN 站点建议的打印代码),但在打印机中只打印了报告的一半,而且看起来太难看了,因为它看起来像拖.

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

    // 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

我的问题本身几乎就有了答案。问题出在纸张尺寸 属性 上。 现在更改了纸张尺寸,如下所述,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 - 高度 - 百分之一英寸(AutoCut 将在热敏打印机中完成其余部分,因此不需要正好 700)