将两个或更多的Crystal报告合并成一个PDF文件

8
我有一个 CheckBoxList。如果我选中了两个或更多的值,则会将 CheckBoxList SelectedValues 逐个作为参数传递,我想为每个 SelectedValue 生成一个 PDF 格式的 Crystal 报告,并将所有 Crystal 报告的 PDF 格式合并为单个 PDF 格式。如何实现这一点? 到目前为止,我只生成了一个 PDF 格式的 Crystal 报告。 以下是我如何生成 PDF 格式的 Crystal 报告的代码。
CrystalDecisions.CrystalReports.Engine.ReportDocument rpt =
    new CrystalDecisions.CrystalReports.Engine.ReportDocument();

string conn = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();
string[] str = conn.Split(';');
string server = str[0].Substring(str[0].IndexOf(" = ") + 3);
string database = str[1].Substring(str[1].IndexOf(" = ") + 3);
string userid = str[2].Substring(str[2].IndexOf(" = ") + 3);
string password = "Welc0me";//str[3].Substring(str[3].IndexOf(" = ") + 3);

rpt.Load(Server.MapPath(RepPath));

for (int i = 0; i < rpt.DataSourceConnections.Count; i++)
{
   rpt.DataSourceConnections[i].SetConnection(server, database, userid, password);
}
// Here ReleaseID will be replaced by the CheckBoxList's SelectedValue
rpt.SetParameterValue(0, ReleaseID);  
rpt.SetParameterValue(1, false);                         
rpt.ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat,
    HttpContext.Current.Response, true, "Docs Report");

但是上面的代码只能一次生成单个pdf报告。但我想将每个CheckBoxList所选取的值作为参数传递。例如,如果我选择了三个值,则水晶报告应按照相应的SelectedValue一个接一个地包含所有三个水晶报告。 我该如何将所有PDF水晶报告合并为单个水晶报告?我必须解决这个问题。请帮助我。

4个回答

8
Crystal Reports旨在每个记录生成一页。您只需要设置一个包含多行数据的数据源,将该数据源设置为报告并直接导出为PDF(已经“合并”)。
首先,您需要使用Visual Studio设计器创建一个数据源。例如,您可以创建一个DataSet。更多信息在此处
然后,您需要为Crystal Report设置数据源。您可以使用Crystal设计器完成此操作。
然后,在运行时,您只需使用与所有选定复选框相关的数据填充rpt,并将其导出为pdf。在.rpt文件中,根据复选框相关的特定列创建一个组,并在组上设置“分页符后”选项。这将生成一个包含所有记录的Pdf文件,每页1个记录。
以下是示例代码:
            using (var reportDocument = new ReportDocument())
        {
            var datasource = new Datasource { EnforceConstraints = false };

            var adapter = new adoTableAdapter { Connection = ConfigurationManager.ConnectionStrings["ConnectionString"]) };
            adapter.Fill(datasource.ado);

            reportDocument.Load(RptPath);
            reportDocument.SetDataSource(datasource);

            PageMargins myMargins = reportDocument.PrintOptions.PageMargins;
            myMargins.topMargin = Settings.Default.DefaultTopMargin;
            myMargins.leftMargin = Settings.Default.DefaultLeftMargin;
            reportDocument.PrintOptions.ApplyPageMargins(myMargins);
            reportDocument.PrintOptions.PaperSize = PaperSize.PaperA5;
            reportDocument.PrintOptions.PaperOrientation = PaperOrientation.Landscape;

            reportDocument.ExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
            reportDocument.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
            reportDocument.ExportOptions.DestinationOptions = new DiskFileDestinationOptions { DiskFileName = PdfFilename };
            reportDocument.ExportOptions.FormatOptions = new PdfRtfWordFormatOptions();

            reportDocument.Export();
        }

在这段代码中,dsEtiqueta是ADO数据源,RptPath是*.rpt报告文件的路径,pdf文件名使用timeSpan生成。这正是我在项目中所需要的,但请随意根据您的需求进行调整。
编辑:已完成CR for VS 2010。

0

您可以使用Atalasoft dotImage来完成此操作(免责声明 - 我在Atalasoft工作,并编写了大部分PDF工具,包括此工具)。实际上,它只需要一行代码:

PdfDocument.Combine(outputFile, intputFile1, intputFile2, ...);  // the signature uses params string[]

有一些适用于流或路径的版本,如果需要,您可以加密输出。


我认为它将组合已存在的文档。但是,我想基于新参数在for循环中组合每个生成的 PDF。如何分配不同的参数并生成?有任何建议吗? - thevan

0

坏消息:.Net和Crystal都不支持合并PDF。

好消息:使用ExportToStream而不是ExportToHttpResponse将每个报告写入其自己的内存流中。然后使用第三方库将两个PDF合并为一个。

这里有一些开源库:http://csharp-source.net/open-source/pdf-libraries。也有许多商业库可用,其中之一就是DynamicPDF


如何为每个报表设置参数并使用ExportToStream生成?有使用ExportToStream的示例代码吗? - thevan
你可以继续按照现在的方式进行操作。然后,不要使用“rpt.ExportToHttpResponse”,而是使用“rpt.ExportToStream”。 - Mrchief

0

如何使用内存流来生成PDF? - thevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接