WPF - Convertendo HTML para XAML e RTF para HTML (C#)


 No artigo de hoje veremos como converter HTML para XAML e RTF para HTML usando o código da Microsoft oriundo de https://msdn.microsoft.com/en-us/library/aa972129.aspx em uma aplicação WPF com a linguagem C#.

Já precisou converter de HTML para XAML ou de RTF para HTML ?

É quase certo que não, mas nunca se sabe, não é mesmo...

Este artigo se propõe a mostrar como realizar tais conversões usando o código demo disponibilizado pela Microsoft no link : https://msdn.microsoft.com/en-us/library/aa972129.aspx.

Antes de por a mão na massa vamos a alguns conceitos...

Nota: Esse projeto é uma adaptação do original : https://code.msdn.microsoft.com/windowsdesktop/Converting-between-RTF-and-aaa02a6e

Conceitos

A XAML ou Extensible Application Markup Language é uma linguagem baseada em XML criada pela Microsoft sendo fundamental para o desenvolvimento de aplicações WPF - Windows Application Foundation.

 

A XAML é a linguagem usada para criar interfaces com usuário e representar dados em aplicações WPF, sendo também usada para criar workflows em aplicações WF - Windows WorkFlow Foundation.

 

A XAML pode ser compilada ou interpretada; dependendo de como for usada, alguns recursos como embutir código C# ou VB no XAML só funcionam quando a XAML é compilada. Quando você cria uma aplicação WPF no VS 2008 a XAML usada na aplicação é compilada em um executável. Porém você pode criar arquivos .xaml que podem ser interpretados em tempo de execução sem envolver compilação. Estes arquivos XAML são geralmente hospedados em um servidor web.

O RTF, acrônimo de Rich Text Format ou Formato Rico de Texto, é um formato de arquivo de documento desenvolvido e de propriedade da Microsoft desde 1987 para intercâmbio de documentos entre diversas plataformas,Preferencialmente em Wordpad. A maioria dos processadores de texto são capazes de ler e escrever documentos RTF. Ao contrário da maioria dos formatos de processamento de textos, RTF é um formato legível (human-readable). Fonte: http://pt.wikipedia.org/wiki/Rich_Text_Format

HTML - HyperText Markup Language, significa Linguagem de Marcação de Hipertexto, e é uma linguagem de marcação utilizada para produzir páginas na Web. Os documentos HTML podem ser interpretados por navegadores. Esta tecnologia é fruto da junção entre os padrões HyTime e SGML.

HyTime é um padrão para a representação estruturada de hipermídia e conteúdo baseado em tempo. Um documento é visto como um conjunto de eventos concorrentes dependentes de tempo (como áudio, vídeo, etc.), conectados por hiperligações. O padrão é independente de outros padrões de processamento de texto em geral.

SGML é um padrão de formatação de textos. Não foi desenvolvido para hipertexto, mas tornou-se conveniente para transformar documentos em hiperobjetos e para descrever as ligações.

Fonte : http://pt.wikipedia.org/wiki/HTML

O exemplo do artigo converte HTML para e a partir de um documento de XAML. Mas isso não torna as coisas mais fáceis até você perceber que há uma maneira de converter RTF para XAML e XAML para RTF facilmente. A chave é usar System.Windows.Controls.RichTextBox que pode carregar RTF/XAML de um stream e salvá-lo como XAML/RTF.

Recursos usados :

Exemplo prático no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual C# -> WPF Application;

Informe o nome Conversor_HTM_RTF_XAML e clique no botão OK;

A seguir incluir no arquivo MainWindow.xaml o seguintes controles a partir da Toolbox:

O leiaute da aplicação deverá esta conforme a figura abaixo:

Nota: Na primeira TabPage foi incluído o botão Colar para mostrar como colar o código do ClipBoard.

O código XAML que gerou o leiaute acima pode ser visto abaixo no arquivo MainWindow.xaml:

   <Window x:Class="Conversor_HTM_RTF_XAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         Title="Conversor HTML para XAML">
    <Border Background="LightSteelBlue" Margin="5,5,5,119" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" BorderBrush="DarkSlateGray" BorderThickness="1">
        <TabControl Margin="5,5,5,9">
            <TabItem Header="HTML para XAML">
                <StackPanel Margin="10">
                    <TextBlock Margin="10" TextWrapping="Wrap" VerticalAlignment="Top">Cole o conteúdo HTML na caixa de texto abaixo, pressione o botão 'Converter'para converter o HTML para XAML.</TextBlock>
                    <TextBox Margin="10" Name="txtHTML_XAML" TextWrapping="Wrap" BorderBrush="DarkSlateBlue" HorizontalAlignment="Stretch" MinHeight="200" MaxHeight="400" xml:space="preserve" AcceptsReturn="True"/>
          <StackPanel Orientation="Horizontal" Margin="5" VerticalAlignment="Bottom" Height="47">
            <Button Click="convertHTMLToXAML" Margin="5" Height="34" Width="83">Converter</Button>
            <Button Click="copyXAML" Margin="5">Copiar para o Clipboard</Button>
            <Button x:Name="btnColar" Content="Colar" Width="86" Margin="0,5,0,7" Click="btnColar_Click"/>
          </StackPanel>
        </StackPanel>
            </TabItem>
            <TabItem Header="XAML para HTML">
                <StackPanel Margin="10">
                    <TextBlock Margin="10" TextWrapping="Wrap" VerticalAlignment="Top">Cole o conteúdo XAM no TextBox abaixo, e clique no botão "Converter" para converter o XAML para HTML.</TextBlock>
                    <TextBox Margin="10" Name="txtXAML_HTML" BorderBrush="DarkSlateBlue" HorizontalAlignment="Stretch" MinHeight="200" MaxHeight="400" xml:space="preserve" AcceptsReturn="True"/>
            <StackPanel Orientation="Horizontal" Margin="5" VerticalAlignment="Bottom" Height="45">
              <Button Click="convertXAMLToHTML" Margin="5" Width="79">Converter</Button>
              <Button Click="copyHTML" Margin="5">Copiar para o Clipboard</Button>
            </StackPanel>
          </StackPanel>
            </TabItem>
            <TabItem Header="RTF para HTML">
                <StackPanel Margin="10">
                    <TextBlock Margin="10" TextWrapping="Wrap" VerticalAlignment="Top" Text="Cole o conteúdo RTF no TextBox abaixo e pressione o botão 'Converter' para converter de RTF para HTML."/>
                    <TextBox Margin="10" Name="txtRTF_HTML" BorderBrush="DarkSlateBlue" HorizontalAlignment="Stretch" MinHeight="200" MaxHeight="400" xml:space="preserve" AcceptsReturn="True"/>
            <StackPanel Orientation="Horizontal" Margin="5" VerticalAlignment="Bottom">
              <Button Click="convertRtfToHtml" Margin="5" RenderTransformOrigin="0.5,0.5" Height="30" Width="85">
              	<Button.RenderTransform>
              		<TransformGroup>
              			<ScaleTransform/>
              			<SkewTransform/>
              			<RotateTransform Angle="1.734"/>
              			<TranslateTransform/>
              		</TransformGroup>
              	</Button.RenderTransform>Converter</Button>
              <Button Click="copyHTML2" Margin="5">Copiar para o Clipboard</Button>
            </StackPanel>
          </StackPanel>
            </TabItem>
            <TabItem Header="HTML para RTF" Height="22" VerticalAlignment="Top">
                <Grid>
                    <StackPanel Margin="10">
                        <TextBlock Margin="10" TextWrapping="Wrap" VerticalAlignment="Top" Text="Cole o conteúdo HTML no TextBox abaixo e pressione o botão 'Converter' para converter de HTML para RTF."/>
                        <TextBox AcceptsReturn="True" BorderBrush="DarkSlateBlue" HorizontalAlignment="Stretch" Margin="10" MaxHeight="400" MinHeight="200" Name="txtHTML_RTF" />
                        <StackPanel Margin="5" Orientation="Horizontal" VerticalAlignment="Bottom">
                            <Button Click="convertHtmlToRtf" Content="Converter" Margin="5" Height="32" Width="76" />
                            <Button Click="copyRTF" Content="Copiar para o Clipboard" Margin="5" />
                        </StackPanel>
                    </StackPanel>
                </Grid>
            </TabItem>
        </TabControl>
    </Border>
</Window>

Crie uma nova pasta chamada API na raiz do projeto e inclua as classes da Microsoft no seu interior.

Para isso clique no menu PROJECT e clique em New Folder informando o nome API;

A seguir clique com botão direito do mouse sobre a pasta API e selecione Add -> Existing Item;

Copie os arquivos da Microsoft conforme mostra a figura abaixo:

Agora abra o arquivo MainWindow.xaml.cs e inclua o código abaixo referente aos eventos Clicks dos botões de comando da interface:

using System.Windows;
using MarkupConverter;
using System;
namespace Conversor_HTM_RTF_XAML
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private IMarkupConverter markupConverter;
        public MainWindow()
        {
            InitializeComponent();
            markupConverter = new MarkupConverter.MarkupConverter();
        }
        public void convertHTMLToXAML(object sender, RoutedEventArgs e)
        {
            try
            {
                txtHTML_XAML.Text = markupConverter.ConvertHtmlToXaml(txtHTML_XAML.Text);
                MessageBox.Show("Conversão do conteúdo realizado com sucesso !");
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        public void convertXAMLToHTML(object sender, RoutedEventArgs e)
        {
            try
            {
                txtXAML_HTML.Text = markupConverter.ConvertXamlToHtml(txtXAML_HTML.Text);
                MessageBox.Show("Conversão do conteúdo realizado com sucesso !");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        public void convertRtfToHtml(object sender, RoutedEventArgs e)
        {
            try
            {
                txtRTF_HTML.Text = markupConverter.ConvertRtfToHtml(txtRTF_HTML.Text);
                MessageBox.Show("Conversão do conteúdo realizado com sucesso !");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        public void convertHtmlToRtf(object sender, RoutedEventArgs e)
        {
            try
            {
                txtHTML_RTF.Text = markupConverter.ConvertHtmlToRtf(txtHTML_RTF.Text);
                MessageBox.Show("Conversão do conteúdo realizado com sucesso !");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        public void copyXAML(object sender, RoutedEventArgs e)
        {
            txtHTML_RTF.SelectAll();
            Clipboard.SetText(txtHTML_RTF.Text);
            MessageBox.Show("Copiado para o ClipBoard !");
        }
        public void copyHTML(object sender, RoutedEventArgs e)
        {
            txtXAML_HTML.SelectAll();
            txtXAML_HTML.Copy();
            MessageBox.Show("Copiado para o ClipBoard !");
        }
        public void copyHTML2(object sender, RoutedEventArgs e)
        {
            txtRTF_HTML.SelectAll();
            txtRTF_HTML.Copy();
            MessageBox.Show("Copiado para o ClipBoard !");
        }
        public void copyRTF(object sender, RoutedEventArgs e)
        {
            txtHTML_RTF.SelectAll();
            txtHTML_RTF.Copy();
            MessageBox.Show("Copiado para o ClipBoard !");
        }
        private void btnColar_Click(object sender, RoutedEventArgs e)
        {
            txtHTML_XAML.Text = Clipboard.GetText();
        }
    }
}

Executando o projeto e selecionando a guia HTML para XAML e colando um trecho de código HTML conforme abaixo:

Ao clicar no botão Converter iremos obter:

Note que a conversão usa o formato FlowDocument que armazena e formata o conteúdo com recursos avançados do documento coo paginação e colunas.

Pegue o projeto completo aqui:  Converter_RTF_HTML.zip

Disse Jesus : "Uma geração má e adúltera pede um sinal, e nenhum sinal lhe será dado, senão o sinal do profeta Jonas. E, deixando-os, retirou-se."
Mateus 16:4

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti