miércoles, 5 de noviembre de 2008

Cantidad de Visitas al Articulo:

JTwain - Utilizando el scanner desde Java

Con motivo de una consulta, estuve probando y analizando librerías, algunas gratuitas y otras licenciadas, para el manejo de scanners en Java. Todas ofrecen características similares y permiten manejar un scanner bajo el standard TWAIN, claro que con algunas diferencias sustanciales, las cuales son relevantes en momento de seleccionar la correcta para nuestro proyecto.

Aquí expongo algunas experiencias de la librería seleccionada en mi caso y comparto información útil y ejemplos, para aquellos que necesiten desarrollar alguna aplicación basada en este tema. Además dejo referencias de otras librerías, y temas relacionados, como el reconocimiento de códigos de barras de las imágenes capturadas y OCR.

Librerías

Algunas librerías que puedo mencionar, son:

LibreríaDescripción
image mmscomputingEs una librería Open Source, que además del manejo de scanner para Windows, implementa Sane (manejo de scanner para Linux), fax, etc. Está disponible para Java y funciona perfectamente con JRE 1.4.2 o superior. Tiene un foro bastante completo y el coordinador (Michael Meiwald) responde muy rápidamente ante consultas. Sus respuestas son de gran ayuda. Además, existen ejemplos de uso de la librería muy completos y operativos, que ayudan mucho en el momento de armar nuestra solución.
imageJTwainEs licenciada, y permite el manejo del scanner, además de tratamiento de imágenes TIFF multipágina. El valor depende del modo de licenciamiento, dentro del rango de USD 198 a Euros.
imageMorenaEs el sucesor de JavaTwain. También cubre tanto Twain como Sane. Es una librería licenciada

Existen algunas mas, que no las probé, pero que cubren aproximadamente los mismos temas.

Trabajando con el standard

Todas las librerías permiten seleccionar el scanner con el que deseamos trabajar, así como el formato de imagen a capturar (JPG, TIFF, etc), calidad y tamaño de la misma.

En el caso de la librería que finalmente recomendé, mmscomputing, se debe implementar una interface en donde existe un método llamado negotiate, donde se realizan todos los ajustes de calidad de imagen, tamaño, y algunos otros, de acuerdo al standard TWAIN y las características soportadas de éste en el scanner seleccionado. Por ejemplo:

