将rdlc报告直接打印到特定打印机c# [英] Printing rdlc report directly to a specific printer c#

查看:64
本文介绍了将rdlc报告直接打印到特定打印机c#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好我已经开发了一个生成rdlc报告的POS应用程序,但是我正在尝试将报告直接打印到特定的打印机而不使用工具栏C#上的打印图标,任何人都可以帮忙,我绝望,我是新手程序员

hello guys I've developed a POS app that generates an rdlc report it works well however i'm trying to print the report directly to a specific printer without using the print icon on the toolbar C#, can anyone help, i'm desperate, i'm a novice programmer

推荐答案

您好,

您必须将报告转换为位图图像,然后设置页面属性并发送到打印机。 

You have to convert the report to bitmap images and then set the page properties and send to the printer. 

参考下面的代码。

using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;

public class Demo : IDisposable
{
    private int m_currentPageIndex;
    private IList<Stream> m_streams;

    private DataTable LoadSalesData()
    {
        // Create a new DataSet and read sales data file 
        //    data.xml into the first DataTable.
        DataSet dataSet = new DataSet();
        dataSet.ReadXml(@"..\..\data.xml");
        return dataSet.Tables[0];
    }
    // Routine to provide to the report renderer, in order to
    //    save an image for each page of the report.
    private Stream CreateStream(string name,
      string fileNameExtension, Encoding encoding,
      string mimeType, bool willSeek)
    {
        Stream stream = new MemoryStream();
        m_streams.Add(stream);
        return stream;
    }
    // Export the given report as an EMF (Enhanced Metafile) file.
    private void Export(LocalReport report)
    {
        string deviceInfo =
          @"<DeviceInfo>
                <OutputFormat>EMF</OutputFormat>
                <PageWidth>8.5in</PageWidth>
                <PageHeight>11in</PageHeight>
                <MarginTop>0.25in</MarginTop>
                <MarginLeft>0.25in</MarginLeft>
                <MarginRight>0.25in</MarginRight>
                <MarginBottom>0.25in</MarginBottom>
            </DeviceInfo>";
        Warning[] warnings;
        m_streams = new List<Stream>();
        report.Render("Image", deviceInfo, CreateStream,
           out warnings);
        foreach (Stream stream in m_streams)
            stream.Position = 0;
    }
    // Handler for PrintPageEvents
    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Metafile pageImage = new
           Metafile(m_streams[m_currentPageIndex]);

        // Adjust rectangular area with printer margins.
        Rectangle adjustedRect = new 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(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);
    }

    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();
        }
    }
    // Create a local report for Report.rdlc, load the data,
    //    export the report to an .emf file, and print it.
    private void Run()
    {
        LocalReport report = new LocalReport();
        report.ReportPath = @"..\..\Report.rdlc";
        report.DataSources.Add(
           new ReportDataSource("Sales", LoadSalesData()));
        Export(report);
        Print();
    }

    public void Dispose()
    {
        if (m_streams != null)
        {
            foreach (Stream stream in m_streams)
                stream.Close();
            m_streams = null;
        }
    }

    public static void Main(string[] args)
    {
        using (Demo demo = new Demo())
        {
            demo.Run();
        }
    }
}

您必须更改页面宽度和高度以满足您的要求。您是将报告发送到POS打印机还是普通打印机。在POS打印机的情况下,我不确定您是否可以发送rdlc,因为它有自己的格式化方法( POS
打印机类和打印格式
)。 

You have to change the page width and height to suit your requirements. Are you sending the report to the POS Printer or a regular Printer. In case of POS Printer I am not sure if you can send the rdlc as it has its own formatting methodologies (POS Printer Class and Print Formatting). 

有关详情,请参阅 

for more details refer 

https://msdn.microsoft.com/en-us/library/ms252091.aspx


这篇关于将rdlc报告直接打印到特定打印机c#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