Могу ли я создать отчет PDF на основе изображений из служб отчетов SQL (.rdlc), не сохраняя изображение где-либо? - PullRequest
1 голос
/ 02 февраля 2011

Сценарий:

У меня есть веб-страница с несколькими диаграммами, и у меня есть кнопка «Экспорт в PDF», по которой пользователь должен иметь возможность щелкнуть мышью, и он создает PDF-файл, который затем пользователь может сохранить.

Дано:

Telerik RadChart, который может сохранить себя в потоке памяти как таковой:

MemoryStream chartStream = new MemoryStream();
RadChart1.Save(chartStream, ImageFormat.Png);

Используя этот поток памяти, можно ли создать PDF-файл с помощью служб отчетов SQL WITH OUT , сначала сохранив его в файл ИЛИ , предварительно вставив его в таблицу MSSQL

Я буду голосовать и / или принимать любой ответ, который также является открытым или бесплатным решением этой проблемы.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 02 февраля 2011

Хорошо, только что понял это. В этом ответе есть три элемента, по порядку следуют два скриншота, а затем код:

  1. Создание набора типизированных данных для хранения изображений диаграммы

    Step 1

  2. Подключение набора типизированных данных к отчету RDLC

    Step 2

  3. Код нажатия кнопки для создания файла PDF и его потоковой передачи в браузер.

    protected void btnPDF_Click(object sender, EventArgs e)
    {
        //Put the image you want to display in a MemoryStream.  You can read an image from the file system
        //or generate an image, etc.  This example renders an image to a memory stream using a custom charting control.
        MemoryStream chtLoginsByMonthStream = new MemoryStream();
        this.chtLoginsByMonth.Save(chtLoginsByMonthStream, ImageFormat.Png);
    
    
        //Setup the datatable you will pass into the RDLC
        dsStudentUsage.dtUsageChartsDataTable dt = new dsStudentUsage.dtUsageChartsDataTable();
        dsStudentUsage.dtUsageChartsRow dr = dt.NewdtUsageChartsRow();
    
        //create new Byte Array, this will hold the image data from the memory stream
        byte[] chtLoginsByMonthArray = new byte[chtLoginsByMonthStream.Length];
    
        //Set pointer to the beginning of the stream
        chtLoginsByMonthStream.Position = 0;
    
        //Read the entire stream
        chtLoginsByMonthStream.Read(chtLoginsByMonthArray, 0, (int)chtLoginsByMonthStream.Length);
    
        //Put the byte array into the new datarow in the appropriate column
        dr["imgLoginsByMonth"] = chtLoginsByMonthArray;
        dt.Rows.Add(dr);
    
        //Add the data source to the report.
        ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("dsStudentUsage_dtUsageCharts", dt));
    
        //Setup objects for streaming the PDF to the browser
        Warning[] warnings;
        string[] streamids;
        string mimeType;
        string encoding;
        string extension;
        byte[] bytes;
    
    
        //Make a container for all of your report parameters
        var rptList = new List<KeyValuePair<string, string>>();
        rptList.Add(new KeyValuePair<string, string>("rpTotalLogins", "2,000"));
        //more parameters go here
    
        //Feed the report parameters into the actual "ReportParameters" class
        ReportParameter[] rptParams = new ReportParameter[rptList.Count];
        for (int i = 0; i < rptList.Count; i++)
        {
            rptParams[i] = new ReportParameter(rptList[i].Key, rptList[i].Value);
        }
    
        //Set parameters for the report.
        ReportViewer1.LocalReport.SetParameters(rptParams);
    
        //Render the report to a byte array in PDF format
        bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);
    
        //Set the stream to either prompt user as file download or "inline" to stream
        //PDF directly into the browser window.
    
        HttpContext.Current.Response.AddHeader("Content-disposition", "attachment; filename=StudentUsageReport.pdf");
        //HttpContext.Current.Response.AddHeader("Content-disposition", "inline;");
        HttpContext.Current.Response.ContentType = "application/pdf";
        HttpContext.Current.Response.BinaryWrite(bytes);
        HttpContext.Current.Response.End();
    
    }
    
2 голосов
/ 02 февраля 2011

Я использовал этот метод в прошлом без проблем, и он отлично работал для меня.

1 голос
/ 02 февраля 2011

Я использую iTextSharp для всех моих поколений PDF. Есть немного кривой обучения, но потом это становится довольно легко. Вот несколько ссылок:

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