水晶报表的多个报表生成一个pdf文件

本文介绍了一种使用iTextSharp库将多个PDF文件合并为单一PDF的方法。通过详细解析合并过程中的难点,如处理PDF文件的独特格式及头部尾部问题,最终提供了一套完整的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用户提出点击一个打印按钮就可以生成多个报表,并且是生成为一个pdf文件。
开始实现的是点击打印生成N个pdf文件,每个Pdf文件弹出一次,用户感觉很复杂。
我查了很多的资料,也没有一个很好的解决方案。
开始我想要用流来实现合并多个pdf。
  Byte[] byteStreamOutput = objReport.ConvertReportToByteArray(objRPT);
(1)生成文件
          FileInfo objFileInfo = new FileInfo(@"d:/" + ArrayPDFName[i]);
          using (FileStream objFileStream = objFileInfo.OpenWrite())
          {
            objFileStream.Write(byteStreamOutput, 0, byteStreamOutput.Length);
            objFileStream.Close();
            objFileStream.Dispose();
          }
(2)在内存中存储
System.IO.MemoryStream stream = new System.IO.MemoryStream();
System.IO.BinaryWriter BWriter = new BinaryWriter(stream);
BWriter.Write(PDFstr, 0, PDFstr.Length);
stream.Seek(0, SeekOrigin.Current);
BWriter.Write(byteStreamOutput, 0, byteStreamOutput.Length);
stream.Close();
PDFstr = stream.GetBuffer();
stream.Dispose();
总是显示的只是最后的一个报表文件的pdf。
后来我发现文件的大小一个多个文件合并的大小,就是不能显示。
突然,我想应该是读取格式的问题。每个Pdf文件它有自己的独特的存储格式,读取的时候也是一样。它在显示时也是特殊的,它是首先从文件尾开始读,读到文件头就表示一个完整的pdf已经得到。我用流合并时只是简单的把流相加,没有处理掉文件的头和尾的问题。

昨天晚上,回家总是想着这个问题,打开电脑上网在查查有什么解决办法。发现了一个开源的项目iTextSharp。它可以很好的处理pdf文件。我又查了一些其他的文章,终于可以把问题解决了。
今天来到公司把我找到的类dll加载到我的项目中,写好类,我想要的结果终于可以了。
[解决方案]
1、下载iTextSharp.dll并且加到项目中
http://blog.rubypdf.com/itextsharp/tutorial01/index.html 网址中有例子
可以到csdn中下载。
2、写合并函数。
fileList :为要合并的pdf文件数组(要是绝对地址)
outMergeFile: 是最终合并成的文件的名字。
public static string MergeMultiplePDFsToPDF(string[] fileList, string outMergeFile)
    {
      string returnStr = "";
      try
      {
        int f = 0;
        // we create a reader for a certain document
        PdfReader reader = new PdfReader(fileList[f]);
        // we retrieve the total number of pages
        int n = reader.NumberOfPages; //There are " + n + " pages in the original file.
        // step 1: creation of a document-object
        Document document = new Document(reader.GetPageSizeWithRotation(1));
        // step 2: we create a writer that listens to the document
        PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outMergeFile, FileMode.Create));
        // step 3: we open the document
        document.Open();
        PdfContentByte cb = writer.DirectContent;
        PdfImportedPage page;
        int rotation;
        // step 4: we add content
        while (f < fileList.Length)
        {
          int i = 0;
          while (i < n)
          {
            i++;
            document.SetPageSize(reader.GetPageSizeWithRotation(i));
            document.NewPage();
            page = writer.GetImportedPage(reader, i);
            rotation = reader.GetPageRotation(i);
            if (rotation == 90 || rotation == 270)
            {
              cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
            }
            else
            {
              cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
            }
            //Processed page i
          }
          f++;
          if (f < fileList.Length)
          {
            reader = new PdfReader(fileList[f]);
            // we retrieve the total number of pages
            n = reader.NumberOfPages; //There are " + n + " pages in the original file.
          }
        }
        // step 5: we close the document
        document.Close();
        returnStr = "Succeed!";
      }
      catch (Exception e)
      {
        returnStr += e.Message + "<br />";
        returnStr += e.StackTrace;
      }
      return returnStr;
    }
3、调用函数
string str = MergeMultiplePDFsToPDF(ArrayPDFName, SaveReportsFile)
这样所要的功能就实现了。

Crystal Reports Crystal Reports 的设计用途是,使用数据库来帮助您分析和解释重 要的信息。Crystal Reports 可以方便地创建简单的报表,并且,它还拥 有生成复杂报表或专用报表所需的一整套工具。 创建所能想象的任何报表 Crystal Reports 几乎可以从任何数据源生成您所需要的报表。内置 报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指 导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助 表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字 确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 -- 您可 以用各种格式来发布报表,其中包括 Microsoft Word 和 Excel,通过 电子邮件发布甚至在 Web 上发布。高级的 Web 报表功能允许工作组中 的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序 通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程 序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 无论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金 融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大 的工具,它可以帮助每一个人分析并解释重要的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值