15 06 2016
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/
Exibindo PDF no Windows Forms Trabalhando com gráficos no Crystal Reports
Ola amigo, estou Desenvolvendo um sistema que cadastro uma ficha de exame de um paciente depois de cadastrado, fiz uma ficha no reportviewer com caixa de texto e nela setei os campos do banco de dado com id, nome… ai deu certo na hora que mando para imprimir, mas aparece somente a ficha exemplo: id 1, a primeira ficha e nao mostra a bindingNavigator do reportview que tem mais fichas cadastrada mais na bindingNavigator do form cadastro aparece todas fichas cadastradas
Olá Marcos!
Como é que você está fazendo para mandar os dados para o relatório? Por parâmetros ou via DataSet? Poderia compartilhar o seu código?
Abraço!
André Lima
Olá Amigo veja a imagem
https://goo.gl/Qwjmx5
Sim é Via Dataset
Estou Conseguindo com o PrintDocument
exemplo:
e.Graphics.DrawString(“Nome:” new Font(“Arial”,12)…
Mais é muito demorado alinhar pelo report é muito rapido mais nao estou conseguindo ou não tem como mesmo?
Codigo
https://drive.google.com/open?id=1_xCCIOUbYanF_344GkqqGgfaV392SiXu
Estou iniciando na programação.
também estou tentando descobrir no textbox Leucócitos Totais vai entrar exemplo: 9900
quando fazer o calculo nao calcular o 00 somente o 99
Olá Marcos!
O que acontece é que você tem múltiplos registros no DataSet e está trabalhando somente com TextBoxes no relatório.. Para relatórios que trabalhem com múltiplos registros, você precisa utilizar um componente no relatório que suporte esses múltiplos registros (por exemplo, list, table ou matrix).. Você teria que agrupar os dados pelo número da coleta e, aí sim, o relatório mostraria uma página para cada coleta..
Eu escrevi um artigo há muito tempo atrás sobre agrupamentos no Report Viewer.. Acho que ele vai te ajudar:
Agrupamentos Simples no Report Viewer do VS 2010
Além desse artigo, tem também uma apresentação que eu fiz no ano passado sobre relatórios mestre/detalhe no Report Viewer.. Acredito que ele possa te ajudar também:
Relatórios mestre/detalhe com Report Viewer
Abraço!
André Lima
Olá André Lima, Obrigado pelo retorno, eu Fiz com outro sem usar o report mesmo, você poderia me ajudar com este calculo não estou conseguindo
Como mostra na imagem abaixo
https://drive.google.com/open?id=1Hy5HnIjF6rOAKvoB4XyzsrQPyvz8uOpS
Olá Marcos!
Não entendi.. Não seria só dividir o resuldado por 100?
Abraço!
André Lima
Olá André!
Desculpa ai atenção, Obrigado!
De nada, Marcos! Qualquer coisa é só entrar em contato novamente..
Abraço!
André Lima