private void negotiate(ScannerIOMetadata metadata) {
ScannerDevice sd = metadata.getDevice();
try {
//Anulo pantalla de configuracion del scanner
sd.setShowUserInterface(false);
//Seteo que muestre barra progreso del scanner
sd.setShowProgressBar(true);
//Seteo area de escaneo
sd.setRegionOfInterest(TopLeft,TopRigth,Width,Heigth);
sd.setResolution(dDPI);
} catch (Exception e) {
addToLog("Error configurando scanner [" + e.getMessage() + "]",true);
metadata.setCancel(true);
}

if (metadata instanceof TwainIOMetadata) {
TwainSource source = null;
try {
source = ((TwainIOMetadata) metadata).getSource();
} catch (Exception ex) {
if (source!=null) source.setCancel(true);
}

try {
/* Habilito esto si deseo saber que está implementado del standard para
este scanner
TwainCapability[] cap = source.getCapabilities();
for (int h = 0; h < cap.length; h++) {
System.out.println(cap[h].getName());
}
*/

source.setShowProgressBar(true);
source.setCapability(TwainConstants.ICAP_UNITS, TwainConstants.TWUN_INCHES);

//Seteo colo de la imágen a capturar

if
(isColor) {
source.setCapability(TwainConstants.ICAP_PIXELTYPE, TwainConstants.TWPT_RGB);

} else if (isGrayScale) {
source.setCapability(TwainConstants.ICAP_PIXELTYPE, TwainConstants.TWPT_GRAY);
} else if (isBW) {
source.setCapability(TwainConstants.ICAP_PIXELTYPE, TwainConstants.TWPT_BW);
}
} catch (Exception e) {
if (source!=null) source.setCancel(true);
addToLog("Error configurando scanner [" + e.getMessage() + "]",true);
e.printStackTrace();
}
}

Formatos de Salida

Si la necesidad es escanear imágenes de una página, lo mejor es utilizar JPG, que guarda una buena relación entre tamaño y calidad (es una imagen comprimida con pérdida).

Si la necesidad es escanear imágenes multipágina, es necesario entonces usar TIFF.

Un problema que encontré, es que varias de ellas están generando archivos archivos .TIFF pero de la versión mas nueva (6.0) pero el visualizador de Windows, NO lo reconoce, porque por alguna razón nunca se actualizó a ese formato. Conclusión, si se desea visualizar la imagen generada en TIFF, ya sea multipágina o no, se debe usar otro software. Por ejemplo yo uso IrfanView, que es gratuito.

Por último, es bueno mencionar, que existen otras opciones de generación que no sean imágenes. Por ejemplo, una opción es PDF. Si usamos por ejemplo, una librería gratuita llamada iText, podemos generar documentos PDF multipáginas, con el agregado que en este caso podemos incluir imágenes de distintos tamaños, colores y calidades, contrario al caso de TIFF donde no es factible.

OCR y Códigos de Barras

Cuando lo que escaneamos es un formulario por ejemplo, que contiene uno o más códigos de barra, a veces es útil reconocerlos, y con el valor obtenido, hacer un control para nuestra aplicación. Para ello es necesario otras librerías como por ejemplo Aspose (es licenciada con un valor aproximado entre 390 y 1200 Euros, dependiendo del tipo de licenciamiento). Esta librería permite reconocer en una imagen JPG o TIFF un código de barras de diferentes tipos (CODE128, PDF417, etc).

El funcionamiento es muy sencillo, dado que existen primitivas para generar y reconocer códigos, así como también letras (OCR), con una buena calidad final.

Comentario Final

Son varias las opciones existentes, y se pueden combinar de muchas maneras, de tal forma que el proyecto en curso tenga final feliz.

So far, So good!

Imágenes by TinyPic

Cantidad de Visitas al Articulo:

87 comentarios:

Anónimo dijo...

Hola que tal muy interesante tu investigacion me ha servido mucho, no se si de favor pudieras facilitarme el codigo completo para hacer una prueba. De antemano muchas gracias.

Gustavo Suhit dijo...

Ramón, no tengo demasiado código "completo", pero te puedo recomendar que desde el sitio de http://www.mms-computing.co.uk/ descargues todos sus demos, donde están abarcados casi todas las problemáticas típicas en estos desarrollos. En realidad, de todos los links que aparecen en el artículo, fui bajando documentación, licencias temporales, y demos, y fui probando hasta encontrar un beun funcionamiento. Si cuando estés probando alguna de ésta librerías necesitas ayuda, por favor no dudes en contactarme (gsuhit@gmail.com) y vemos si puedo ayudarte. Saludos y gracias por tu feedback. De eso se trata, de hacernos la vida mas fácil a los informáticos :-)

Anónimo dijo...

Muy bien gustavo tienes razon. ya estuve probando y tengo un problemilla con el sd.setRegionOfInterest al mandar los parametros me manda un error de que estan fuera del rango no se si a ti te ocurrio ya probe con valores enteros y dobles.

Saludos y muchas gracias

Gustavo Suhit dijo...

Ramon, yo he usado enteros y no tuve problemas.
public int getTopLeft;
public int getTopRigth;
public int getWidth;
public int getHeigth;
y luego:
sd.setRegionOfInterest(getTopLeft,getTopRigth,getWidth,getHeigth);
En algún momento me dió error de fuera de rango pero era de otro parámetro de TWAIN. No recuerdo cual era, pero opté por comentar todo e ir descomentando de a uno hasta encontrarlo al error. Esto ocurre porque no todos las propiedades de TWAIN están implementadas en todos los scanners. Espero te ayude. Saludos,

Federico Ney dijo...

Hola Gustavo,

Soy algo nuevo en Java, se hacer cosas pero no conozco a fondo el funcionamiento de java.

Baje todos los proyectos de la pagina y esperaba encontrarme algunos jars para meterlos al proyecto, pero nada. Puedes darme una vision general de como funciona esto?

Gracias!

Gustavo Suhit dijo...

Germán,
Si bajaste el mmsc.jar desde mmscomputing, fíjate en la página desde donde la bajaste que están las instrucciones de instalación. Al ejecutar ese jar, se descomprime la info y se compila. Luego puedes incluir esas clases en tu proyecto. Lo bueno es que tienes el código fuente para revisar, debuguear, etc. Además, tienes allí las aplicaciones de ejemplo para probarlas y rescatar código para tu propia aplicación.

Otra opción bajarte ya los jar específicos de manejo de scanner como el uk.co.mmscomputing.device.twain.jaro el de imágenes: uk.co.mmscomputing.imageio.tiff.jar

Estos los incluyes en tu aplicación como librerias externas y los utilizas. Para sacar código de ejemplo puedes descomprimir el mmsc.jar con el RAR si no deseas ejecutarlo, y tienes los ejemplos.

Luego, es solo prueba y error. Pero en mi caso no tuve demasiado tiempo hasta que pude escanear sin problemas.

Espero te ayude, sino me preguntas mas.
Saludos,

Federico Ney dijo...

Muchas gracias gustavo, ya entendi mejor como funciona, en estos dias lo hago porque ya ya tuve que dividir mi tiempo. Pero te aviso como quedó :D

Saludos!!

Anónimo dijo...

Hola, me intereso tu investigacion, No soy experto en Java, tengo una duda.

Necesito mostrar imagenes de una escanner en una aplicacion Swing, para poder hacer uso es necesario tener los tres Jar que mencionas?

uk.co.mmscomputing.device.twain.jar

uk.co.mmscomputing.imageio.tiff.jar

mmsc.jar

Gustavo Suhit dijo...

Hola,
Depende, si deseas solo mopstrar una imágen, desd eya no es necesario. Pero si deseas manejar el escaner, adquirir la imágen y luego mostrarla, si.
POr otra parte, si la imágen es una sola página, lo mejor es usar JPEG, porque es el formato que tiene mejor XXX calidad/tamaño, ahora si deseas capturar documentos multipágina, necesitas usar TIFF o PDF. Ojo, si usas mms par aTIFF estarás generando TIFF de la última versión, las cuales no son soportadas por los visualizadores estandares de Windows.

Espero te ayude, sinome preguntas mas.
Saludos,

Anónimo dijo...

Hola Gustavo, en el articulo sobre ecaneo desde java en Informateando, haces referecia a una interface donde se encuentra el metodo negotiate(), esa interface es ScannerListener? necesito adquirir unas imagenes desde el escaner y guardarla como pdf, tenes algo hecho para guiarme? que jar's necesito?. Estuve viendo codigo de mmsc.jar pero me termine mareando.
Te agradezco de antemamo.

Saludos.
Carlos Muñoz.

Gustavo Suhit dijo...

Carlos,
Debes implementar la interface ScannerListener, y con eso tienes dos metodos para manejar:

Negotiate : Donde seteas todas las características del scanner, dpi, color, escala de grises o ByN, etc.

Y luego la que necesitas vos, para obtener la imagen que es algo del estilo:

public void update(Type type, ScannerIOMetadata metadata) {
try {
if (type.equals(ScannerIOMetadata.ACQUIRED)) {
BufferedImage image = metadata.getImage();

Luego deberías grabar esa imágen de tipo BufferedImage en disco.
Aquí debes ver si quieres escanear y generar una imagen multipágina o de a una página. Normalmente usas escaneos de 1 página en jpg, y luego generas las multipágina en TIFF o PDF.
En el ejemplo del applet que trae la librería, llamado imageviewer, puedes seguir bien ejemplos de estos temas.

Con respecto a los jar a utilizar (importar) yo he utilizado:
uk.co.mmscomputing.device.scanner.jar
uk.co.mmscomputing.device.twain.jar
uk.co.mmscomputing.imageio.tiff.jar

y para generacion de PDF, una librería gratuita llamada iText-2.1.3.jar.

Saludos, Gustavo

Anónimo dijo...

Hola Gustavo, muchas gracias por tu tiempo, ahora lo tengo mas claro.
Tengo otras dudas:
Si no esta instalado el software( no los drivers ) del escaner no podre obtener la imagen ?
Esta libreria reconoce cualquier tipo de escaner? de no ser asi donde puedo conseguir una lista de estos?

Disculpa la molestia, hace varios dias que estoy buscando una libreria open source como esta, pero hay poca documentacion lo que juega en contra y necesito terminar la aplicacion urgente.

Te cuento trate de hacer la consulta desde el blog pero no pude.

Saludos

Gustavo Suhit dijo...

Carlos,
Esto trabaja con el Standard TWAIN de conexión a los escáner. Ese Standard, justamente lo que te permite luego es interactuar con todos los escáner que lo implementen. Normalmente, cuando uno instala los drivers de un escáner, este pregunta si solo instala los nativos del escáner o también lo Twain. Esos Twain, deberías asegurarte que estén.



Si luego, cualquier escáner, implementa o dice que es compatible con TWAIN, podrás utilizarlo con esta librería. Lo único que puede pasar es que el estándar define varias operaciones, y según el escaner, puede que no tenga todas esas funciones implementadas, solo las más comunes. Pero normalmente las mas importantes y útiles están.

Saludos,Gustavo.

Anónimo dijo...

Hola Gustavo, espero estes bien, va la pregunta quiero que mi aplicacion tenga una opcion para escanear a color o en negro, sabes como se puede hacer eso??

Saludos.
Carlos.

Gustavo Suhit dijo...

Carlos,
En el metodo negotiate, debes setear esas características. POr ejemplo para el color:

if (isColor) {
source.setCapability(
TwainConstants.ICAP_PIXELTYPE,
TwainConstants.TWPT_RGB);
} else if (isBlackAndWhite) {
source.setCapability(
TwainConstants.ICAP_PIXELTYPE,
TwainConstants.TWPT_BW);
} else {
source.setCapability(
TwainConstants.ICAP_PIXELTYPE,
TwainConstants.TWPT_GRAY);
}

Luego, los DPI:

source.setCapability(
TwainConstants.ICAP_XRESOLUTION,
300);
source.setCapability(
TwainConstants.ICAP_YRESOLUTION,
300);

Y asi todas las capacidades definidas por el standard TWAIN que las puedes chequear en internet, y ver si tu escáner las implementa.

Saludos,

Anónimo dijo...

Hola Gustavo, ya resolvi los problemas que te dije en el anterior mail, pero me surgieron otros.

1) Como puedo hacer para que la ventana de progreso de escaneo este como modal?
2) Cuando quiero escanear una imagen con una resolucion de 400 ppp o mas sale este error y no se como manejarlo :

uk.co.mmscomputing.device.twain.TwainException: jtwain: EXCEPTION 0xC0000005 thrown in twain source or source manager.
This may have left the twain subsystem in an unstable state.
Please restart application or web-browser.
at uk.co.mmscomputing.device.twain.jtwain.ntransferImage(Native Method)
at uk.co.mmscomputing.device.twain.jtwain.transferNativeImage(jtwain.java:299)
at uk.co.mmscomputing.device.twain.TwainTransfer$NativeTransfer.finish(TwainTransfer.java:48)
at uk.co.mmscomputing.device.twain.TwainSource.transfer(TwainSource.java:315)
at uk.co.mmscomputing.device.twain.TwainSource.transferImage(TwainSource.java:354)
at uk.co.mmscomputing.device.twain.TwainSource.handleGetMessage(TwainSource.java:416)
at uk.co.mmscomputing.device.twain.jtwain.cbhandleGetMessage(jtwain.java:250)
at uk.co.mmscomputing.device.twain.jtwain.nstart(Native Method)
at uk.co.mmscomputing.device.twain.jtwain.access$200(jtwain.java:12)
at uk.co.mmscomputing.device.twain.jtwain$1.run(jtwain.java:338)

Saludos. Carlos Muñoz

Gustavo Suhit dijo...

Carlos,
En estas dos preguntas no te puedo ayudar. Debería ponerme a investigar el tema, y no tengo el tiempo ahora. Te recomiendo que te suscribas al foro de la librería de mmscomputing, donde casi siempre de un día para otro como máximo te responde Michel, el coordinador del grupo, y el seguramente te puede ayudar.
Saludos, Gustavo.

Alex dijo...

Hola amigos, estoy comenzando un proyecto que tiene que ver con el escaneo de una imagen usando directamente la aplicacion web, tal cuál como todos están trabajando, el problema que tengo es que hice la prueba del applet que esta en en la pag. mms computing, asi como también me descargue el archivo mmsc.jar, pero la aplicación lanza una excepción y no corre de ninguna de las 2 formas, el error que me da es el siguiente:
uk.co.mmscomputing.device.twain.TwainScanner.setException:
Failed during call to twain source.
cc=No Data Source
rc=1

Por favor si me pueden guiar sobre donde deben estar los archivos dll o que busca la aplicación para correr???

Gracias

Esteban dijo...

muy interesante la investigacion me interesa hacer una aplicacion en java con eclipse donde necesito escanear y mostrarla que debo hacer descargo solo el primer jar o cuales y si me puede orientar donde estan las clases que debo incluir en mi proyecto en que carpeta estan porque hay muchas o que interfases .....


saludos

Gustavo Suhit dijo...

Esteban, Yo particularmente he usado mmscomputing. Te aconsejo que descargues todo, lo instales como te indican en el site, y cualqueir duda en el foro, Michel, el administrador y autor de la libreria te responde a lo sumo de un dia para otro.
Con respecto a tu consulta de que jar incluir, dependerá del tipod e aplicación que desees hacer. Yo por ejemplo he hecho un applet, y use de base uno de los ejemplos que se entregan allí con código fuente, y lo adapte de acuerdo a mi necesidad.
Hay siempre algunas particularidades que debes ir resolviendo, pero te aconsejo descargarlo, comenzar con probar sus demos, y cuando te funcionen, puedes ver el uso de interfaces, métodos, etc. Y sobre la marcha, en todo caso, me vas preguntando, para ser mas puntual.
Saludos, Gustavo,

esteban dijo...

hola gracias por tu respuesta.

ejecute el jar que mmsc y me salio una pantalla de ejemplo osea un programa que ya implementa la libreria pero al darle acquire me sale un error "Failed during call to twain source"

cc=no data source


tengo que tener instalado el driver del escaner para que funcione quisiera que me guiaras.

por otro lado mi aplicacion consiste en almacenar en una base de datos My sql documentos de una base de datos fisica en Java obviamente. no es tan compleja solo necesito la clase que atrapa y guarda nada de resulucion eso se deja estandar.

saludos

Gustavo Suhit dijo...

Esteban, la respuesta es si, necesitas un driver de algún scaner que soporte el standard TWAIN para que funcione.
Con respecto a la app que debes hacer, no hay demasiados problemas. Solo considera el tema de tamaños, porque dependiendo del tema de resolución, tipo de formato de imagen, etc, varia demasiado el espacio necesario de almacenamiento. Además, si necesitas escanear documentos multipágina, debes usar o TIFF o bien pasarlo a PDF, de otra forma lo ideal es usar JPG para una sola página. Es la mejor opción en relación calidad/tamaño.
Saludos, Gustavo.

Esteban dijo...

hola

quiciera saber tu que clases utilizaste en tu app por lo que me ha dicho Michael son la carpeta Scanner y Twain creo que la clase mas importante es la de ScaneerListener ,pero las clases que estan adentro incluyen otras como util no se cuales son basicamente las que se deben incluir.....
y con respecto a los documentos yo creeria que solo son formato JPG para mostrarlo en una interfaz grafica java

saludos

esteban dijo...

hola ya puede hacer algo con el ejemplo que hay en el paquete pero pues quiero saber como es que se hace si puedieras explicarme este bloque de codigo que es el de el ejemplo en particular el de Update ....

public Prueba()throws ScannerIOException{
scanner=Scanner.getDevice();
scanner.addListener(this);
scanner.acquire();
}

public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){
if(type.equals(ScannerIOMetadata.ACQUIRED)){
BufferedImage image=metadata.getImage();
System.out.println("Have an image now!");
try{
ImageIO.write(image, "png", new File("mmsc_image.png"));
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
ScannerDevice device=metadata.getDevice();
try{
// device.setShowUserInterface(true);
// device.setShowProgressBar(true);
// device.setResolution(100);
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.STATECHANGE)){
System.err.println(metadata.getStateStr());
if(metadata.isFinished()){
System.exit(0);
}
}else if(type.equals(ScannerIOMetadata.EXCEPTION)){
metadata.getException().printStackTrace();
}
}

tengo otra pregunta siempre que se se quiere escanear se lanza el aplicativo del escaner siempre va ser asi hoy hay forma de que lo haga ocultamente ???

saludos

Gustavo Suhit dijo...

Esteban,
Cada vez que ejecutas el acquire(), entrara en el Update, y dependiendo dle estado que tenga en ese momento entrará en cada opcion que puedes ver. Con estado ScannerIOMetadata.ACQUIRED, es que ya tiene capturada (escaneada) una imagen, y ahi debes grabarla o mostrarla segun necesites en tu aplicacion.
Para sacar la ventana de dialogo del escanner si se puede hacer. Hay dos formas:
1) En Update: en el estado ScannerIOMetadata.NEGOTIATE, debes descomentar las lineas:
//No aparece ventana de dialogo del escaner
device.setShowUserInterface(true);
/Esto muestra u oculta (en false) la barra de progreso en el escaneo. Para guia te recomiendo dejarla visible.
device.setShowProgressBar(true);
//Setea calidad, pero tambien puedes hacerlo en el metodo negotiate
device.setResolution(100);

Para detalles del metodo negotiate, y setear diferentes calidades, dpi, etc, fijate en una respuesta anterior en este mismo articulo que detallo las constantes TWAIN a setear.
Saludos,Gustavo.

Anónimo dijo...

Hola Gustavo, perdona que te moleste, he leido en tu blog la entrada sobre JTwain y el escaner en Java y tengo una duda que no consigo solucionar de ninguna manera...
¿Utilizando la libreria mmscomputing es posible escanear algo sin mostrar al usuario la GUI del escaner?
Me explico mejor, quiero darle en el negociate los valores que sea (como explicas en tu blog) y que escanee directamente con esos valores. ¿Es posible con esta librería?
Desde ya muchas gracias, es de la poca información en castellano que he encontrado por la red.

D H M [icor7days@gmail.com]

Gustavo Suhit dijo...

DHM,
Efectivamente. A través de los métodos Negotiate y de Update, puede setear configuraciones, tales como si queires ver la GUI del escaner o no, la calidad, formato de impresión, color/escala de grises/BW, etc. Y en etc, entran todas las propiedades TWAIN que están soportadas por el escaner utilizado.
En el artículo, y diversos comentarios posteriores, hay algo de código que indica como hacerlo, y en el código de mms pueden encontrar mas ejemplos.
Saludos, Gustavo

Anónimo dijo...

Hola Gustavo, estoy teniendo problemas al darle valores a setRegionOfInterest().

Hice todas las pruebas con un escaner y probando con diferentes valores conseguí llegar a seleccionar las dimensiones de una hoja A4. El problema es que cuando ejecuto el programa con otro escaner diferente no me coge el área del A4, sino bastante menos (como un cuarto del A4).
Si subo los valores al usar el segundo escaner me sube el área de escaneo, pero entonces no funciona el primer escaner y necesito que sea genérico.
¿Que valores debería colocar aquí para que el escaneo sea siempre de una hoja A4?

Gracias de antemano Gustavo.

PS: A esta librería le falta un buen manual de uso... sin él es muy dificil manejarte con ella, además de que pierdes mucho tiempo en pruebas, ya que es la única manera de enterarte de como funciona

Gustavo Suhit dijo...

Hola NN,
Yo he usado setRegionOfInterest sin problemas, con valores enteros (left,top,ancho,alto). Solo se me ocurre que consideres el seteo del tamaño de tipo de hoja entre los seteos en Update o Negotiate, pero la idea del setRegionOfInterest es justamente independizarse del tamaño de hoja.
Con respecto a la documentación, hay que considerar que es código totalmente libre y gratuito, que funciona ok, por lo que es un gasto menor el de prueba y error, si uno lo compara con hacer todo desde cero, estás de acuerdo?
Abrazo, Gustavo.
PD: che, firma con un apodo al menos cuando pongas un comentario, sino le escribo al aire parece :-)

