none
Gerar uma imagem da tela PrintScreen RRS feed

  • Pergunta

  • Olá Pessoal,

                     Criei uma pagina com dois gráficos da API FusionChart, deste modo os gráficos são gerados em flash, estou utilizando a seguinte função javascript para imprimir a div onde os gráficos são gerados:

     
     function ImprimirDiv(IdDiv) {
                var printContent = document.getElementById(IdDiv);
                var printWindow = window.open('', '', 'left=0,top=0,width=0,height=0');
    
                printWindow.document.write(printContent.innerHTML);
                printWindow.document.close();
                printWindow.focus();
                printWindow.print();
                //printWindow.close();
            }
    O problema e que os gráficos não aparecem quando imprimo a pagina, acredito que isto esteja ocorrendo por que os gráficos são flash.

    Gostaria de saber se alguém conhece alguma maneira para imprimir a pagina e os gráficos aparecerem, pode ser gerando uma imagem da div ou qualquer outra solução.

    Obrigado!

    Grafico


    Renato Souza @renatin.bsi

    sexta-feira, 30 de março de 2012 17:22

Respostas

  • Estranho. Aqui eu utilizo normalmente. Apenas tive alguns problemas rodando localmente a aplicação já que o objeto WebBrowser faz normalmente uma requisição para o servidor, mas no ar tudo estava ok. Sugiro baixar e dar uma olhada no projeto postado no CodeProject na url que te passei no primeiro post.
    sexta-feira, 30 de março de 2012 19:57

