André Alves de Lima

Talking about Software Development and more…

Será que é possível exibir RichText no Report Viewer?

O artigo de hoje vem para responder uma dúvida de um leitor do site: será que é possível exibir RichText no Report Viewer ? O que você acha? Eu não sabia se era possível eu não, mas, acabei descobrindo a resposta depois de pesquisar um bocado. Vamos conferir o resultado?

Criando um RTF de exemplo

Antes de começar, vamos criar um exemplo de RTF. Nesse RTF, vamos colocar alguns tipos de textos, com headings, formatações e bullet points. Além disso, vamos colocar uma tabela e uma imagem. O resultado você confere abaixo:

Você pode baixar esse RTF de exemplo clicando aqui.

Convertendo o RTF para HTML

O Report Viewer não suporta a exibição de RichText nativamente, somente HTML. Dessa forma, a primeira coisa que temos que fazer com o nosso RTF é converte-lo para HTML. Existem alguns exemplos e bibliotecas que fazem a conversão de RTF para HTML (e vice-versa). Vamos analisar o resultado de alguns desses componentes a seguir.

Aspose.Words for .NET: esse é um dos componentes pagos que faz a conversão de RTF para HTML. No momento da escrita desse artigo, a licença dele custa mil dólares. A sua utilização é muito simples, basta criarmos uma instância de Document passando o caminho do RTF e, logo em seguida, temos que chamar o método Save passando o caminho do HTML que queremos gerar.

            // C#
            var asposeDoc = new Aspose.Words.Document("exemplortf.rtf");
            asposeDoc.Save("exemplortf.html");
            ' VB.NET
            Dim AsposeDoc As New Aspose.Words.Document("exemplortf.rtf")
            AsposeDoc.Save("exemplortf.html")

Veja aqui o resultado do HTML gerado por ele.

SubSystems HTML – RTF Convertor: outro componente pago que faz a conversão de RTF para HTML. A licença custa atualmente 549 dólares, ou seja, metade do valor da licença do Aspose. Porém, a sua utilização é muito mais complicada do que o Aspose, demandando muitas e muitas linhas de código para fazer uma simples conversão. O resultado do HTML gerado por essa biblioteca você encontra aqui.

SautinSoft RTF to HTML .Net: mais uma biblioteca paga que possibilita a conversão de RTF para HTML. Dentre todas as bibliotecas pagas que eu testei, essa é a mais em conta, custando atualmente 239 dólares. Sua utilização é muito simples:

// C#
var conversor = new SautinSoft.RtfToHtml();
conversor.OpenRtf("exemplortf.rtf");
conversor.OutputFormat = SautinSoft.RtfToHtml.eOutputFormat.HTML_5;
conversor.ToHtml("exemplortf.html");
' VB.NET
Dim Conversor As New SautinSoft.RtfToHtml()
Conversor.OpenRtf("exemplortf.rtf")
Conversor.OutputFormat = SautinSoft.RtfToHtml.eOutputFormat.HTML_5
Conversor.ToHtml("exemplortf.html")

Com essa biblioteca eu consegui até gerar um HTML que contém a imagem “embedada” (para ver se faz alguma diferença no output do Report Viewer). Confira o resultado aqui.

MSDN Code Gallery – Converting between RTF and HTML: essa foi a primeira opção gratuita que eu testei e olha só aqui o lixo de resultado. Se a biblioteca funcionasse corretamente, o código para fazer a conversão seria muito simples:

            // C#
            var markupConverter = new MarkupConverter();
            var rtf = System.IO.File.ReadAllText("exemplortf.rtf");
            var html = markupConverter.ConvertRtfToHtml(rtf);
            System.IO.File.WriteAllText("exemplortf.html", html);
            ' VB.NET
            Dim MarkupConverter As new MarkupConverter()
            Dim Rtf = System.IO.File.ReadAllText("exemplortf.rtf")
            Dim Html = MarkupConverter.ConvertRtfToHtml(rtf)
            System.IO.File.WriteAllText("exemplortf.html", Html)

Mas, não adianta, para muitas coisas temos que acabar desembolsando uma grana para conseguirmos ter um resultado satisfatório.

