Código de barras e logo no MVC 3

May 17, 2011 at 3:42 PM
Edited May 17, 2011 at 3:49 PM

Olá, pessoal.

Estou desenvolvendo uma aplicação em mvc 3 e tentei utilizar o Boleto.Net.

Tudo está perfeito, menos as imagens.

Verifiquei outros tópicos, mas não resolveu o meu problema. A imagem do logo está apontando para pasta temporaria do windows:

<img src="C:\Windows\TEMP\BoletoNet033.jpg">

E para a imagem do código de barras:

<img src="C:\Windows\TEMP\tmpB92B.tmp">

 

No web.config está desta forma:

<system.webServer>
   <validation validateIntegratedModeConfiguration="false"/>
   <modules runAllManagedModulesForAllRequests="true"/>
   <handlers>
	<!--Usado no Boleto.Net para gerar a imagem do código de barras-->
	<add name="ImagemCodigoBarra" verb="*" path="ImagemCodigoBarra.ashx" type="BoletoNet.ImagemCodigoBarraHandler"/>
   </handlers>
</system.webServer>

 

E o Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
    //...
}

 

Estou fazendo algo errado?

May 17, 2011 at 7:07 PM

Consegui fazer funcionar no MVC desta forma:

StringBuilder sb = new StringBuilder();
System.IO.StringWriter tw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);

bb.Page = new System.Web.UI.Page();
bb.RenderControl(hw);

string html = sb.ToString();

May 25, 2011 at 1:07 AM

tonholis, como você fez para funcionar no MVC 3?
Adicionei as configurações no global.asax, web.config.
E executei o que você citou na view, e nenhum resolveu 

Dec 26, 2011 at 4:09 PM
Edited Dec 27, 2011 at 1:28 PM

Caso alguém tenha o mesmo problema que eu tive. Resolvi de um jeito bem simples.(infelizmente isso acaba implicando em algumas alterações no fonte da biblioteca, mas é uma solução facil de fazer).

Na view, criei um Extension method para a classe BoletoBancario usando a solução do tonholis:

 

public static string ToHtml(this BoletoNet.BoletoBancario bb)
{
            StringBuilder sb = new StringBuilder();
            System.IO.StringWriter tw = new System.IO.StringWriter(sb);
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
            bb.Page = new System.Web.UI.Page();
            bb.RenderControl(hw);

            string html = sb.ToString();
            return html;
}

 

Isso vai resolver boa parte do problema, mas pra mim ainda não resolveu o código de barras.

Depois de MUITO lutar, desisti do HttpHandler e alterei o projeto do BoletoNet para .net 4.0, e criei a seguinte classe:

 

public class BoletoController : Controller
    {
        public void ImagemCodigoBarra(string code)
        {
            this.Response.Write(code);
            string contentType = "image/jpeg";
            string filename = "barcode2of5.jpg";

            this.Response.Clear();
            this.Response.ContentType = contentType;
            this.Response.AddHeader("content-disposition", "outline;filename=" + filename);

            System.Drawing.Bitmap img = new C2of5i(code, 1, 50, code.Length).ToBitmap();

            //img = img.GetThumbnailImage(460, 61, null, new IntPtr()) as System.Drawing.Bitmap;

            img.Save(this.Response.OutputStream, ImageFormat.Jpeg);
            img.Dispose();

            //context.Response.BinaryWrite(new C2of5i(code, 1, 50, code.Length).ToByte());
            this.Response.Flush();
        }
    }

 

 Se notarem, o metodo tem o mesmo nome que o handler, e até o mesmo codigo que está sendo usado lá. Depois disso fui no metodo Render da classe BoletoBancario e alterei a ultima linha para:

 

output.Write(MontaHtml(urlImagemLogo, urlImagemBarra, "<img src=\"/Boleto/ImagemCodigoBarra?code=" + Boleto.CodigoBarra.Codigo + "\" alt=\"C�digo de Barras\" />"));

 

 notem que nesse caso não uso mais o handler, e sim a controller que criei dentro do BoletoNet.

 

depois disso tudo, fiz uma view tipada com a model sendo um BoletoBancario, e só fiz essa linha:

@Html.Raw(this.Model.ToHtml())

 

Aqui resolveu, e até acho que seria interessante se tivesse alguma solução especifica pro MVC dentro da biblioteca(embora eu ache meio dificil, já que imagino que ela tenha que continuar com a compatibilidade pro .net 2.0)

 

Feb 22, 2012 at 8:28 PM

Reparei que ele não é encontrado pois o endereço gerado é direcionado para uma raiz dinamica: veja: src="ImagemCodigoBarra....
Neste caso tudo o que temos a fazer é direcionar para um endereço absoluto:

