zoukankan      html  css  js  c++  java
  • 水晶报表打印及多个报表打印到一个PDF文件里的办法

    #region 报表打印
           private void PrintReorpt(string OrderNumber,string ReportPath)
           {
               //初始化报表文件数据源
               CrystalDecisions.Web.CrystalReportSource reportSource = new CrystalDecisions.Web.CrystalReportSource();
               //指定报表来源
               reportSource.Report.FileName = this.MapPath(ReportPath);
               //初始化数据来源
               DataTable dt = new DataTable();
               try
               {
                   dt = _head.GetDT_Doc(OrderNumber, Page.User.Identity.Name);
               }
               catch (Exception ex)
               {
                   EA.Common.WebMessageBox.Show(this.Page, "单据打印数据异常.\\r\\n异常原因:" + EA.Common.UIHelper.JsEncode(ex.Message));
                   return;
               }
               if (dt == null || dt.Rows.Count == 0)
               {
                   EA.Common.WebMessageBox.Show(this.Page, "该用户未被授权查看该单据或单据不存在或已删除!");
                   return;
               }
               reportSource.ReportDocument.SetDataSource(dt);
               Stream sr = reportSource.ReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
               Stream sw = Response.OutputStream;
               Response.Clear();
               Response.ContentType = "application/octet-stream";
               string filename = OrderNumber + ".pdf";
               Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
               byte[] buf = new byte[256];
               int cnt = sr.Read(buf, 0, 256);
               while (cnt > 0)
               {
                   sw.Write(buf, 0, cnt);
                   Response.Flush();
                   cnt = sr.Read(buf, 0, 256);
               }

               //以下代码是必须的,除了释放内存外,另一个作用是当将再次调用该方法时,容易造成上一次的内容没被清楚,而导致第二次查看的PDF和第一次是一样的。
               Response.Close();
               reportSource.ReportDocument.Close();
               reportSource.Dispose();
               Response.End();
           }
           #endregion

    多个报表合并为1个PDF文件的方法:

    #region 报表打印

           private void PrintReorpt(List<System.Data.DataTable> listTable, string ReportPath)
           {
               List<Stream> listStream = new List<Stream>();
               CrystalDecisions.Web.CrystalReportSource reportSource=null;
               foreach (System.Data.DataTable dt in listTable)
               {
                   if (dt != null && dt.Rows.Count > 0)
                   {
                       //初始化报表文件数据源
                       reportSource = new CrystalDecisions.Web.CrystalReportSource();
                       //指定报表来源
                       reportSource.Report.FileName = this.MapPath(ReportPath);
                       reportSource.ReportDocument.SetDataSource(dt);
                       Stream sr = reportSource.ReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
                       listStream.Add(sr);
                       reportSource.ReportDocument.Close();
                       reportSource.Dispose();
                   }
               }
               string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_") + Guid.NewGuid().ToString() + ".pdf";
               mergePDFFiles(listStream, fileName);
           }


           /// <summary> 合併PDF檔(集合) </summary>  
           /// <param name="fileList">欲合併PDF檔之集合(一筆以上)</param> 
           /// <param name="outMergeFile">合併後的檔名</param>  

    //我们需要引入:

    using iTextSharp.text;
    using iTextSharp.text.pdf;

    //document.NewPage(); 这个是必须的,否则PDF没办法自动的分页。


           private void mergePDFFiles(List<Stream> listStream, string fileName)
           {
               Document document = new Document();
               int i = 0;
               PdfReader reader;
               string filePath = this.MapPath(pathReportOutputUrl + fileName);
               PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
               PdfImportedPage newPage;
               document.Open();
               PdfContentByte cb = writer.DirectContent;
               Rectangle re = new Rectangle(595, 850);
               document.SetPageSize(re);
               foreach (Stream sr in listStream)
               {
                   if (i != 0)
                   {
                       document.NewPage();
                   }
                   reader = new PdfReader(sr);

                   int iPageNum = reader.NumberOfPages;
                   for (int j = 1; j <= iPageNum; j++)
                   {
                       document.NewPage();
                       newPage = writer.GetImportedPage(reader, j);
                       cb.AddTemplate(newPage, 0, 10);
                   }
                   i++;
               }
               document.Close();
               Stream sr1 = new FileStream(filePath, FileMode.Open);

               Stream sw = Response.OutputStream;
               Response.Clear();
               Response.ContentType = "application/octet-stream";
               Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
               byte[] buf = new byte[256];
               int cnt = sr1.Read(buf, 0, 256);
               while (cnt > 0)
               {
                   sw.Write(buf, 0, cnt);
                   Response.Flush();
                   cnt = sr1.Read(buf, 0, 256);
               }
               sr1.Close();
               try
               {
                   File.Delete(filePath);
               }
               catch { }
               Response.End();
           }

           #endregion

  • 相关阅读:
    opencv imdecode和imencode用法
    caffe网络中屏蔽某一层的输出Silence层
    Opencv画图操作
    linux读取Windows的txt文件问题
    yolo检测系列
    c提取文件路径、文件名和后缀名
    draknet网络配置参数
    darknet源码解析
    Web_Toy
    Heart thing
  • 原文地址:https://www.cnblogs.com/dwfbenben/p/2600116.html
Copyright © 2011-2022 走看看