CodeProject – Writing Your Own RTF Converter: a última opção de conversor RTF para HTML que eu testei foi esse projeto do CodeProject. A solução é gigantesca, contendo diversos projetos diferentes, mas, mesmo assim, compila certinho. O resultado da conversão foi este. Como você pode perceber, a tabela e a imagem foram para o espaço, mas, as formatações e bullet points ficaram firmes e fortes. Veja só o código para fazer a conversão com essa biblioteca:

// C#
IRtfDocument rtfDocument = RtfInterpreterTool.BuildDoc(ConversionText);
RtfHtmlConverter htmlConverter = new RtfHtmlConverter(rtfDocument);
var html = htmlConverter.Convert();
' VB.NET
Dim RtfDocument = RtfInterpreterTool.BuildDoc(ConversionText)
Dim HtmlConverter As New RtfHtmlConverter(RtfDocument)
Dim Html = HtmlConverter.Convert()

Exibindo o HTML no Report Viewer

A renderização de HTML no Report Viewer é limitada. Como você pode conferir na documentação, somente algumas tags do HTML são suportadas. Além disso, o CSS e estilos são muito limitados. Agora fica a dúvida: como será que essas 5 versões diferentes do RTF convertido para HTML serão renderizadas pelo Report Viewer?

Primeiramente, para testarmos a renderização, vamos criar um projeto do tipo “Windows Forms Application” e, dentro desse projeto, vamos adicionar um novo relatório do Report Viewer. Dê o nome de “RelatorioHtml” para esse novo relatório:

Dentro desse relatório, vamos criar um novo parâmetro chamado “Html“:

Feito isso, temos que arrastar o novo parâmetro para dentro do relatório e redimensiona-lo de forma que ele ocupe toda a área de detalhes do relatório:

Em seguida, temos que alterar as propriedades do placeholder de forma que o HTML seja interpretado pela engine do Report Viewer. Para isso, abrimos a edição do TextBox, clicamos com o botão direito sobre “[@Html]” e escolhemos a opção “Placeholder Properties“:

Na tela que se abre, temos que alterar o “Markup type” para HTML:

Pronto! Agora que temos o nosso relatório concluído, vamos ajustar o formulário para exibi-lo. Abra novamente o formulário, arraste um controle do Report Viewer para dentro dele, ajuste o docking de forma que ele ocupe o espaço inteiro do formulário e escolha o relatório que acabamos de criar:

Em seguida, vamos até o code-behind para passarmos o conteúdo do HTML para o parâmetro que criamos no relatório:

        // C#
        private void FormRelatorio_Load(object sender, EventArgs e)
        {
            var html = System.IO.File.ReadAllText("aspose.html");
            //var html = System.IO.File.ReadAllText("subsystems.html");
            //var html = System.IO.File.ReadAllText("sautinsoft.html");
            //var html = System.IO.File.ReadAllText("codegallery.html");
            //var html = System.IO.File.ReadAllText("ownconverter.html");
            this.reportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WinForms.ReportParameter("Html", html));
            this.reportViewer1.RefreshReport();
        }
    ' VB.NET
    Private Sub FormRelatorio_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Html = System.IO.File.ReadAllText("aspose.html")
        'Dim Html = System.IO.File.ReadAllText("subsystems.html")
        'Dim Html = System.IO.File.ReadAllText("sautinsoft.html")
        'Dim Html = System.IO.File.ReadAllText("codegallery.html")
        'Dim Html = System.IO.File.ReadAllText("ownconverter.html")
        Me.ReportViewer1.LocalReport.SetParameters(New Microsoft.Reporting.WinForms.ReportParameter("Html", Html))
        Me.ReportViewer1.RefreshReport()
    End Sub

Como você pode perceber, podemos testar cada uma das conversões de RTF para HTML removendo o comentário da linha que está fazendo o carregamento desejado e comentando todas as outras linhas. Antes de executar a aplicação, precisamos copiar os resultados das conversões para o diretório bin/debug da aplicação. Eu compactei todos os resultados em um arquivo só e você pode baixa-lo através deste link.

Se você não quiser perder o seu tempo, aqui vão as imagens que representam o resultado de cada uma das conversões:

Aspose

SubSystems

SautinSoft

Code Gallery

CodeProject

E aí, ficou decepcionado(a)? Pois eu fiquei. Como você pode bem perceber pelos resultados apresentados acima, o HTML do Report Viewer é bem limitado. Em nenhum dos casos ele conseguiu renderizar a tabela e muito menos a imagem.

E no Crystal Reports, será que ficaria melhor?

Talvez você já tenha ouvido falar que o Crystal Reports suporta RTF e HTML por padrão nos controles de texto, então, pode ser que você esteja pensando em desenvolver seus relatórios no Crystal Reports para aproveitar o RTF ou HTML nos seus relatórios. Mas, será que a renderização desses formatos é tão melhor assim no Crystal Reports?

Primeiro eu fiz um teste tentando renderizar o próprio RTF em um relatório do Crystal Reports:

Ele se saiu melhor do que todos os resultados do Report Viewer, mas, mesmo assim, ainda não chega nem perto de corresponder ao RTF original. As linhas de grade da tabela e a imagem não são exibidas.

E, para finalizar, eu fiz também o teste com cada um dos HTMLs convertidos:

Aspose

SubSystems

SautinSoft

Code Gallery

CodeProject

Mais uma vez, não obtivemos um resultado razoável com nenhuma das opções de HTML. Ou seja, o Crystal Reports também não é lá tão bom assim no quesito renderização de RTF e HTML.

E agora? O que eu faço?

Agora que já vimos que nem o Report Viewer nem o Crystal Reports apresenta um bom resultado na exibição de RTF e HTML, o que podemos fazer para resolver esse problema? Na minha opinião, nos resta dois cenários:

– Desenhar o RTF diretamente como um relatório do Report Viewer
– Não utilizar a engine do Report Viewer para exibir o RTF

A primeira opção é bem óbvia. Se desenharmos o relatório diretamente no Report Viewer, aí não tem erro. As ferramentas de design do Report Viewer são mais do que suficientes para gerar os mais diversos tipos de layouts de relatórios. Dependendo da complexidade do RTF, vai dar um certo trabalho, mas, com certeza você conseguirá portar o seu RTF para um relatório do Report Viewer sem muitos problemas.

Já a segunda opção é abandonar o Report Viewer para esse relatório específico e imprimir o RTF diretamente para a impressora ou utilizando um PrintPreview. Veja alguns exemplos dessa implementação:

How to print the content of a RichTextBox control by using Visual C# .NET or Visual C# 2005
CodeProject: RichTextBoxDocument

Concluindo

A conclusão que você conferiu nesse artigo é que a engine do Report Viewer não consegue renderizar muito bem RichText. Como o Report Viewer não suporta a exibição de RTF nativamente (só HTML), tentamos converter o RTF para HTML utilizando várias ferramentas (pagas e gratuitas), mas, o mecanismo de renderização HTML do Report Viewer é muito limitado e o resultado não foi satisfatório.

Testamos também a mesma funcionalidade do Crystal Reports, que se saiu um pouquinho melhor, mas, mesmo assim, bem longe do ideal. Nesse caso, só nos resta reconstruir o relatório diretamente no Report Viewer ou imprimir o RTF com um PrintPreview (sem o Report Viewer ou Crystal Reports).

O que você achou desse experimento? Você já precisou de algo assim nos seus relatórios? Como é que você acabou resolvendo? Conte-nos mais detalhes na caixa de comentários logo abaixo.

Antes de me despedir, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado, ficará sabendo em primeira mão sobre o artigo da próxima semana e receberá também dicas “bônus” que eu só compartilho por e-mail. Além disso, você já deve ter percebido que eu recebo muitas sugestões de temas e eu costumo dar prioridade às sugestões vindas de inscritos da minha newsletter. Inscreva-se utilizando o formulário logo abaixo.

Até a próxima!

André Lima

Photo by Pixabay used under Creative Commons
https://pixabay.com/en/fountain-pen-text-leave-white-442066/

Newsletter do André Lima

* indicates required



Powered by MailChimp

11 thoughts on “Será que é possível exibir RichText no Report Viewer?

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *