Jump to content

[VB] pegar una imagen de un PictureBox a un word


Recommended Posts

holas otra vez

 

bueno pense que tenia el programa terminado.. pero me agregaron una nueva opcion, les explico

 

tengo que buscar una foto en el computador.. para eso uso openFileDialog, una vez que se selecciona y pulsa aceptar esta se pega en un PictureBox.. hasta aqui todo bien.

 

el problema esta en que al momento de pasar esta imagen del picturebox a word no me resulta, ya que es diferente pasar un string a una imagen.

 

buscando me he encontrado que una forma de hacerlo es pasar la imagen del picturebox al portapapeles y despues recuperarla del portapapeles para pegarla en el word, la encuentro valida, pero el codigo que me indica el marcador de word donde debe ir es el que no encuentro.

 

por ejemplo, para pegar un string cualquiera en una parte de un word, primero en este se agrega un marcador, y por medio de VB se indica el marcador donde se va pegar el string. asi:

 

oDoc.Bookmarks.Item("observacion1").Range.Text = txtobservacion.Text

 

donde lo que esta entre comillas es el marcador y el que esta despues del sigo igual es el string a insertar.

 

pero con la imagen no resulta...

 

para pasar a portapapeles es asi:

Clipboard.SetDataObject(Me.picturebox.Image)

 

y para recuperarla asi:

Clipboard.GetDataObject()

 

la otra forma que encontre es pasar la imagen a un array de bytes, pero esta ultima forma no la entendi :S

 

 

¿ustedes saben de alguna forma para poder copiar una imagen desde vb a word? es lo unico que me falta y termino el programa u.u

 

les agradesco desde ya... :D

Link to comment
Share on other sites

:mmm: Creo que deberías aprovechar que la imagen la abres a través de OpenFileDialog, así te evitas tener que abrir el archivo, guardarlo en memoria e insertarlo en Word como lo has tratado de resolver hasta ahora. Entonces simplemente tendrías que usar el nombre completo del archivo que te devuelve OpenFileDialog y usarlo para insertar directamente la imagen (sin guardar el archivo en memoria).

Así que podrías intentar hacerlo así:

  oDoc.Selection.InlineShapes.AddPicture("C:\Windows\Web\Wallpaper\Windows\img0.jpg")

el código inserta una imagen en la posición actual del cursor. échale una mirada al método AddPicture.

También puedes probar sin Selection y/o poniendo los parámetros opcionales:

  oDoc.InlineShapes.AddPicture(FileName:="C:\Logotipo.png", LinkToFile:=False, SaveWithDocument:=True)

 

Sobre lo de intentar pegar la imagen a través del portapapeles, creo que podría tener un problema: ¿qué pasa si el usuario u otro programa copia algo al portapapeles mientras tú lo estás usando? no%20se.gif

Edited by susodicho
Link to comment
Share on other sites

si eso es lo que tengo hasta ahora, lo que me sucede es que tengo una carta por defecto que se debe modificar según la informacion que seleccione el usuario en el programa, para esto uso marcadores en el word. el programa lo que hace es tomar la informacion que el usuario desea y este reemplaza el marcador que corresponda.

 

en este caso la carta lleva una foto del signo de la empresa en la parte superior, y a esta foto le agrege un marcador, lo que necesito es reemplazar esta foto de la carta por medio del programa, el usuario seleccione una foto con openfiledialog, esta llevarla al comando addpicture y me reemplace el marcador de word (imagen por defecto que esta en la carta).

 

se que el codigo es el que me mostraste:

oDoc.InlineShapes.AddPicture(FileName:="C:Logotipo.png", LinkToFile:=False, SaveWithDocument:=True)

 

pero esto asi tal cual lo que hace es agregarme una nueva imagen, osea me quedan ambas imagenes en la carta, se que en esa linea va una cuarta opcion, que es Range y se que el bookmark es donde se indica el marcador para que reemplace. y eso es lo que no puedo hacer, porque mientras intento colocar la opcion del range, al ejecutarlo me dice que hay datos inconsistentes o que no es publico.

 

se que estas son las opciones que tiene el agregar la imagen:

 

oDoc.InlineShapes.AddPicture(FileName:=, LinkToFile:=, SaveWithDocument:=,Range:=)

 

pero no he podido completar esta linea con la sintaxis correcta u.u

Edited by Variator
Link to comment
Share on other sites

En esta página encontré este código:

using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;

namespace WordExample
{
   class WordExample
   {
       public WordExample()
       {
           WordApp = new Microsoft.Office.Interop.Word.Application();
       }

       private Word.Application WordApp;
       private object missing = System.Reflection.Missing.Value;
       private object yes = true;
       private object no = false;
       private Word.Document d;
       private object filename = @"C:\FullPathToFile\example.doc";

       public void UpdateDoc()
       {
           d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,
              ref missing, ref missing, ref  missing, ref  missing, ref  missing,
              ref  missing, ref missing, ref yes, ref  missing, ref  missing, ref  missing, ref  missing);
           List<word.range> ranges = new List<microsoft.office.interop.word.range>();
           foreach (Word.InlineShape s in d.InlineShapes)
           {
               if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture && s.Title == "LogoEmpresa")
               {
                   ranges.Add(s.Range);
                   s.Delete();
               }
           }
           foreach (Word.Range r in ranges)
           {
               r.InlineShapes.AddPicture(@"C:\PathToNewImage\Image.jpg", ref missing, ref missing, ref missing);
           }
           WordApp.Quit(ref yes, ref missing, ref missing);
       }
}
}

sí, está en C#, pero supongo que no deberías tener problemas para pasarlo a VB.NET ;) (yo no lo pasé a VB.NET porque no tengo instalado ni el Visual Studio ni el Office 2010 y no me manejo tanto en VB :tonto: ). Por si acaso, la interoperabilidad COM en C# no es tan cómoda como en VB.NET y hay que poner todos esos ref missing, pero en VB.NET simplemente los omites.

 

Otra cosa, yo le agregué la condición && s.Title == "LogoEmpresa", que se supone es lo que a ti te serviría. O sea, el código recorre la lista de todos los objetos incrustados en el documento (InlineShapes) y revisa si es una imagen (wdInlineShapePicture) y si tiene el marcador que buscas (en este caso, "LogoEmpresa"); si encuentra una coincidencia, la agrega a la lista ranges; después, en el segundo ciclo foreach, reemplaza todas las coincidencias que encontró en la búsqueda anterior con la imagen correspondiente (en este caso, "C:\PathToNewImage\Image.jpg").

 

Obviamente, tú reemplazas el título de la imagen por el que corresponda (yo le puse "LogoEmpresa") y eso vendría siendo el "marcador" de la imagen.

 

Porsiaca, la línea

  List<word.range> ranges = new List<microsoft.office.interop.word.range>();

en VB.NET creo que sería:

  Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range)

 


EDITADO:

 

Aquí dejo el código en VB.NET...obviamente no tengo idea si compila :nose:

Imports System.Collections.Generic
Imports Microsoft.Office.Interop.Word

'...etc...

   Dim ranges As New List(Of Microsoft.Office.Interop.Word.Range)
   For Each s As Microsoft.Office.Interop.Word.InlineShape In oDoc.InlineShapes
       If (s.Type = Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture) And (s.Title = "LogoEmpresa") Then
           ranges.Add(s.Range)
           s.Delete()
       End If
   Next
   For Each r As Microsoft.Office.Interop.Word.Range In ranges
       r.InlineShapes.AddPicture(FileName:=openFileDialog1.FileName, LinkToFile:=False, SaveWithDocument:=True)
   Next

 

NOTA: Lo que hace el código es reemplazar una o más imágenes que tengan un determinado título, o sea, el documento debe tener una imagen en la ubicación en donde tú quieres que vaya el logo de la empresa. Así que puedes poner alguna imagen "genérica" en el documento Word.

Edited by susodicho
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...