General, Java, Programación

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!!

33 comentarios en “Abrir Word: Llamar a librerias dll desde Java

  1. 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. 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!!

  3. 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!!

  4. 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?

  5. 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!!

  6. 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

  7. 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?

  8. 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.

  9. 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);

    …..
    }
    }

  10. 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

  11. 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

  12. 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

  13. 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.

  14. 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 .

  15. 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

  16. 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