Mundo Byte

Acercando el conocimiento de TI en términos sencillos

Abrir Word: Llamar a librerias dll desde Java

JAWIN

En Java, al ser un Lenguaje Multiplataforma, no es posible hacer uso del API de Windows directamente como pasa con Visual Basic y demás lenguajes Microsoft, sin embargo, muchas veces ya sea por necesidad o por necesad tenemos que hacer uso de alguna libreria dll desde una aplicación Java.

La solución que pasa por nuestra mente es JNI (Java Native Interface), con esto, tenemos todo el poder para crear y hacer uso de cualquier libreria como lo puede hacer Visual Basic, pero…. quienes ya manejaron JNI sabrán que esto no es algo tan trivial como programar un “hola mundo”. Existen diferentes herramientas que facilitan esta tarea al programador, a modo de no enfrentarse al “terrible” JNI para crear las librerias, una de estas herramientas que permite la interoperabilidad entre los objetos COM y Librerias dll  de Windows es Jawin.

 EJEMPLO

Primeramente, descargar jawin desde http://sourceforge.net/projects/jawinproject/

Una vez descomprimido, debemos copiar jawin.dll que se encuentra en la carpeta bin a WINDOWS/System32.

agrega_libreria Posteriormente agregamos en NetBeans la libreria jawin.jar ubicada en la carpeta de lib (ver figura adyacente).

Con esto ya estamos listos para poder escribir el código. En la carpeta demos podrán encontrar algunos ejemplos, entre ellos el llamar y abrir Microsoft Word usando el OLE32. A esto, solo le añadiremos algunas cosas extras.

Primero que abra word pasandole nosotros el texto que queremos visualizar. Luego, crear un documento de word con texto y guardarlo y por último abrir un documento existente y ejecutar una macro.

Declaramos dos constantes y le asignamos los valores correspondientes:
static final String DOC_TEXT = “HOLA MUNDO BYTE\r\n EJEMPLO CON JAWIN”;
static final String DOC_FILENAME = “ejemplo.doc”;

Ahora en la clase que hayamos creado, dentro del método main o algún otro método si lo prefieren, colocamos el siguiente código mostrado en la imágen:

jawin_open_word

Como puede deducirse fácilmente, si solo deseamos crear el documento pero NO guardarlo, basta con comentar la línea 43. La línea 44 es solo para cerrar Word inmediatamente después de guardar el documento.

Por último para mandar a llamar una macro, podemos sustituir el código anterior del bloque try por el siguiente:

Ole32.CoInitialize();
DispatchPtr app = new DispatchPtr(“Word.Application“);
app.put(“Visible”, true);
DispatchPtr docs = (DispatchPtr) app.get(“Documents”);
DispatchPtr doc = (DispatchPtr) docs.invoke(“Open”,”E:/transponder.doc“);
app.invoke(“Run”,”EdiciónIrA“);
Ole32.CoUninitialize();

donde “EdiciónIrA” es el nombre de la macro, en este caso es el nombre de un comando de word.

Al momento de ejecutar este programa, abrira el documento indicado y mostrará la ventana de Ir a…
Esto solo es un ejemplo de lo que se puede conseguir con jawin para interoperar con objetos COM y librerias dll propias de Windows, se puede interactuar con Excel, Power Point, etc y tambien se puede hacer uso de otras dll como la user32.dll

Cabe señalar que existen otras herramientas similares a jawin, por ejemplo JNative, JACOB, etc y otras especificas para trabajar con Office como por ejemplo POI de la fundación Apache, JExcelApi para trabajar sobre Excel, siendo todos open source.

Saludos!!

About these ads