GarZa dijo...

Hola Gustavo, gracias por la info, después de varios días buscando encontré tu blog y vi la luz. Tengo una duda, he probado TwainExample con Debian, y funciona, ¿como es posible si Linux utiliza SANE?

Un Saludo y gracias.

Gustavo Suhit dijo...

Efectivamente GarZa, utiliza SANE. No he probado en Linux, por lo que no tengo mayores antecedentes. Lo único que se me ocurre es que para la demo esté empaquetada la versión para ambas plataformas, y dependiendo del ambiente ejecute una u otra. La verdad estoy elucubrando sobre la marcha, porque no se siquiera si es factible esto que estoy planteando.
Saludos, Gustavo.

Anónimo dijo...

estimado amigo.
Estoy intentando realizar un sistema en web. Este debe capturar del scaner documentos para guardarlos o almacenarlos fisicamente.
TEngo una interfaz donde llenan los campos de datos de interes y ademas deben de un solo click capturar la pagina (o varias) y previsualizarlas, luego al Presionar en GUardar deben almacenarse los datos en una Base de Datos y la imagen en un directorio especifico.

TRabajo con PHP, mysql, poco de java y tomcat.

Quisiera saber si puedes ayudarme, o es que ya pasaste por alguna situacion similar.
Se que JTwain es recomendable en este caso pero nose como utlizarlo.

