none
Html to Image !! RRS feed

  • Pergunta

  • Boa noite galera..

    Estou tentando converter o conteúdo de uma div (incluindo imagens) em uma imagem, para o usuário fazer o download da mesma no final. 
    De início, gostaria de saber se podem me ajudar com a geração da imagem.
    Quando passo uma simples string, tranquilo... Mas quando tento passar a div exibe a seguinte mensagem:

    "

    Não é possível obter o conteúdo interno de essa porque os conteúdos não são literais.

    "

    Segue:

    HTML:
    <div runat="server" id="essa">
         Teste: <asp:Literal runat="server" ID="ltrTeste" Text="Testando" /><br />
         <img src="../Images/heroAccent.png" />
         <asp:Button ID="btnGerar" runat="server" OnClick="btnGerar_Click" Text="Gerar" />
    </div>

    Código:
    protected void btnGerar_Click(object sender, EventArgs e)
            {
                    Bitmap oBitmap = new Bitmap(468, 60);
                    Graphics oGraphic = Graphics.FromImage(oBitmap);
    
                    String scolor = "Black";
    
                    String sText = essa.InnerHtml;
                    Color oColor = Color.FromName(scolor);
    
                    SolidBrush oBrush = new SolidBrush(oColor);
                    SolidBrush oBrushwrite = new SolidBrush(Color.White);
    
                    oGraphic.FillRectangle(oBrush, 0, 0, 468, 60);
    
                    Font oFont = new Font("Arial", 13);
                    PointF oPoint = new PointF(5f, 5f);
    
                    oGraphic.DrawString(sText, oFont, oBrushwrite, oPoint);
    
                    Response.ContentType = "image/jpeg";
                    oBitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
            }





    segunda-feira, 4 de fevereiro de 2013 22:57

Respostas

  • Olá Terra,

    O Nuno já respondeu o que tem que fazer, eu estava testando isso, e abaixo está o código de como deve ficar:


            protected void btnGerar_Click(object sender, EventArgs e)
            {
                Bitmap oBitmap = new Bitmap(468, 60);
                Graphics oGraphic = Graphics.FromImage(oBitmap);
    
                String scolor = "Black";
    
                var sb = new StringBuilder();
                essa.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
    
                string sText = sb.ToString();
                Color oColor = Color.FromName(scolor);
    
                SolidBrush oBrush = new SolidBrush(oColor);
                SolidBrush oBrushwrite = new SolidBrush(Color.White);
    
                oGraphic.FillRectangle(oBrush, 0, 0, 468, 60);
    
                Font oFont = new Font("Arial", 13);
                PointF oPoint = new PointF(5f, 5f);
    
                oGraphic.DrawString(sText, oFont, oBrushwrite, oPoint);
    
                Response.ContentType = "image/jpeg";
                oBitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
            }

    Uma observação para o RenderControl funcionar vc deve fazer override do metodo "VerifyRenderingInServerForm" para não chamar o método da classe base, e tbm setar a propriedade "EnableEventValidation" da página para false.

    Qualquer coisa é só perguntar. Abraços!



    Alexsandre R. Almeida
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    terça-feira, 5 de fevereiro de 2013 02:38

Todas as Respostas

  • Olá Terra,

    quando um HtmlControl tem mais que um filho não dá para usar a propriedade InnerHtml. Uma solução é usar o método RenderControl.


    Nuno Gomes http://nunogomes.net

    terça-feira, 5 de fevereiro de 2013 00:30
  • Olá Terra,

    O Nuno já respondeu o que tem que fazer, eu estava testando isso, e abaixo está o código de como deve ficar:


            protected void btnGerar_Click(object sender, EventArgs e)
            {
                Bitmap oBitmap = new Bitmap(468, 60);
                Graphics oGraphic = Graphics.FromImage(oBitmap);
    
                String scolor = "Black";
    
                var sb = new StringBuilder();
                essa.RenderControl(new HtmlTextWriter(new StringWriter(sb)));
    
                string sText = sb.ToString();
                Color oColor = Color.FromName(scolor);
    
                SolidBrush oBrush = new SolidBrush(oColor);
                SolidBrush oBrushwrite = new SolidBrush(Color.White);
    
                oGraphic.FillRectangle(oBrush, 0, 0, 468, 60);
    
                Font oFont = new Font("Arial", 13);
                PointF oPoint = new PointF(5f, 5f);
    
                oGraphic.DrawString(sText, oFont, oBrushwrite, oPoint);
    
                Response.ContentType = "image/jpeg";
                oBitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
            }

    Uma observação para o RenderControl funcionar vc deve fazer override do metodo "VerifyRenderingInServerForm" para não chamar o método da classe base, e tbm setar a propriedade "EnableEventValidation" da página para false.

    Qualquer coisa é só perguntar. Abraços!



    Alexsandre R. Almeida
    E-mail: alexsandrer@gmail.com
    Twitter: @AlexRAlmeida

    terça-feira, 5 de fevereiro de 2013 02:38