zoukankan      html  css  js  c++  java
  • 水晶报表的多个报表生成一个pdf文件(转)

    用户提出点击一个打印按钮就可以生成多个报表,并且是生成为一个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)
    这样所要的功能就实现了。

  • 相关阅读:
    Node中js获取异步操作的结果
    阿里云服务器(一)——Nodejs环境配置
    Nodejs之路(二)—— Nodejs再入门
    通过IDEA制作包含Java应程序的Docker镜像
    IDEA远程调试Tomcat程序
    思维导图_脑图
    gitlab userguide
    如何渲染MARKDOWN与MATHJAX
    markdown emoji表情包
    changing-a-remote-s-url
  • 原文地址:https://www.cnblogs.com/dwfbenben/p/2557604.html
Copyright © 2011-2022 走看看