Espero tu respuesta, y me despido con las consideraciones mas distinguidas.
Jose Luis Aranibar Araviri

Gustavo Suhit dijo...

Jose Luis,
En la librería mmscomputing, existe un applet de ejemplo, con código fuente como toda la librería que hace eso. Fíjate en ese ejemplo y adáptalo a tus necesidades, pero lo que describes está hecho. Quizá debas cambiar interface gráfica y alguna que otra cosa de configuración , mas darle permisos a la maquina virtual de Java para que acceda a las librerías necesarias. Si lees el articulo, ademas de todos los comentarios, se fueron desarrollando varios temas que quizá te ayuden a resolver tu problemas.
Definitivamente debes desarrollarlo en Java, un applet si es que debes incrustarlo en una página web.
Saludos, Gustavo.

everyonestares dijo...

Hola Gustavo,

he estado leyéndome detenidamente el post y sus comentarios y mi código es similar a todo lo que he leído. El caso es que cuando se ejecuta mi "update" nunca llega a superar la condición

"if (metadata instanceof TwainIOMetadata)"

He buceado por el foro de mmscomputing a ver si encontraba un javadoc o algo parecido para obtener más información acerca de la clase ScannerIOMetadata para averiguar por qué mi objeto "metadata" nunca es una instancia de TwainIOMetadata.

