Объединить два или более Crystal Reports в один PDF - PullRequest
8 голосов
/ 04 февраля 2011

У меня есть CheckBoxList.Если я выберу два или более значений, то CheckBoxList SelectedValues ​​будет передаваться как параметр один за другим, и я хочу создать отчет Crystal для каждого SelectedValue в формате PDF, и я хочу объединить все форматы Crystal Report PDF в один PDFформат.Как этого добиться?Пока что я сгенерировал только один отчет Crystal в формате PDF.Ниже я дал код о том, как я сгенерировал отчет Crystal в формате PDF.

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 в качестве параметра.Например, если я выбрал три значения, значит, отчет Crystal должен содержать все три отчета Crystal для соответствующего значения SelectedValue по одному.Как объединить весь отчет PDF Crystal Report в один отчет Crystal?Я должен решить эту проблему.Пожалуйста, помогите мне.

Ответы [ 4 ]

8 голосов
/ 04 июля 2011

Crystal Reports имеют значение , означающее для создания одной страницы на запись. Вам просто нужно установить источник данных с несколькими строками данных, установить этот источник данных для своего отчета и экспортировать его в pdf напрямую (уже «объединенный»).

Прежде всего, вам нужно создать источник данных с вашими данными. Например, вы можете создать DataSet с помощью дизайнера Visual Studio. Подробнее здесь .

Затем вам нужно установить источник данных для вашего 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 для VS 2010.

0 голосов
/ 01 июля 2011

Кристалл не может этого сделать.Однако вы можете выполнить экспорт Crystal в поток памяти, а затем использовать этот сайт, чтобы узнать, как их объединить: http://www.codeproject.com/KB/files/SimplePdfMerger.aspx

0 голосов
/ 01 июля 2011

Вы можете сделать это с помощью Atalasoft dotImage (заявление об отказе - я работаю в Atalasoft и написал большинство инструментов PDF, включая этот).Фактически, это буквально однострочный:

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

Существуют разновидности, которые работают с потоками или путями, и вы можете зашифровать вывод, если вам нужно.

0 голосов
/ 01 июля 2011

Плохие новости: ни .Net, ни Crystal не поддерживают объединение PDF-файлов.

Хорошие новости: используйте ExportToStream вместо ExportToHttpResponse для записи каждого отчета в свой поток памяти.Затем используйте стороннюю библиотеку, чтобы объединить два PDF-файла в один.

Вот некоторые библиотеки с открытым исходным кодом: http://csharp -source.net / open-source / pdf-library .Также доступно много коммерческих библиотек, одна из них DynamicPDF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...