public static string ToHtml(this BoletoNet.BoletoBancario bb)
        {
            StringBuilder sb = new StringBuilder();
            System.IO.StringWriter tw = new System.IO.StringWriter(sb);
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
            bb.Page = new System.Web.UI.Page();
            bb.RenderControl(hw);

            string html = sb.ToString();
            return html.Replace("src=\"ImagemCodigoBarra.ashx", "src=\"/ImagemCodigoBarra.ashx");
        }

Adiciona o arQuivo "ImagemCodigoBarra.ashx" na raiz de sua aplicação MVC3.
Conteúdo do arquivo:

<%@ WebHandler Language="C#" Class="BoletoNet.ImagemCodigoBarraHandler" %>

 

Não há necessidade de modificação do codigo fonte da biblioteca, utilizando a solução acima.

Feb 22, 2012 at 9:49 PM
aferlim wrote:

Reparei que ele não é encontrado pois o endereço gerado é direcionado para uma raiz dinamica: veja: src="ImagemCodigoBarra....
Neste caso tudo o que temos a fazer é direcionar para um endereço absoluto:

 

public static string ToHtml(this BoletoNet.BoletoBancario bb)
        {
            StringBuilder sb = new StringBuilder();
            System.IO.StringWriter tw = new System.IO.StringWriter(sb);
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
            bb.Page = new System.Web.UI.Page();
            bb.RenderControl(hw);

            string html = sb.ToString();
            return html.Replace("src=\"ImagemCodigoBarra.ashx", "src=\"/ImagemCodigoBarra.ashx");
        }

 

Adiciona o arQuivo "ImagemCodigoBarra.ashx" na raiz de sua aplicação MVC3.
Conteúdo do arquivo:

<%@ WebHandler Language="C#" Class="BoletoNet.ImagemCodigoBarraHandler" %>

 

 

Não há necessidade de modificação do codigo fonte da biblioteca, utilizando a solução acima.

no arquivo Global.asax:

routes.IgnoreRoute("{handler}.ashx/{*pathInfo}");
 

Developer
Nov 16, 2012 at 6:34 AM

Boa noite turma,

Estamos implementando novas rotinas para o uso da biblioteca com asp.net mvc.

Logo estará disponível.

May 10, 2013 at 8:39 PM
Para mim essa solucção resolveu, porém o boleto perdeu todas as linhas e a formatação, alguem teve esse problema?
Aug 26, 2013 at 2:20 AM
Douglas,

Tive esse problema também mas consegui resolver de forma simples. Na verdade o que é necessário fazer é combinar o output do método MontaHtml() com o output renderizado do controle. De forma prática é o seguinte:
string boletoHTML = boletoBancario.MontaHtml();
string headHTML = boletoHTML.Substring(0, boletoHTML.IndexOf("<body>") + 6);

StringBuilder sb = new StringBuilder();
System.IO.StringWriter tw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);

boletoBancario.Page = new System.Web.UI.Page();
boletoBancario.RenderControl(hw);

string tableHTML = sb.ToString().Replace("src=\"ImagemCodigoBarra.ashx", "src=\"/ImagemCodigoBarra.ashx");

boletoHTML = headHTML + tableHTML + "</body></html>";
return boletoHTML;
Desta forma funciona o HTML é construído de forma completa, trazendo as imagens necessárias.

Abs,
Eduardo Freitas
Jun 6, 2014 at 7:13 PM
Eduardo, boa tarde!

O seu código me ajudou bastante. Agora o código de barra está aparecendo e a segunda logo do banco no boleto também.
Entretanto, a primeira logo do boleto, que pelo que percebi utilizando o firebug, está em uma basta TEMP, não aparece de jeito nenhum.

Segue abaixo meu código:
        string boletoHTML = boletoBancario.MontaHtml();
        string headHTML = boletoHTML.Substring(0, boletoHTML.IndexOf("<body>") + 6);

        StringBuilder sb = new StringBuilder();
        System.IO.StringWriter tw = new System.IO.StringWriter(sb);
        System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);

        boletoBancario.Page = new System.Web.UI.Page();
        boletoBancario.RenderControl(hw);

        string tableHTML = sb.ToString().Replace("src=\"ImagemCodigoBarra.ashx", "src=\"/ImagemCodigoBarra.ashx");

        boletoHTML = headHTML + tableHTML + "</body></html>";
        return boletoHTML;
Já criei o arquivo ImagemCodigoBarra.ashx e adiocionei <%@ WebHandler Language="C#" Class="BoletoNet.ImagemCodigoBarraHandler" %>.

Também já adicionei no global.asax routes.IgnoreRoute("{handler}.ashx/{*pathInfo}");