Todas as Respostas

  • Olá, tive um problema parecido com impressão. A solução foi realizar umas adaptações na classe contida neste projeto: 

    http://www.codeproject.com/Articles/95439/Get-ASP-NET-C-2-0-Website-Thumbnail-Screenshot

    Utilizando a classe WSThumb, para obter uma imagem utilize o seguinte método que retorna um Bitmap:

    public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
            {
                Bitmap screenshoot = new WSThumb(Url, BrowserWidth, BrowserHeight).GetWSThumb();
    
                MemoryStream ms = new MemoryStream();
                screenshoot.Save(ms, ImageFormat.Tiff);
    
                return new Bitmap(new MemoryStream(ms.ToArray(), 0, ms.ToArray().Length));
            }

    No meu caso, eu gero um PDF para a impressão utilizando a iTextSharp da seguinte forma:

    private void GerarPdf(string OutputFileName)
            {
                var host = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
                var bmp = ImageTools.GetWebSiteThumbnail(string.Format("http://{0}/url_da_pagina.aspx", host), 648, 205, 648, 205);
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Bmp);
    
                iTextSharp.text.Document doc = new iTextSharp.text.Document(iTextSharp.text.PageSize.A4, 0, 0, 0, 0);
    
                MemoryStream msPdf = new MemoryStream();
    
                iTextSharp.text.pdf.PdfWriter.GetInstance(doc, msPdf);
    
                doc.Open();
    
                var imagem = iTextSharp.text.Image.GetInstance(ms.ToArray());
    
                doc.Add(imagem);
    
                doc.Close();
    
                Response.Clear();
                Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.pdf", OutputFileName));
                Response.ContentType = "application/pdf";
                Response.Buffer = true;
                Response.OutputStream.Write(msPdf.GetBuffer(), 0, msPdf.GetBuffer().Length);
                Response.OutputStream.Flush();
                Response.End();
            }

    Caso tenha alguma dúvida, estou a disposição.

    sexta-feira, 30 de março de 2012 17:51
  • Guilherme,

    Nao consegui utilizar o seu exemplo.

            public static Bitmap GetWebSiteThumbnail(string Url, int BrowserWidth, int BrowserHeight, int ThumbnailWidth, int ThumbnailHeight)
            {
                Bitmap screenshoot = new WSThumb(Url, BrowserWidth, BrowserHeight).GetWSThumb();
    
                MemoryStream ms = new MemoryStream();
                screenshoot.Save(ms, ImageFormat.Tiff);
    
                return new Bitmap(new MemoryStream(ms.ToArray(), 0, ms.ToArray().Length));
            }

    o metodo acima apresenta erro na criação do objeto screenshoot do tipo WSThumb.

    Obrigado pela ajuda.




    Renato Souza @renatin.bsi

    sexta-feira, 30 de março de 2012 18:09
  • Certifique-se que possui a classe WSThumb no projeto, como no exemplo postado no CodeProject.

    Para a impressão do PDF, também é necessário importar a DLL iTextSharp.

    public class WSThumb
        {
            public WSThumb(string Url, int BW, int BH)
            {
                __Url = Url;
                __BrowserWidth = BW;
                __BrowserHeight = BH;
            }
    
            private Bitmap __Bitmap = null;
            private string __Url = null;
            private int __BrowserWidth;
            private int __BrowserHeight;
    
            public string Url
            {
                get { return __Url; }
                set { __Url = value; }
            }
    
            public Bitmap ThumbnailImage
            {
                get { return __Bitmap; }
            }
    
            public int BrowserWidth
            {
                get { return __BrowserWidth; }
                set { __BrowserWidth = value; }
            }
    
            public int BrowserHeight
            {
                get { return __BrowserHeight; }
                set { __BrowserHeight = value; }
            }
    
            public Bitmap GetWSThumb()
            {
                ThreadStart __threadStart = new ThreadStart(_GenerateWSThumb);
                Thread __thread = new Thread(__threadStart);
    
                __thread.SetApartmentState(ApartmentState.STA);
                __thread.Start();
                __thread.Join();
                return __Bitmap;
            }
    
            private void _GenerateWSThumb()
            {
                WebBrowser __WebBrowser = new WebBrowser();
                __WebBrowser.ScrollBarsEnabled = false;
                __WebBrowser.Navigate(__Url);
                __WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
                while (__WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                    Application.DoEvents();
                __WebBrowser.Dispose();
            }
    
            private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser __WebBrowser = (WebBrowser)sender;
                __WebBrowser.ClientSize = new Size(this.__BrowserWidth, this.__BrowserHeight);
                __WebBrowser.ScrollBarsEnabled = false;
                __Bitmap = new Bitmap(__WebBrowser.Bounds.Width, __WebBrowser.Bounds.Height);
                __WebBrowser.BringToFront();
                __WebBrowser.DrawToBitmap(__Bitmap, __WebBrowser.Bounds);
            }
    
        }

    sexta-feira, 30 de março de 2012 18:19
  • Guilherme,

    para utilizar os metodos abaixo, qual namespace terei que utilizar? pois nao esta reconhecendo o "WebBrowser"

    private void _GenerateWSThumb()
                {
                    WebBrowser __WebBrowser = new WebBrowser();
                    __WebBrowser.ScrollBarsEnabled = false;
                    __WebBrowser.Navigate(__Url);
                    __WebBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
                    while (__WebBrowser.ReadyState != WebBrowserReadyState.Complete)
                        Application.DoEvents();
                    __WebBrowser.Dispose();
                }
    
                private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
                {
                    WebBrowser __WebBrowser = (WebBrowser)sender;
                    __WebBrowser.ClientSize = new Size(this.__BrowserWidth, this.__BrowserHeight);
                    __WebBrowser.ScrollBarsEnabled = false;
                    __Bitmap = new Bitmap(__WebBrowser.Bounds.Width, __WebBrowser.Bounds.Height);
                    __WebBrowser.BringToFront();
                    __WebBrowser.DrawToBitmap(__Bitmap, __WebBrowser.Bounds);
                }


    Renato Souza @renatin.bsi


    sexta-feira, 30 de março de 2012 19:02
  • É necessário importar o System.Windows.Forms para que a aplicação crie o WebBrowser e tire um screenshot a partir dele.

    Para utilizar essa classe é necessário importar os namespaces:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;
    using System.IO;
    using System.Drawing.Imaging;
    Desculpe por não ter informado antes.

    sexta-feira, 30 de março de 2012 19:12
  • Adicionei a referencia do WindowsFormsIntegration, para conseguir utilizar o System.Windows.Forms;,

    mais mesmo assim nao funcionou continua com o mesmo erro. preciso de alguma dll?

    Obrigado


    Renato Souza @renatin.bsi

    sexta-feira, 30 de março de 2012 19:30
  • A referência a ser adicionada é a System.Windows.Forms mesmo. Add Reference -> aba .NET -> System.Windows.Forms. Estou utilizando o .NET 4.0 para isso.
    sexta-feira, 30 de março de 2012 19:37
  • Ok,

    com esta DLL este problema foi corrigido agora so falta um.

    no metodo "_GenerateWSThumb" o while esta com erro no Application.DoEvents();

    e erro descrito é:

    Não é possível acessar um membro não estático do tipo externo 'System.Web.UI.Page' por meio do tipo aninhado 'Paginacao.About.WSThumb'


    Renato Souza @renatin.bsi

    sexta-feira, 30 de março de 2012 19:49
  • Estranho. Aqui eu utilizo normalmente. Apenas tive alguns problemas rodando localmente a aplicação já que o objeto WebBrowser faz normalmente uma requisição para o servidor, mas no ar tudo estava ok. Sugiro baixar e dar uma olhada no projeto postado no CodeProject na url que te passei no primeiro post.
    sexta-feira, 30 de março de 2012 19:57
  • Guilherme,

    Não funcionou, mais obrigado pela ajuda!.


    Renato Souza @renatin.bsi

    terça-feira, 26 de junho de 2012 11:09