33 Respuestas a “Abrir Word: Llamar a librerias dll desde Java

  1. Antonio Almeria marzo 4, 2008 en 5:07 pm

    Hola, estoy muy interesado en utilizar esta tecnica para interactuar con un documento word, pero no se que libreria hay que importar.
    Aqui tiene mi direccion por si quisiera responderme
    Muchas gracias y muy interesante el tema, saludos

  2. Windoctor marzo 4, 2008 en 8:33 pm

    Si lee detenidamente el tutorial, encontrará que ahi se explican los pasos a realizar, incluyendo la libreria a importar.

    saludos!!!

  3. Roberto marzo 22, 2008 en 5:14 pm

    Puede aplicarse esto a Oracle JDeveloper 10g.?

    Gracias.

  4. windoctor marzo 22, 2008 en 9:43 pm

    HOla:

    Claro que si, es solo un IDE. Solamente debe saber como agregar una libreria y agregar las que se indican en el tutorial y listo!

    saludos!!

  5. Roberto marzo 24, 2008 en 1:26 am

    Hola, existe un tutorial acerca de Jawin. Y si no, puede darme un ejemplo de modificación de marcadores de Word con Java.

    Gracias.

  6. windoctor marzo 24, 2008 en 5:38 am

    Lo que comenta esta fuera del alcance del tutorial. Desafortunadamente no conozco una página donde brinden un ejemplo similar al que pide.

    SIn embargo, tiene dos opciones:

    1.- Entrar a la página oficial de jawin y comprar la documentación
    2.- Pagarme por una asesoria

    inclusive una 3 opción es esperar algunos meses a que tenga tiempo disponible para que me decida a hacer un tutorial sobre el tema que pide.

    Reciba un cordial saludo!!

  7. halley mayo 31, 2008 en 8:00 am

    hola con esta ide es posible accesar a informacion del sistema operativo es decir poder sacar un reporte de la memoria ,el disco duro ,programaas instalados en un computador? es posible eso con java?

  8. windoctor mayo 31, 2008 en 6:32 pm

    No es posible con el api estandar de Java.

    No es por que sea un lenguaje pobre o malo, al contrario, es quizà de los más robustos en la actualidad. El problema para lo que menciona, radica en que Java es Multiplataforma, utilizando una Maquina Virtual que será la que interactuara entre el S.O y el código Java.

    Lo que usted requiere son cosas que dependen 100% del S.O y Java no esta atado a un OS en especifico, por ello no es posible acceder al api de windows, linux de forma directa.

    Pero tiene a su alcanse JNI (Java Native Interface) Una poderosa herramienta para poder crear sus librerias en lenguaje nativo del SO (C/C++) que puedan realizar esas tareas que usted requiere y posteriormente llamarlas desde Java, aunque esta no es una tarea relativamente fácil, requiere cierto conocimiento.

    Es posible que existan soluciones open source para realizar lo que usted requiera desde Java, lo desconozco.

    Pero para que no se lie mucho con estos temas, utilice .NET (C#) o algun otro lenguaje que tenga acceso al api de windows.

    saludos!!

  9. Carolina agosto 5, 2008 en 3:13 pm

    Hola,
    quería preguntar si con jawin o otra librería se puede simular los movimientos de un ratón, para evitar usar JNI.

    Gracias

  10. Leandro Delgado octubre 10, 2008 en 2:38 pm

    te hago unas consultitas…. como manejas el tema de las negritas, las fuentes y cosas asi?. otra cosa, deduzco que todo esto funciona teniendo el word instalado no?. o sea, no me sirve para generar el .doc sin tener el word. muy bueno tu articulo, muy bien explicado. la verdad, te felicito. un abrazo y muchas gracias

  11. Javier Ramirez octubre 30, 2008 en 4:05 pm

    Jawin funciona en windows vista?, no se porque pero hago exactamente lo mismo que hago en windows xp el cual me funciona muy bien pero en el vista no. Cual es el Problema?

  12. Javier Ramirez noviembre 1, 2008 en 5:44 pm

    OK, ya funciona en Vista Basico a lo mejor en el Ultimate no funciona pero lo voy a probar nuevamente.

  13. Anónimo enero 26, 2009 en 8:04 pm

    Intenté hacerlo sin resultado, sólo abre el word y no hace más nada. Quizá es porque la versión que uso del Word es 2007. ¿Tienes alguna idea? Literalmente hice Copy-Paste de lo que tienes y no funciona.

  14. Anónimo enero 26, 2009 en 8:07 pm

    Error del NetBeans, gracias, ya lo solucioné.

  15. Manolo febrero 20, 2009 en 12:11 pm

    Me gustaría saber si se puede utilizar esto para generar un applet que instale un PFX con CAPICOM

  16. Jou abril 17, 2009 en 4:53 pm

    invoke_I es para devolver enteros, invoke_S es para devolver cadenas, pero, ¿como funciona? Puedes poner un ejemplo? Gracias

  17. Pedro mayo 4, 2009 en 4:56 pm

    Tambien pueden utilizar la clase Desktop para abrir los archivos con su aplicacion por defecto.
    http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/desktop_api/

  18. jos agosto 10, 2009 en 4:37 pm

    estoy haciendo un web server en java y
    necesito usar la dll del interprete de php y no se como usarla si alguien me pudiera ayudar.

  19. Ray septiembre 1, 2009 en 8:36 pm

    que comandos uso para en vez de sobreescribir poder modificar o insertar valores?
    Saludos
    Ray

  20. descargar musica gratis febrero 10, 2010 en 3:16 pm

    Thanks for the tip, Keep up the great work.

  21. Amich junio 1, 2010 en 5:14 pm

    Colegas , tengo problemas en la interacción desde Jawin con una dll.
    el encabezado del método que estoy invocando es:
    unsigned char *CRC( unsigned char *StPrm, int StPrmLn, unsigned char *vCrc );

    Este método debe devolver 4 caracter hexadecimal; pero resultada que me devuelve otros resultados , dependiendo de como ponga la “string instruction ” del Jawin

    aqui les envío el código:
    public class SwSecureDll {

    public static void main(String[] args) throws Exception {
    FuncPtr msgBox = null;
    try {

    String msg = “Mensaje pasado a la DLL”;
    msgBox = new FuncPtr(“SWSECURE.DLL”, “CRC”);
    String res1 = new String();
    NakedByteStream nbs = new NakedByteStream();
    LittleEndianOutputStream leos = new LittleEndianOutputStream(nbs);

    leos.writeStringUnicode(msg);
    leos.writeInt(msg.length());
    leos.writeStringUnicode(res1);

    byte[] res = msgBox.invoke(“GIG:g:g”, 12, nbs.size(), nbs.getInternalBuffer(), null,ReturnFlags.CHECK_FALSE);

    // wrap result in a LittleEndianInputStream
    LittleEndianInputStream leis = new LittleEndianInputStream(new ByteArrayInputStream(res));

    // any [retval] values are placed first

    //int retVal= 0/*leis.readInt()*/;
    String retVal= leis.readStringUnicode();

    // and then follows any [out] values
    String outVal = leis.readStringUnicode();
    //String outVal = null /*leis.readStringUnicode()*/;

    System.out.println(“Se ejecuto sin problemas “+ retVal +” “+ outVal);

    …..
    }
    }

  22. juguito octubre 21, 2010 en 3:28 pm

    yo se que no tiene que ver con esto pero tengo un trabajo muy importante que entregar y necesito saber como hacer un bloc de notas en java que me permita hacer todo lo que hace un bloc real

  23. eduardo octubre 22, 2010 en 3:51 pm

    hola que talk buen dia estuve leyendo su tutorial y tengo problemas para compilar el codigo necesito hacer una aplicacion que se conecte a un dispositivi “lectora” este almacena registros pero el fabricante me da los dll para utilizar los metodos para acceder al dispositivo mi duda es como puedo importar las librerias dll a java para poder utlilizar sus metodos espero me puedan ayudar gracias de antemano saludos cordiales

  24. lalo octubre 26, 2010 en 2:21 pm

    hola que tal estuve trabajando con jawin y si me da aceso a librerias dll y muestra sus metodos pero solo las de windows alguien conoce como acceder a los metodos de librerias que me da mi fabricante es para acceder a lectoras de hjuella digital grax

  25. jairo del jobo marzo 31, 2011 en 7:14 am

    ola disculpa a donde boy a copiar el jawin.dll???

  26. Joel abril 28, 2011 en 4:09 pm

    Hola, buen post. Recientemente me encargaron un proyecto en el que se necesita manejar dll con java. Me surge la misma duda que a lalo, con jawin se puede acceder a dll de un fabricante en específico?
    Saludos, de antemano, gracias.

  27. victor octubre 10, 2011 en 4:09 pm

    Cómo podría introducir una imagen en el word ???

    Gracias

  28. Luis enero 11, 2012 en 11:52 pm

    Saludos, tengo un problema al ejecutar el código:

    ————————————————————————
    org.jawin.COMException: 800401f3: Cadena clase no válida

    at org.jawin.marshal.GenericStub.win32Invoke0(Native Method)
    at org.jawin.marshal.GenericStub.win32Invoke(GenericStub.java:152)
    at org.jawin.FuncPtr.invoke(FuncPtr.java:186)
    at org.jawin.FuncPtr.invoke(FuncPtr.java:205)
    at org.jawin.win32.Ole32.CLSIDFromProgID(Ole32.java:115)
    at org.jawin.win32.Ole32.GetFromProgID(Ole32.java:95)
    at org.jawin.COMPtr.(COMPtr.java:126)
    at org.jawin.DispatchPtr.(DispatchPtr.java:72)
    ———————————————————————————-
    en esta linea se ubica el error:

    DispatchPtr app = new DispatchPtr(“Word.Application”);

    ——————————————————————————

    espero que me ayuden gracias .

  29. Héctor Aristimuño febrero 22, 2013 en 7:34 pm

    Buenas tardes, disculpen necesito ayuda, siguí los pasas antes descritos en el ejemplo y al ejecutar el codigo me da la siguiente excepción

    Exception in thread “main” java.lang.UnsatisfiedLinkError: no jawin in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at org.jawin.Bootstrap.(Bootstrap.java:43)
    at org.jawin.FuncPtr.(FuncPtr.java:79)
    at org.jawin.win32.Ole32.(Ole32.java:44)
    at ejecutar_macro.Ejecutar_macro.main(Ejecutar_macro.java:27)
    Java Result: 1

  30. Ing. Juan Mancilla julio 9, 2014 en 4:22 pm

    Hola Buenas tardes, saben que aplique esta tecnica para abrir un documento de word pero cuando yo instalo el sistema en windows xp y mando desdel el programa abrir ese documento me sale el siguiente error: “word no pudo crear el archivo de trabajo. Compruebe la variable de entorno temporal”.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 205 seguidores

%d personas les gusta esto: