Usuário com melhor resposta
Gerar uma imagem da tela PrintScreen

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!
Renato Souza @renatin.bsi
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.
- Sugerido como Resposta Guilherme Herison segunda-feira, 2 de abril de 2012 14:44
- Marcado como Resposta Renato.s.almeida terça-feira, 26 de junho de 2012 11:09
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.
-
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
-
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); } }
-
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
- Editado Renato.s.almeida sexta-feira, 30 de março de 2012 19:03
-
É 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.
-
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
-
-
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
-
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.
- Sugerido como Resposta Guilherme Herison segunda-feira, 2 de abril de 2012 14:44
- Marcado como Resposta Renato.s.almeida terça-feira, 26 de junho de 2012 11:09
-