C# 如何将多个Crystal报表合并到一个PDF中

C# 如何将多个Crystal报表合并到一个PDF中,c#,pdf,crystal-reports,C#,Pdf,Crystal Reports,我需要生成5个Crystal报告,并将它们合并到一个PDF文件中。最初我想创建一个报告,将这5个报告作为子报告,然后将其输出到PDF。但是,这不起作用,因为这些报表中的每个都已经有子报表,并且子报表中的报表不受支持 我想我需要在幕后将每个报告输出为PDF格式,然后使用类似iTextSharp的工具来组合这些报告。我找到了一些例子,但没有一个真正适用于我的情况。我希望能为这个任务提供任何代码示例 谢谢。如果您要手动将它们合并为一个PDF,我将使用PDFSam免费版本 但是,如果您想使用Crysta

我需要生成5个Crystal报告,并将它们合并到一个PDF文件中。最初我想创建一个报告,将这5个报告作为子报告,然后将其输出到PDF。但是,这不起作用,因为这些报表中的每个都已经有子报表,并且子报表中的报表不受支持

我想我需要在幕后将每个报告输出为PDF格式,然后使用类似iTextSharp的工具来组合这些报告。我找到了一些例子,但没有一个真正适用于我的情况。我希望能为这个任务提供任何代码示例


谢谢。

如果您要手动将它们合并为一个PDF,我将使用PDFSam免费版本

但是,如果您想使用Crystal Reports,为什么不使用子报表并以这种方式将它们合并为一个报表呢


您可以编写自己的应用程序,将两个报告导出为PDF格式,然后使用其中一个开源项目将它们合并为一个PDF格式。例如,这个:

您还可以获得一个现有的应用程序,可以为您做到这一点。这是免费的

工作示例[c#,使用vs 2015 cm]-[根据您的观点…..服务器中没有更多文件]

1) crystalreports添加到名为“CrystalReport1.rpt,CrystalReport2.rpt”的示例项目[简单设计]

2) 所需文件:(合并流)itext lib:(命令::安装软件包iTextSharp-版本5.5.11)

3) 必需的命名空间

using System;
using System.IO;
using System.Collections.Generic;

using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

using iTextSharp.text;
using iTextSharp.text.pdf;
Step  1:  Reference code 

        //reploace this event to your related event .......
        protected void Page_Load(object sender, EventArgs e)
        {
            //hold the more than one report outputs [bytes]
            List<byte[]> files = new List<byte[]>();

            //for testing purpose LOOP used,
            //u can change as per your requirement and your report name
            for (int i = 1; i <= 2; i++) {

                ReportDocument crdReport1 = new ReportDocument();

                //put your related report names.....
                crdReport1.Load(Server.MapPath(string.Format("CrystalReport{0}.rpt", i)));

                Stream stream1 = crdReport1.ExportToStream(ExportFormatType.PortableDocFormat);

                //prepare the "bytes" from "stream"               
                files.Add(PrepareBytes(stream1));
                //finally the result added to LIST
            }

            Response.Clear();
            Response.Buffer = true;
            Response.ContentType = "application/pdf";     

            //merge the all reports & show the reports            
            Response.BinaryWrite(MergeReports(files).ToArray());

            Response.End();        
        }
步骤3:参考代码(学分:)

//合并报告

private MemoryStream MergeReports(List<byte[]> files)
    {
        if (files.Count > 1)
        {
            PdfReader pdfFile;
            Document doc;
            PdfWriter pCopy;
            MemoryStream msOutput = new MemoryStream();

            pdfFile = new PdfReader(files[0]);

            doc = new Document();
            pCopy = new PdfSmartCopy(doc, msOutput);

            doc.Open();

            for (int k = 0; k < files.Count; k++)
            {
                pdfFile = new PdfReader(files[k]);
                for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                {
                    ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                }
                pCopy.FreeReader(pdfFile);
            }

            pdfFile.Close();
            pCopy.Close();
            doc.Close();

            return msOutput;
        }
        else if (files.Count == 1)
        {
            return new MemoryStream(files[0]);
        }

        return null;
    }
private MemoryStream合并报告(列表文件)
{
如果(files.Count>1)
{
PdfReader pdfFile;
文件文件;
PDF编写器pCopy;
MemoryStream msOutput=新的MemoryStream();
Pdfile=新的PdfReader(文件[0]);
doc=新文档();
pCopy=新的PdfSmartCopy(文档、msOutput);
doc.Open();
对于(int k=0;k

因此,您可以在步骤1中更改逻辑(根据您的报告)

谢谢。我在我的帖子中提到,我的每个报告都有子报告,Crystal reports不支持子报告中的子报告。
private MemoryStream MergeReports(List<byte[]> files)
    {
        if (files.Count > 1)
        {
            PdfReader pdfFile;
            Document doc;
            PdfWriter pCopy;
            MemoryStream msOutput = new MemoryStream();

            pdfFile = new PdfReader(files[0]);

            doc = new Document();
            pCopy = new PdfSmartCopy(doc, msOutput);

            doc.Open();

            for (int k = 0; k < files.Count; k++)
            {
                pdfFile = new PdfReader(files[k]);
                for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                {
                    ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                }
                pCopy.FreeReader(pdfFile);
            }

            pdfFile.Close();
            pCopy.Close();
            doc.Close();

            return msOutput;
        }
        else if (files.Count == 1)
        {
            return new MemoryStream(files[0]);
        }

        return null;
    }