RDLC(Reportview)报表直接打印,支持所有浏览器,客户可在linux下浏览使用

70 篇文章 1 订阅

转自:https://www.cnblogs.com/bfyx/p/3279385.html

最近在做一个打印清单的,但是rdlc报表自带的工具栏中的打印按钮只有在ie内核下的浏览器才可以使用(其他的就会 隐藏),这导致了使用火狐和谷歌浏览器还有使用linux系统的客户打印成了问题,于是就自己百度搜,谷歌搜,然后就解决了,下面放上源码

打印类 PrintHelp(我需要两个table座位数据源所以参数中有两个datatable)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using Microsoft.Reporting.WebForms;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Text;
using System.Data;

/// <summary>
/// PrintHelp 的摘要描述
/// </summary>
public class PrintHelp
{
  

    private int m_currentPageIndex;
    private IList<Stream> m_streams;
    /// <summary>
    /// 
    /// </summary>
    /// <param name="reportPath">報表路徑</param>
    /// <param name="printerName">打印機名稱(使用默認打印機,不賦值)</param>
    /// <param name="dt1">報表數據源1</param>
    /// <param name="dt1SourceName">報表中數據源1對應名稱</param>
    /// <param name="dt2">報表數據源2</param>
    /// <param name="dt2SourceName">報表中數據源2對應名稱</param>
    public void Run(string reportPath, string printerName, DataTable dt1, string dt1SourceName, DataTable dt2, string dt2SourceName,bool isHindeLogo)
    {
        LocalReport report = new LocalReport();
        report.ReportPath = reportPath;//加上报表的路径
        report.DataSources.Add(new ReportDataSource(dt1SourceName, dt1));
        report.DataSources.Add(new ReportDataSource(dt2SourceName, dt2));
        report.EnableExternalImages = true;
        ReportParameter rp = new ReportParameter("isHindeLogoImg", isHindeLogo.ToString());//这里我在报表里弄的参数
        report.SetParameters(rp);
        Export(report);
        m_currentPageIndex = 0;
        Print(printerName);
    }

    private void Export(LocalReport report)
    {
        string deviceInfo =
          "<DeviceInfo>" +
          "  <OutputFormat>EMF</OutputFormat>" +
          "  <PageWidth>210mm</PageWidth>" +
          "  <PageHeight>297mm</PageHeight>" +
          "  <MarginTop>5mm</MarginTop>" +
          "  <MarginLeft>10mm</MarginLeft>" +
          "  <MarginRight>10mm</MarginRight>" +
          "  <MarginBottom>5mm</MarginBottom>" +
          "</DeviceInfo>";//这里是设置打印的格式 边距什么的
        Warning[] warnings;
        m_streams = new List<Stream>();
        try
        {
            report.Render("Image", deviceInfo, CreateStream, out warnings);//一般情况这里会出错的  使用catch得到错误原因  一般都是简单错误
        }
        catch (Exception ex)
        {
            Exception innerEx = ex.InnerException;//取内异常。因为内异常的信息才有用,才能排除问题。
            while (innerEx != null)
            {
                //MessageBox.Show(innerEx.Message);
                string errmessage = innerEx.Message;
                innerEx = innerEx.InnerException;
            }
        }
        foreach (Stream stream in m_streams)
        {
            stream.Position = 0;
        }
    }

    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
    {
        //name 需要进一步处理
        Stream stream = new FileStream(name + DateTime.Now.Millisecond + "." + fileNameExtension, FileMode.Create);//为文件名加上时间
        m_streams.Add(stream);
        return stream;
    }

    private void Print(string printerName)
    {
        //string printerName = this.TextBox1.Text.Trim();// "傳送至 OneNote 2007";
        if (m_streams == null || m_streams.Count == 0)
            return;
        PrintDocument printDoc = new PrintDocument();
        // string aa = printDoc.PrinterSettings.PrinterName;
        if (printerName.Length > 0)
        {
            printDoc.PrinterSettings.PrinterName = printerName;
        }
        foreach (PaperSize ps in printDoc.PrinterSettings.PaperSizes)
        {
            if (ps.PaperName == "A4")
            {
                printDoc.PrinterSettings.DefaultPageSettings.PaperSize = ps;
                printDoc.DefaultPageSettings.PaperSize = ps;
                // printDoc.PrinterSettings.IsDefaultPrinter;//知道是否是预设定的打印机
            }
        }
        if (!printDoc.PrinterSettings.IsValid)
        {
            string msg = String.Format("Can't find printer " + printerName);
            System.Diagnostics.Debug.WriteLine(msg);
            return;
        }
        printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
        printDoc.Print();
    }


    private void PrintPage(object sender, PrintPageEventArgs ev)
    {
        Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
        ev.Graphics.DrawImage(pageImage, 0, 0, 827, 1169);//設置打印尺寸 单位是像素
        m_currentPageIndex++;
        ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值