Has llegado a encontrar algo de información al respecto? (javadoc o algo similar) Creo que en realidad mi problema se debe a que he olvidado configurar de mi scanner (he probado Epson Stylus CX3650 y con un HP OfficeJet One L7590) pero no está demás tener esa info.

gracias y un saludo!

Gustavo Suhit dijo...

Hola everyonestares,
No he encontrado demasiada documentación adicional. De todas formas, debes asegurarte que cuando instalas los drivers de tu/s escaner/s, instale tambien los drivers TWAIN, porque a veces solo instalan los específicos del escaner, y no funcionará asi la librería que solo recnoce los que son compatibles con TWAIN.
Además, te recomiendo entrar el foro de mmscomputing, donde el moderador Michel, responde a lo sumo en 24hs, y es de mucha ayuda.
Saludos, Gustavo

Unknown dijo...

Saludos no se si ya sera muy tarde para pedir ayuda por aqui, pero aqui va mi pregunta.

Estoy probando el ejemplo de escanear

este es mi codigo

import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

import uk.co.mmscomputing.device.scanner.Scanner;
import uk.co.mmscomputing.device.scanner.ScannerDevice;
import uk.co.mmscomputing.device.scanner.ScannerListener;
import uk.co.mmscomputing.device.scanner.ScannerIOMetadata;
import uk.co.mmscomputing.device.scanner.ScannerIOException;

import uk.co.mmscomputing.device.sane.*;

public class SaneExample implements ScannerListener{

static SaneExample app;

Scanner scanner;
int index=0;

public SaneExample(String[] argv){
scanner=Scanner.getDevice();
scanner.addListener(this);
try{
//scanner.select();
// scanner.select("WIA-Benq S2W 4300U/3300U");
// String algo[]=scanner.getDeviceNames();
// System.out.println("Device Name: "+scanner.getSelectedDeviceName()+" escaner: ");
scanner.acquire();
}catch(ScannerIOException se){
se.printStackTrace();
}
}

public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata){
if(type.equals(ScannerIOMetadata.ACQUIRED)){
System.out.println("estado escaneado");
BufferedImage image=metadata.getImage();
System.out.println("Have image "+index+" now! ");
try{
ImageIO.write(image, "jpeg", new File("mmsc_image"+(index++)+".jpeg"));
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.STATECHANGE)){
System.out.println("estado de cambio");
System.err.println(metadata.getStateStr());
if(metadata.isFinished()){
// System.exit(0);
}
}else if(type.equals(ScannerIOMetadata.NEGOTIATE)){
System.out.println("estado de negociando");
SaneDevice device=(SaneDevice)metadata.getDevice();

// device.setADFMode(true);
try{
device.setShowUserInterface(true); // default: true
device.setShowProgressBar(true); // default: true
// device.setResolution(75);
// device.setOption("mode","Color");

// device.setOption("source","Flatbed");
// System.out.println(device.getOption("source"));
// System.out.println(device.getOption("source").getStringValue());
// device.setOption("source","ADF Duplex");
}catch(Exception e){
e.printStackTrace();
}
}else if(type.equals(ScannerIOMetadata.EXCEPTION)){
System.out.println("dio un errror");
metadata.getException().printStackTrace();
}
}

public static void main(String[] argv){
try{
app=new SaneExample(argv);
}catch(Exception e){
e.printStackTrace();
}
}
}

le e mobido varias cosas a ver si puedo hacer q funcione pero nada siempre sale este error

JarLib.load: Successfully loaded library [jar:file:/C:/Users/Daniel/Desktop/escaner_mio/librerias/uk.co.mmscomputing.device.twain.jar!/uk/co/mmscomputing/device/twain/win32/jtwain.dll] from jar file location
uk.co.mmscomputing.device.twain.TwainSourceManager.:
Twain 2.0 compatible : true
estado de cambio
Source Manager Open

apreciaria cualquier ayuda muchas gracias!

Gustavo Suhit dijo...

Daniel, priemro, por que "no se si ya sera muy tarde para pedir ayuda"?? Que hay algo que no sepa? Me clausuran?? :-)
Hablando en serio, y epserando ayudarte.
En el mensaje que transcribes, no aparece ningun error, De hecho dice "JarLib.load: Successfully loaded library", lo que indica que levanto bien. Necesitaría mas info para poder ayudarte.
Algunas tips que te pueden ayudar: 1) Verifica los permisos de las librerías en las máquinas virtuales java, para que no tengas problemas de permisos.
2) Habilita (si es que no lo has hecho) el debug de la máquina virtual, para ver si allí se visualiza algún error.
3) Verifica que el .jar que tengas tiene empaquetado toda las librerias necesarias. Me ha pasado de tener que incluir (en windows) algunas cosas adicionales en mi paquete jar, para que funcionara.

Por otra parte te aconsejo que pidas soporte a Michael del foto de mmscomputing, porque de un dia para otro normalemtne responde y es muy claro y concreto, porque es "el padre de la criatura".

Espero haber ayudado, y me preguntas, al menos mientras "no me clausiren!!" Ja
Saludos,

Unknown dijo...

jaja no lo que pasa es que creí que el foro ya estaba cerrado.

sera que me puedes hacer el favor de mandar un ejemplo ya echo si lo tienes.
mi correo es daniel_sk10@hotmail.com

E intentado acomodar ese codigo para que funcione y no e podido.

descargue el imageviewer.jar, vi el codigo y lo intente pasar casi igual y me da error al compilarlo y agregue las misma librerias con el que venia, al yo ejecutar el .jar si funciona perfectamente pero no funciona con el codigo mio.

en el codigo que te mostre el problema es que me sale la ventana para yo seleccionar el escaner pero se cierra de una ves y no me muestra ni los escaner que tengo.

Muchas gracias por la respuesta

Anónimo dijo...

Hola disculpa, he leido tu artículo sobre el uso de mms-computing, mira espero me puedas ayudar, solo necesito saber que archivo jar utilizaste para colocar en tu proyecto, porque cuando yo baje el archivo mmsc.jar me genero muchas carpetas pero ningun solo jar ya que me va diciendo que hay muchos errores, podrías orientarme acerca de esto?, solo necesito saber que necesito para comenzar a trabajar, te agradezco de antemano y te envio muchos saludos.

Cristian del Jesús Queb Miss

Gustavo Suhit dijo...

Cristian,
Los .jar que he incluido segun mi necesidad fueron:

uk.co.mmscomputing.device.scanner.jar

uk.co.mmscomputing.device.twain.jar

uk.co.mmscomputing.imageio.tiff.jar

Ademas, dado queme daba un error, tuve que incluir unos class en mi .jar, en el directorio: uk\co\mmscomputing\image\operators. Esos los obtienes de la distribución original y los incluyes en tu jar cuando te lo pide.
Espero te ayude,
Saludos,

Unknown dijo...

Gracias por la ayuda estoy en la implementación de una aplicación que utilice un Escaner [en español] para capturar una imagen(para que mas dah!), mostrarsela al usuario para que le haga cambios como reducirle el tamaño y luego guardarla en una DB[tema aparte]...

Pero me muestra este error.
Twain 2.0 compatible : false

que alguien me explique!? ;D que es esto, y como puedo lograr mi objetivo.

Gustavo Suhit dijo...

Edwin, a simple vista puede ser que no tengas instalados los drivers TWAIN de tu escaner, o bien no son compatibles con la versin 2.0.

espero ayude,
Saludos,

Alfonso Meneses dijo...

Hola gustavo, muy interesante tu articulo y es justo lo que estoy necesitando para una aplicación que necesito realizar... ahora tengo un problemita y es que me voy al link de la pagina http://www.mms-computing.co.uk/ me sale en blanco y me dice q me tengo q loguear y no he podido conseguir descargar estos .jar.... como podria hacer para descargarlos pq no los encuentro en ningun lado... gracias de antemano

Gustavo Suhit dijo...

Uchiha,
Hace unos dias publique un segundo articulo con un link a las librerías, porque varios me pidieron lo mismo. Está en : http://gsuhit.blogspot.com/2010/08/jtwain-utilizando-el-scanner-desde-java.html. Alli hay un link a las librerías.

Saludos,

Alfonso Meneses dijo...

Hola Gustavo, gracias por la pronta respuesta. ya descargue el jar y me pondre a hacer pruebas sencillas a ver que tal ,me va si algo vuelvo y te molesto jeje...
Saludos

Unknown dijo...

Que tal Gustavo he empezado a utilizar las librerias de mmscomputing ya logre correr el ejemplo MainApp.java sin embargo me tira error, el error dice que no se pudo crear una instancia en el hilo principal

Eduardo dijo...

Buenos días,

He probado el ejemplo llamado 'imageviewer' y me ha funcionado perfectamente en un equipo de 32 bits. Sin embargo, cuando lo he probado en uno de 64 bits, no me ha funcionado. Concretamente, me ha devuelto el siguiente error:

java.lang.UnsatisfiedLinkError: C:\Windows\System32\jtwain.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

¿Alguien lo ha probado en un equipo de 32 bits? ¿Existe alguna versión de jtwain.dll para 64 bits? ¿Donde puedo obtenerla?

Muchísimas gracias,

Eduardo

Gustavo Suhit dijo...

Eduardo, nunca probe estas librerías en x64. No te podría ayudar. No recuerdo de haber leído acerca de x64 tampoco. Pero eso no significa que no funcione. Para eso podrías usar los fuentes y adaptarlos.
Saludos, Gustavo.

Unknown dijo...

Hola Gustavo,

Gracias por esta entrada me ha ayudado bastante.

Estoy realizando algunos ejemplos pero en todos tengo el mismo error:
Could not load libsane.so.
Error: libsane.so: cannot open shared object file: No such file or directory

JarLib.load
Error = java.lang.UnsatisfiedLinkError: unsupported JNI version 0xFFFFFFFF required by /home/user/mmsc/uk/co/mmscomputing/device/sane/lin32/libjsane.so
java.lang.UnsatisfiedLinkError: unsupported JNI version 0xFFFFFFFF required by /home/user/mmsc/uk/co/mmscomputing/device/sane/lin32/libjsane.so

En realidad no se si falta esa librería o la tengo que añadir a alguna variable de entorno.

¿Alguna vez le ocurrió, sabría la solución?

Saludos!!
Javier H.

Unknown dijo...

Hola de nuevo,

Tenía instalada esta librería--> libsane y he instalado estas otras y ahora me funcionan los ejemplos-->
libsane-dbg
libsane-dev
libsane-extras
libsane-extras-dev
libgnomescan
libgnomescan-common

Ya puede usar el scanner!

Saludos!
Javier

Unknown dijo...

Hola, necesitaria saber a que se debe la excepcion "uk.co.mmscomputing.device.twain.TwainScanner.signalException Selected twain source is not online" mostrada en un popup por el Applet en win x64 y como podria solucionarlo. esto ocurre cundo selecciono Microsoft LifeCam VX-6000 1.0 (32-32). Muchisimas gracias

Unknown dijo...

Hola, en el articulo comentaste que hay otras librerias como mms-computing podrias decir alguna que sea freeware.
gracias mil.

Gustavo Suhit dijo...

Pepe, no he trabajado con x64, solo con x86. No te sabría decir porque es el error. Quiza sea un tema de plataforma, quiza del mismo scanner. La verdad no lo se.
Con respecto a otras librerías, no conozco otra freeware. Las demás que conozco son pagas. De todas formas, dependiendo del tipo de desarrollo, pueden ser relativamente baratas, y logras soporte de la empresa.
Saludos, Gustavo.

Unknown dijo...

Hola Gustavo, gracias por tu pronta respuesta, en otro comentario tu le respondias a otro persona que te preguntaba algo similar, "Que se podrian usar los fuentes y adaptarlos a x64".De que manera podria hacer esto? Compiando todo con java 64 bits en windows 7 por ejemplo?
Muchas gracias.

Gustavo Suhit dijo...

Pepe, asi es. En http://gsuhit.blogspot.com/2010/08/jtwain-utilizando-el-scanner-desde-java.html puedes encotnrar los fuentes uqe mmscomputing publicaba en algun momento. Si lo logras, avisanos para saberlo. Suerte.
Saludos,

Unknown dijo...

Hola Gustavo te comento que en win32 bits la aplicacion imageviewer(como no tengo scanner lo estoy probando con una webcam que soporta Twain) cuando presiono el button "select" me da la opción WIA-Microsoft LifeCam al seleccionar esta la aplicación funciona correctamente o sea muestra la imagen permite guardarla etc. El problema es en win7 x64 ya que al presionar el button select esta opcion no aparece.He probado en compilar todo nuevamente con JDK 64 bits en una pc con win 7 x64 y no hay caso si podes orientarme , no he podido encontrar el foro de Michael Meiwald ,te agradeceria cualquier ayuda ,desde ya mil gracias.

Alfonso Meneses dijo...

Hola gustavo, muy bueno todo.. una pregunta a ver si me puedes ayudar, como hago para probar la libreria sin tener un dispositivo d captura d imagenes instalados, hay algun emulador o algo q se pueda usar?...
gracias

Unknown dijo...

Respondiendole a Itachi, yo trabaje con un escaner virtual se llama XPCTWAIN y lo podes descargar aqui

Alfonso Meneses dijo...

Gracias por el dato Rudy , probare...
gracias

Anónimo dijo...

Hola, estoy a punto de iniciar un proyecto basándome en esta librería, y me he pasado antes por la web por si había nuevas versiones, y parece que ahora es otra cosa, ya que pide usuario y contraseña, ¿sabéis algo sobre mms-computing? ¿Ha desaparecido? ¿sigue siendo open source?

Un Saludo.

Gustavo Suhit dijo...

Anónimo, la verdad no se nada. Me fijaré si tengo aun algun mail de Michel quien era el autor y moderador del antiguo foro. Pero creo que no, porque siempre me comuniqué con el en el foro del site. Una lástima. Quizá estén en proceso de licenciarla.
Si te enteras de algo, por favor compártelo.

Abrazo,

Anónimo dijo...

Hola Gustavo soy nuevo en java, necesito mostrar en una aplicacion swing una imagen desde un escaner, he revisado mmsc.jar, pero tiene varias carpetas y no se cual utilizar para lo que necesito, que me recomiendas.

Anónimo dijo...

hola Gustavo muy bueno tu articulo, mira necesito hacer una aplicacion swing que obtenga imagenes multipagina del escaner, las muestre al usuario, permita que este las modifique y luego guardarla en una BD, he revisado mmsc.jar pero tiene unas cuantas carpetas y no se cuales serian utiles en mi caso, debido a que no tengo mucha experiencia en java. Me seria de mucha ayuda si me dieras alguna idea.
Saludos.

Gustavo Suhit dijo...

Anónimo, Revisa los comentraios de este artículo y de este otro (http://gsuhit.blogspot.com/2010/08/jtwain-utilizando-el-scanner-desde-java.html). En ellos hay información de que .jar necesitarías desde el punto de vista escaner. Luego dependerá del tipod e aplicación, base de datos, etc. para saber que incluir. En mmsc, solo tendrás acceso a lo referente al escaner. Hay ejemplos en el paquete que te pueden ayudar.
Saludos, Gustavo.

Unknown dijo...

Hola Anónimo,

mira estos son los datos de contacto de Michael Meiwald

Email: mm@mms-computing.co.uk
Telephone: 0044 1507 609472
Fax: 0044 1507 609553

Saludos

Anónimo dijo...

Hola Gustavo mira estoy usando esta libreria para obtener imagenes desde un escaner el caso es que las obtengo individuales y las guardo en un directorio temporal pero necesito luego convertirlas a documentos multipágina (TFF), pero no se como hacer esta operacion.
Apreciaria mucho cualquier idea.
Saludos.

Unknown dijo...

Hola,
mira aquí hay algo de código que añadí, puede que te valga

http://gsuhit.blogspot.com/2010/08/jtwain-utilizando-el-scanner-desde-java.html

Saludos

ceamha dijo...

Hola Gustavo,

Por lo que he podido leer, parece que tú y varios de tus lectores han podido hacer un escaneo desde Java. He seguido algunos de tus ejemplos y recomendaciones y en realidad, ya no sé qué paso seguir.

He importado el .jar, ya no genera errores de sintaxis. El problema ahora es cuando lo voy a ejecutar, estos son los errores que me aparecen:


JarLib.load: Successfully loaded library [jar:file:/C:/Documents%20and%20Settings/Administrador/Mis%20documentos/My%20Dropbox/Andres/Escaner/pruebaTwain/lib/mmsc.jar!/uk/co/mmscomputing/device/twain/win32/jtwain.dll] from jar file location
uk.co.mmscomputing.device.twain.TwainIOException: uk.co.mmscomputing.device.twain.TwainScanner.setException:
Failed during call to twain source.
cc=No Data Source
rc=1
at uk.co.mmscomputing.device.twain.TwainScanner.signalException(TwainScanner.java:131)
at uk.co.mmscomputing.device.twain.jtwain.signalException(jtwain.java:289)
at uk.co.mmscomputing.device.twain.jtwain.cbexecute(jtwain.java:245)
at uk.co.mmscomputing.device.twain.jtwain.nstart(Native Method)
at uk.co.mmscomputing.device.twain.jtwain.access$300(jtwain.java:12)
at uk.co.mmscomputing.device.twain.jtwain$1.run(jtwain.java:343)
uk.co.mmscomputing.device.twain.TwainFailureException: Failed during call to twain source.
cc=No Data Source
rc=1
at uk.co.mmscomputing.device.twain.TwainSourceManager.call(TwainSourceManager.java:31)
at uk.co.mmscomputing.device.twain.TwainIdentity.open(TwainIdentity.java:71)
at uk.co.mmscomputing.device.twain.TwainSource.open(TwainSource.java:106)
at uk.co.mmscomputing.device.twain.TwainSourceManager.openSource(TwainSourceManager.java:97)
at uk.co.mmscomputing.device.twain.jtwain.cbexecute(jtwain.java:236)
at uk.co.mmscomputing.device.twain.jtwain.nstart(Native Method)
at uk.co.mmscomputing.device.twain.jtwain.access$300(jtwain.java:12)
at uk.co.mmscomputing.device.twain.jtwain$1.run(jtwain.java:343)


¿Me podrías indicar qué debo hacer al respecto?

Gracias por la atención.

Gustavo Suhit dijo...

ceamha:
Parece ser un tema de permisos en la máquina virtual. Para eso busca como dar permisos en java.policy del estilo:
permission java.util.PropertyPermission "java.version", "read";
Fijate en ealgunso articulos anteriores de java que explico eso, o en los comentarios de este debe haber algo de que habilitar.
Saludos,

Anónimo dijo...

Hola Gustavo estoy utilizando esta libreria y quisiera saber si tu has logrado leer con ella pdf que no son creados por la misma. Ella crea pdf con una version muy atrazada y me da error cuando trato de leer un pdf que no fue generado con esta libreria.
Saludos.

Unknown dijo...

Hola a todos, estoy utilizando un escaner hp scanject 2700, este escaner tiene la capacidad de leer las 2 caras a la vez, mi pregunta ¿Que variables tengo que configurar para que pueda leer las 2 caras de una hoja, ya que solo lee 1?

demed dijo...

Que tal Gustavo, la descarga del mmsc.jar en easy-share fue eliminada, la puedes poner disponible otra vez? O alguién sabe de otra ruta donde esté disponible?

Cristian dijo...

Me sumo al pedido de Demed, hace un tiempo estuve haciendo pruebas con estas apis pero la he perdido y ahora no logro encontrarla por la web.
Si alguno de los que trabajaron con ella la pudiera colgar en algún lugar se lo agradecería. Si llegan a tener las fuentes completas seria un golazo,

Saludos

Gustavo Suhit dijo...

Gente, ca nuevo link de descarga.
http://www.easy-share.com/1914993850/mmsc.rar

Saludos,

David Martos dijo...

Alguien probo de hacer un scan con un alimentador externo? y que haga multiples scan (cada scan una imagen)? (Utilizando el xfercount, feeder, ..) ??

Jose Carlos dijo...

Hola Gustavo, que tal?

Primero darte las gracias por tu articulo y segundo pedirte ayuda.

Veras necesito incorporar a un proyecto un applet que me escanee documentos desde la web... y por lo que he leido está solucionado gracias a tu publicación. Me he descargado los ficheros que colgastes y he estado probando los ejemplos, pero me he encontrado que como ya está cerrada las web de mms.computing... los ficheros jnlp que me rediriguen a los .jar, pues no funciona... sabrias donde puedo obtenerlos... me los podrias enviar... el primero que me ha fallado es uk.co.mmscomputing.device.twain.applet.jar , pero faltarán muchs mas...

Ojala puedas ayudarme, recibe un cordial saludo de Jose Carlos... mi email es jc74jc@gmail.com

Y gracias por todo

gastonjp dijo...

fijate si te sirve esto http://www.megaupload.com/?d=14RWUTBB

Miguel dijo...

Hola Gustavo. Estoy utilizando la librería que has colocado (mmscomputing) para digitalizar y me ha funcionado muy bien. Tengo una duda: ¿Es posible levantar la ventana de configuracion de scanner desde esta libreria? Es la ventana que tipicamente se abre al dar clic derecho al icono de scanner y luego "Configurar", ¿es posible y como? ¡Gracias por tu ayuda!

Gustavo Bijzitter dijo...

Hola Gustavo:

Como vengo leyendo los mensajes, el sitio esta cerrado y donde dejaste las librerias no se puede bajar.

te puedo dejar mi mail, si no es molestia para que me las envies ??

elgatosurfeador@gmail.com

saludos

Gustavo

Anónimo dijo...

Cordial Saludo, Los link no funcional, me encantaria que me ayudaran inviandome las librerias... estoy urgido de esto...

Mil gracias

Eryth Llorente
eagle12co@hotmail.com

Unknown dijo...

Y esto me servira para corregir una tarjeta de respuestas en un examen de admision a alguna universidad?
Como funcionaría eso?

De antemano. Muchas gracias.

Gustavo Suhit dijo...

Si podría. debes tener un reconocedor de caracteres.
Saludos

Unknown dijo...

Hola GUSTAVO SUHIT!
Estoy trabajando con JTwain en Java con un trial de LAB ASPRISE(http://asprise.com/product/jtwain/index.php) estoy obteniendo imágenes con el alimentador automático.. mandando como parámetros a 100 dpi y en Tipo de Imagen: Texto o imagen en blanco y negro.. las imagenes se pintan bien sobre mi panel pero a la hora de pasarlas al PDF (con iText) las imagenes se ven distorcionadas, como inclinadas

document.newPage();
Image image = Image.getInstance(awtImage, null);
image.scaleToFit(612, 1008);//oficio
image.setAlignment(image.ALIGN_CENTER);
document.add(image);

Que puedo hacer para agregarlas al PDF correctamente?
Saludos

Centro de Estudios dijo...

Hola gustavo. gracias por el gran aporte, ademas quería pedirte que cargaras un nuevo link para descargar la librería, ya que los vínculos existentes no funcionan.

Muchas gracias de antemano.

Unknown dijo...

Saludos a la comunidad,

Yo descargué la librería de http://aigleon.blogspot.com/2011/03/no-se-si-alguien-encuentre-esto-asi-que.html

Intento personalizar la librería, solo modifiqué TwainAppletExample en el método update para habilitar device.setResolution(100) pero tengo la excepcion

uk.co.mmscomputing.device.twain.TwainFailureException: Failed during call to twain source.
cc=Not enough memory to perform operation

Encontré que en http://thorntonzone.com/manuals/Compression/Fax,%20IBM%20MMR/MMSC/mmsc/uk/co/mmscomputing/news/index.html el 2009-04-23 solucionaron un bug sobre memoria.

Tal vez este código fuente no sea la última versión(ultima actualización 2008-07-25), alguien me puede dar una mano o subir los fuentes?

Muchas gracias!!!

PD También modifique ScannerTab método negotiate y lo mismo.

Anónimo dijo...

Hola Gustavo,

en el ejemplo de JTwainAppletExample, cuando entra al update, ¿Cúando se ejecuta el código dentro del if del NEGOTIATE? siempre entra en el ACQUIRED, ya que pulso el botón de acquire, pero me gustaría entrar al negotiate para poder configurar algunos parámetros manualmente.

Gracias de antemano a tod@s.
Un saludo.

Anónimo dijo...

Hola.

Cómo puedo escanear varias hojas, y que las guarde en el mismo archivo de pdf?

Gracias. Diana

 
Este Weblog, InforMateando..., está licenciado bajo Licencia Creative Common - por Gustavo Suhit