Ir para conteúdo
Fórum Script Brasil
  • 0

Como faço para salvar uma imagem em um arquivo RTF


leonardojung3

Pergunta

Olá, eu estou tentando editar um arquivo .RTF via vb.net sem ter que carregá-lo em um richtextbox, utilizo o arquivo salvo como modelo pra não precisar usar nenhum tipo de relatório, assim eu o abro toda vez, substituo as informações necessárias e salvo uma cópia.

Estou usando o seguinte:
Código (vb.net):
'Abrir
Dim fileReader As String
fileReader = My.Computer.FileSystem.ReadAllText(Application.StartupPath & "\modelo.rtf")
fileReader = fileReader.Replace("<nome_da_pessoa>", TextBox1.Text)
 
'Aqui, eu gostaria de substituir a string "<foto_pessoa>" por uma imagem
fileReader = fileReader.Replace("<foto_pessoa>", my.resources.imagem)

'Salvar
Dim StreamW As New IO.StreamWriter(SaveFileDialog1.FileName, True, System.Text.Encoding.Default)
StreamW.Write(fileReader)
StreamW.Close()

Eu gostaria de substituir a string "foto_pessoa" por uma imagem e salvar essa imagem no arquivo RTF, como posso fazer isso de uma maneira bem simplificada? O método Replace só substitui string por outra string?

Obrigado 
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

O que você quer não é tão trivial, pois consiste em transformar a imagem em uma sequência hexadecimal para ser armazenada no arquivo. Se você abrir um documento formatado em RTF no Bloco de Notas (ao invés do WordPad) verá que ele tem códigos que definem a formatação do texto (negrito, itálico, fonte, etc.), semelhante a um arquivo HTML (onde as tags definem isso). Fiz um código baseado neste exemplo (http://stackoverflow.com/questions/1490734/programatically-adding-images-to-rtf-document) e deu certo aqui:

Dim img As Bitmap = My.Resources.imagem
Dim memStream As New IO.MemoryStream()
img.Save(memStream, Imaging.ImageFormat.Png)
Dim bytes() As Byte = memStream.ToArray()
Dim sImg As String = BitConverter.ToString(bytes, 0).Replace("-", String.Empty)
Dim cImg As String = "{\pict\pngblip\picw" & img.Width.ToString() & "\pich" & img.Height.ToString() & "\picwgoa" & img.Width.ToString() & "\pichgoa" & img.Height.ToString() & "\hex " & sImg & "}"
fileReader = fileReader.Replace("<foto_pessoa>", cImg)

O código acima converte a imagem para PNG em um arquivo na memória (MemoryStream), depois pega os bytes que compõem a imagem e transforma em uma sequência hexadecimal. Além disso, tem também o código necessário para o formato RTF entender que trata-se de uma imagem.

Certo?

Abraços!

Editado por Graymalkin
Inserção do "img." antes do segundo Width e Height
Link para o comentário
Compartilhar em outros sites

  • 0

Muito bom, muito obrigado, funcionou certinho. Eu já estava montando todos os relatórios novamente utilizando reportview, mas isso me ajudou e poupou trabalho. Só mais uma coisa, eu dei uma olhada no código que você se baseou, tem algo sobre altura e largura da imagem. Isso está sendo um problema, porque no reportview ele deixa a imagem de um tamanho padrão, aqui não tem como deixar definido um tamanho padrão pra todas as imagens, mesmo que fique distorcida? pois coloquei uma imagem grande e ela ficou em quase toda folha kkkkkkk obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Sim, você pode fazer isso criando um novo bitmap com o tamanho desejado (primeira linha do código abaixo, criando um bitmap de 150x150px):

Dim img As Bitmap = New Bitmap(My.Resources.imagem, New Size(150, 150))
Dim memStream As New IO.MemoryStream()
img.Save(memStream, Imaging.ImageFormat.Png)
Dim bytes() As Byte = memStream.ToArray()
Dim sImg As String = BitConverter.ToString(bytes, 0).Replace("-", String.Empty)
Dim larg As Integer = 100
Dim alt As Integer = 100
Dim cImg As String = "{\pict\pngblip\picw" & img.Width.ToString() & "\pich" & img.Height.ToString() & "\picwgoa" & img.Width.ToString() & "\pichgoa" & img.Height.ToString() & "\hex " & sImg & "}"
fileReader = fileReader.Replace("<foto_pessoa>", cImg)

Repare também que corrigi a linha que cria o código RTF, porque tinha um Width e Height ali que não tinha reparado (que vinham da declaração da função, e agora são os mesmos da imagem).

Abraços!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...