как добавить поток памяти

 private MemoryStream ConvertWebChartChartToImage(WebChartControl chart)
{
    using (var pcl = new PrintableComponentLink(new PrintingSystem())
    {
        PageHeaderFooter = new PageHeaderFooter(new PageHeaderArea(new string[] { "A", "Header" },
            SystemFonts.DialogFont, BrickAlignment.Center),
            new PageFooterArea(new string[] { "B" },
                SystemFonts.DialogFont, BrickAlignment.Center)),
        Component = ((IChartContainer)chart).Chart,
        Landscape = true
    })
    {
        ((Chart)pcl.Component).OptionsPrint.SizeMode = DevExpress.XtraCharts.Printing.PrintSizeMode.Stret  ch;

        TransDistributionWCh.Legend.AlignmentHorizontal = LegendAlignmentHorizontal.Right;
        pcl.CreateDocument();
        var stream = new MemoryStream();
        pcl.PrintingSystem.ExportToPdf(stream);
        return stream;
    }

}
    private void ConvertHTMLStringToPDF()
    {
        using (var stream = new MemoryStream())
        {
            var listChartControl = new List<WebChartControl>(new List<WebChartControl>
            {
                SuccTransDistributionWCh,
                AmountPerDayWCh,
                TransPerDayWCh,
                AmountPerTransPerDayWCh,
                ActiveTerminalPerDayWCh,
                TransNoWCh,
                TransAmountWCh,
                TransNoAmountWCh
            });
            foreach (var item in listChartControl)
            {

                var temp = ConvertWebChartChartToImage(item);
                stream.Write(temp.ToArray(), 0, temp.ToArray().Length);

            }
            HttpContext.Current.Response.ContentType = "application/pdf";
            HttpContext.Current.Response.AddHeader("Accept-Header", stream.Length.ToString(CultureInfo.InvariantCulture));
            HttpContext.Current.Response.AddHeader("Content-Disposition", ("Attachment") + "; filename=chart.pdf");
            HttpContext.Current.Response.AddHeader("Content-Length", stream.Length.ToString(CultureInfo.InvariantCulture));
            HttpContext.Current.Response.ContentEncoding = Encoding.Default;
            HttpContext.Current.Response.BinaryWrite(stream.ToArray());
        }
        HttpContext.Current.Response.End();}

я использую веб-контрольную диаграмму dev express, и мне нужно преобразовать веб-контрольную диаграмму в pdf, мой вопрос: как добавить данные в поток памяти? этот код показывает последнюю веб-диаграмму, я предлагаю нулевое число неправильного потока. Запись (temp.ToArray(), 0, temp.ToArray().Length); поищите в гугле и на этом сайте к сожалению проблема не решена


person Hossein Hagh    schedule 30.10.2013    source источник


Ответы (1)


Я понятия не имею, как работает метод ExportToPdf, но если он написан человеком, то его будет достаточно для использования одного потока:

private void ConvertWebChartChartToImage(WebChartControl chart, Stream stream)
{
    // ...
    pcl.PrintingSystem.ExportToPdf(stream);
}

private void ConvertHTMLStringToPDF()
{
    using (var stream = new MemoryStream())
    {
        // ...
        foreach (var item in listChartControl)
        {
            ConvertWebChartChartToImage(item, stream);
        }
        // ...
    }
}

Обратите внимание, что ваш исходный код приводит к ненужному выделению памяти:

stream.Write(
    temp.ToArray(), // allocate temporary array, copy stream content into array
    0, 
    temp.ToArray().Length // allocate another array, copy stream content into array
    );

и не удаляет экземпляр MemoryStream, возвращенный из метода ConvertWebChartChartToImage.

Кроме того, если вы хотите скопировать содержимое одного Stream в другой Stream, есть CopyTo/CopyToAsync.

person Dennis    schedule 30.10.2013