Mais alguma coisa que preciso fazer?

Desde já, obrigado!

Guilherme Batista
Jun 6, 2014 at 7:31 PM
Edited Jun 18, 2014 at 7:22 PM
Por favor, considerar alterar o código abaixo para não ser mais necessário a alteração de código no MVC ou WebForms.

Arquivo BOLETOBANCARIO.CS NA PASTA BOLETOIMPRESSAO

Chamada do metodo = boletoBancario.MontaHtml("~/Content/Boletos/", null);
public string MontaHtml(string fileName, string logoCedente)
        {
            if (string.IsNullOrEmpty(fileName))
                fileName = System.IO.Path.GetTempPath();

            if (!string.IsNullOrEmpty(logoCedente))
                vLocalLogoCedente = VirtualPathUtility.ToAbsolute(logoCedente);

            this.OnLoad(EventArgs.Empty);

            if (!Directory.Exists(HttpContext.Current.Server.MapPath(fileName)))
                Directory.CreateDirectory(HttpContext.Current.Server.MapPath(fileName));

            string fnLogo = VirtualPathUtility.ToAbsolute(fileName + @"BoletoNet" + Utils.FormatCode(_ibanco.Codigo.ToString(), 3) + ".jpg");

            if (!System.IO.File.Exists(HttpContext.Current.Server.MapPath(fnLogo)))
                Image.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("BoletoNet.Imagens." + Utils.FormatCode(_ibanco.Codigo.ToString(), 3) + ".jpg")).Save(HttpContext.Current.Server.MapPath(fnLogo));

            string fnBarra = VirtualPathUtility.ToAbsolute(fileName + @"BoletoNetBarra.gif");
            if (!File.Exists(HttpContext.Current.Server.MapPath(fnBarra)))
                Html.barra.Save(HttpContext.Current.Server.MapPath(fnBarra));

            C2of5i cb = new C2of5i(Boleto.CodigoBarra.Codigo, 1, 50, Boleto.CodigoBarra.Codigo.Length);
            var codBarra = @"data:image/gif;base64," + Convert.ToBase64String(cb.ToByte());

            return HtmlOffLine(null, fnLogo, fnBarra, codBarra).ToString();
        }
Jul 3, 2014 at 8:11 PM
Olá, boa tarde.

Por acaso conseguiram resolver o problema da primeira imagem do boleto?

Continuo a tentar.
Jul 9, 2014 at 1:20 PM
Consegui.

Por algum motivo, ao gerar o boleto a primeira imagem não era encontrada no caminho especificado, no caso a pasta Temp.

Para resolver o problema, toda vez que eu gero o boleto, eu dou um replace nesse caminho para o caminho da segunda imagem, que estava aparecendo normalmente.

Assim, ao gerar o boleto, as duas imagens estão aparecendo.

Segue abaixo o que fiz:
string boletoHTML = boletoBancario.MontaHtml();
string headHTML = boletoHTML.Substring(0, boletoHTML.IndexOf("<body>") + 6);

StringBuilder sb = new StringBuilder();
System.IO.StringWriter tw = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);

boletoBancario.Page = new System.Web.UI.Page();
boletoBancario.RenderControl(hw);

string tableHTML = sb.ToString();

boletoHTML = headHTML + tableHTML + "</body></html>";
boletoHTML = boletoHTML.Replace("src=\"ImagemCodigoBarra.ashx", "src=\"/ImagemCodigoBarra.ashx");    

string link = @"C:\Windows\TEMP\BoletoNet341.jpg";
boletoHTML = boletoHTML.Replace(link, "/WebResource.axd?d=nFg4Pz94bXA7Z3yN3vGxLGIb6_s9ajn6lx2hRyedgEwkLmyyEaRJw2NNjeHV4lnfzmX4IreLqQxFUDDf8wyYkm8fY36VOFz6A_33MpbTKuRU6fzzdyOmQ6tizRLw0TKe0&amp;t=635398886008425180");

return boletoHTML;
Espero que ajude outras pessoas.
Abraços.
Jul 24, 2014 at 1:51 PM
Amigos

Bom dia

Alguem já conseguiu criar um modulo usando o boletonet para o Nopcommerce?
Developer
Apr 22, 2015 at 1:59 PM
Prezados,

O problema já foi corrigido. O código fonte deste projeto agora está no gitHub (https://github.com/BoletoNet).
Caso a alteração ainda não esteja disponível, basta fazer o seguinte:

Na pasta Models, arquivo Exemplos, onde tiver o código
    return boletoBancario.MontaHtml("/Content/Boletos/", "");
substituir por
    return boletoBancario.MontaHtmlEmbedded();
Fico no aguardo do retorno do seu teste.