C# - Convertendo TXT e RTF para o formato PDF


 No artigo de hoje vou mostrar como podemos converter arquivos no formato TXT e/ou RTF para o formato PDF usando os recursos do Word via objetos de interoperabilidade do Office.

O Visual C# apresenta novos recursos que simplificam o acesso a objetos da API do Office. Os novos recursos incluem argumentos nomeados e opcionais, um novo tipo chamado dynamic e a capacidade de passar argumentos para parâmetros de referência em métodos COM como se fossem parâmetros de valor.

Neste artigo , vamos usar os novos recursos para escrever código que cria documentos PDF a partir de documentos TXT ou RTF usando a interoperabilidade do Microsoft Word.

Para poder usar este recurso basta incluir no projeto uma referência à API Microsoft.Office.Interop.Word da seguinte forma:

No menu Project clique em Add Reference e a seguir clique na guia COM e marque a opção :  Microsoft Word 16.0 Object Library; (ou a versão instalada na sua máquina)


 

Pronto. Já podemos usar os recursos de interoperabilidade para realizar a tarefa pretendida.

Recursos usados :

Criando o projeto no VS 2015 Community

Abra o VS 2015 Community e clique em New Project;

A seguir selecione Visual C# -> Windows Forms Application;

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

No formulário form1.cs vamos incluir os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

No formulário Form1.cs defina os seguintes namespaces:

using System;
using System.Diagnostics;
using System.IO;
using System.Windows.Forms;
// Referencia ao Microsoft.Office.Interop.Word.
using Word = Microsoft.Office.Interop.Word;

A seguir defina no início do formulário a declaração da variável a seguir:

object formato_doc;

gora no evento Click do botão de comando para selecionar arquivos no primeiro GroupBox - btnProcurarOrigem - inclua o código que irá abrir a caixa de diálogo OpenFileDialog(ofd1) permitindo selecionar um arquivo origem:

       private void btnProcurarOrigem_Click(object sender, EventArgs e)
        {
            //define as propriedades do controle OpenFileDialog
            this.ofd1.Multiselect = true;
            this.ofd1.Title = "Selecione o arquivo de Origem";
            ofd1.InitialDirectory = @"C:\Dados\";
            //filtra para exibir somente arquivos RTF e TXT
            ofd1.Filter = "Arquivos (*.RTF;*.TXT)|*.RTF;*.TXT|" + "Todos (*.*)|*.*";
            ofd1.CheckFileExists = true;
            ofd1.CheckPathExists = true;
            ofd1.FilterIndex = 1;
            ofd1.RestoreDirectory = true;
            ofd1.ReadOnlyChecked = true;
            ofd1.ShowReadOnly = true;
            DialogResult resultado = ofd1.ShowDialog();
            if (resultado == DialogResult.OK) 
            {
                txtOrigem.Text = ofd1.FileName;
            }
            else
            {
                txtOrigem.Text = "";
            }
        }

Aqui definimos algumas propriedades iniciais para o controle e atribuímos o nome do arquivo selecionado á caixa de texto:  txtOrigem.Text = ofd1.FileName

No evento Click do botão de comando btnProcurarDestino - inclua o código que irá abrir a caixa de diálogo FolderBrowserDialog(bfd1) permitindo selecionar uma pasta de destino:

        private void btnProcurarDestino_Click(object sender, EventArgs e)
        {
            //Define as propriedades do controle FolderBrowserDialog
            fbd1.Description = "Selecione uma pasta de destino";
            fbd1.SelectedPath = @"C:\Dados\PDF\";
            fbd1.ShowNewFolderButton = true;
            //Exibe a caixa de diálogo
            DialogResult resultado = fbd1.ShowDialog();
            if (resultado == DialogResult.OK)
            {
                //Exibe a pasta selecionada e cria um nome aleatorio para o arquivo
                //ou atribui o nome do arquivo igual ao do arquivo de origem sem a extensão
                //txtDestino.Text = fbd1.SelectedPath + "\\" + string.Format(@"{0}.pdf", DateTime.Now.Ticks);
                txtDestino.Text = fbd1.SelectedPath + "\\" + Path.GetFileNameWithoutExtension(txtOrigem.Text) + ".pdf";
            }
            else
            {
                txtDestino.Text = "";
            }
        }

Aqui definimos a pasta de destino e montamos o nome do arquivo obtendo o mesmo nome do arquivo origem sem a extensão usando o método GetFileNameWithoutExtension().

Nota: Você pode usar a opção de gerar um nome aleatório baseado na propriedade Ticks do objeto DateTime.(Veja o código comentado)

Agora no evento Click  do botão de comando - Converter - inclua o código a seguir:

       private void btnConverter_Click(object sender, EventArgs e)
        {
            if(string.IsNullOrEmpty(txtOrigem.Text) || string.IsNullOrEmpty(txtDestino.Text))
            {
                MessageBox.Show("Informe o arquivo ORIGEM e o arquivo DESTINO");
                return;
            }
            Cursor = Cursors.WaitCursor;
            // Obtem o objeto da aplicação Word
            Word._Application aplicacaoWord = new Word.Application();
            // Torna o Word Visivel (opcional).
            //aplicacaoWord.Visible = true;
            // Abre o arquivo
            object arquivoOrigem = txtOrigem.Text;
            object missing = Type.Missing;
            aplicacaoWord.Documents.Open(ref arquivoOrigem, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing,
                ref missing, ref missing, ref missing, ref missing);
            // Salva o arquivo de saida
            object arquivoDestino = txtDestino.Text;
            // 16 para docx, 0 for doc.
            if (rdbDOC.Checked)
            {
                object formato_doc = (int)0;
            }

            Word._Document documentoAtivo = aplicacaoWord.ActiveDocument;
            documentoAtivo.SaveAs(ref arquivoDestino, ref formato_doc,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing);
            // Sai do aplicativo sem avisar
            object false_obj = false;
            //fecha e sai
            documentoAtivo.Close(ref false_obj, ref missing, ref missing);
            aplicacaoWord.Quit(ref missing, ref missing, ref missing);
            Cursor = Cursors.Default;
            MessageBox.Show("Conversão concluída com Sucesso.\n\n O arquivo será aberto pelo aplicativo padrão...");
            //defina qual o seu programa padrão para abrir os documentos PDF
            Process.Start(txtDestino.Text);
        }

Neste código verificamos se o arquivo de origem e de destino foram informados e usando os recursos de interoperabilidade criamos uma instãncia do aplicativo Word e abrimos o arquivo de origem; a seguir salvamos o arquivo com o formato DOC no arquivo de destino. Fechamos e encerramos o aplicativo Word.

Após avisar o usuário de que a conversão foi feita usamos o Process.Start() para abrir o documento de destino usando o aplicativo padrão definido para abrir documentos PDF.

Executando o projeto iremos obter o seguinte resultado :

Abrindo o arquivo PDF gerado no aplicativo padrão definido no sistema obtemos o resultado abaixo:

Pegue o projeto completo aqui:   Cshp_PDF_Texto.zip 

O anjo do Senhor acampa-se ao redor dos que o temem, e os livra.
Salmos 34:7

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