locked
2 em 1 - Converter de Binario para .doc e realizar um replace em um campo. RRS feed

  • Pergunta

  •  

    Salve Salve amigos do msdn Brasil, estou com algumas dúvidas e se possível gostaria que me dessem uma força!!

     

    Vamos ao meu cenário: Eu tenho documentos salvos no banco (SQL), e em determinados momentos eu preciso recuperar um desses documentos, fazer uma alteração no valor de um campo chave(campo assinatura para ser mais preciso), e então exibir esse documento para o usuário imprimir. Depois de algumas horas no google eu montei uma versão que funciona porem ainda tem algumas questões que eu gostaria de resolver, sendo:

     

    1) Seria possível converter de byte[] para .doc?

    Quando eu recupero o documento do banco eu estou criando ele fisicamente do disco, o que eu acredito não ser muito interessante. O ideal seria se eu pudesse em tempo de execução converter o documento em byte[] para um objeto do tipo Microsoft.Office.Interop.Word.Document sem ter que criar esse documento fisicamente no disco assim como estou fazendo no código abaixo.

     

    2) Interação com determinado campo do documento. 

    De uma forma que acredito se meio POG (Programação Orientada a Gambiarra), eu crio uma instancia do arquivo que eu escrevi no disco e realizo um replace de um determinado campo chave por um valor cujo qual é a assinatura do cidadão que está imprimindo o documento. Porem quando eu realizo esse replace no documento eu passo a ter alguns caracteres em forma de pequenos quadrados exatamente no local do texto onde eu quebro a linha (\r\n). Seria como se o documento do word não identificasse os caracteres de quebras de linhas, porém as linhas são quebradas e ficam com a budega de um caracter em forma de dradro logo no inicio da linha.  

    Como posso resolver isso??

     

    Meu código:

     

    Code Snippet

    private void OpenAndRepleceDocument()

    {

    // Recupero o documento do banco de dados

    DocumentosBiz biz = new DocumentosBiz();

    DataSetDocumento.DocumentoDataTable dt = biz.GetDocumentoByID(47);

    byte[] documento = dt[0].Documento;

     

    // Local e nome do arquivo a ser criado a partir do byte[]

    string pathArquivo = @"C:\Documento.doc";

     

    // Crio o arquivo fisicamento no disco

    FileStream MyFileStream = new FileStream(@pathArquivo, FileMode.CreateNew);

    MyFileStream.Write(documento, 0, documento.Length);

    MyFileStream.Close();

     

    // Local e nome do arquivo

    object referenciaArquivo = (object)pathArquivo;

     

    // Objeto a ser usado nos parâmetros opcionais

    object missing = System.Reflection.Missing.Value;

     

    // Abre a aplicação (word), e faz uma cópia do documento que acaba de ser escrito no disco

    Word.Application oApp = new Word.Application();

    Word.Document oDoc = oApp.Documents.Add(ref referenciaArquivo, ref missing, ref missing, ref missing);

     

    // Crio os valores cujo quais preciso escrever ou realizar um replace no documento

    DateTime dataAssinatura = DateTime.Now;

    string nomeAssinante = "Pessoa Teste do Brasil";

    string codigoAutenticiade = "R84DW5H1A9";

    string enderecoValidacao = "www.site.com.br";

    string dadoAssinatura = @"Data e Hora: " + dataAssinatura.ToString("dd/MM/yyyy") + Environment.NewLine +

    "Assinado por: " + nomeAssinante + Environment.NewLine +

    "Código de autenticidade: " + codigoAutenticiade + Environment.NewLine +

    "A validade deste documento pode ser conferida em: " + enderecoValidacao;

     

    // Troca o conteúdo da determinada palavra existente no documento

    Word.Range oRng = oDoc.Range(ref missing, ref missing);

    object FindText = "assinatura_usuario"; // Palavra a ser substituída

    object ReplaceWith = dadoAssinatura; // Conteúdo que irá substituir a palavra chave

    object MatchWholeWord = true;

    object Forward = false;

    oRng.Find.Execute(ref FindText, ref missing, ref MatchWholeWord, ref missing, ref missing, ref missing, ref Forward, ref missing, ref missing, ref ReplaceWith, ref missing, ref missing, ref missing, ref missing, ref missing);

     

    // Abre o word para o usuário com o documento carregado

    oApp.Visible = true;

    }

     

     

    Agradeço pela atenção de todos!

    Grande abraço!

     

    segunda-feira, 15 de dezembro de 2008 14:00

Todas as Respostas

  • Oi Uiller,

    a não ser que trabalhe com o formato XML dos arquivos do Word (o que limitaria sua aplicação a trabalhar com Word 2003 e 2007), não vejo como abrir o binário no Word direto em memória, sem salvar no disco.

    Mas é possível fazer algo mais amigável: 
    1) Salvar o binário numa pasta temporária do disco.
    2) No código de Interop, em vez de fazer Open do arquivo salvo, fazer um New para abrir novo documento. Como parâmetro do New, você usa o documento salvo na Temp.

    Desta forma, o documento da Temp funcionará como template. O usuário terá na tela um "Documento1", totalmente preenchido, que ele imprime e salva se quiser. Você pode até apagar o Temp depois de ter aberto o novo documento.

    domingo, 21 de dezembro de 2008 13:09
    Moderador