mmateo
mmateo

Reputation: 29

Problems with connect to printer scanner

I have the following code to scan an image in Java 7, using the Morena library. My code is as follows:

import SK.gnome.morena.*;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class ScannerMorena {
    public static void main(String[] args) {
        try {
            // Seleccionar la fuente de escaneo (dispositivo de red
 o USB)
            MorenaSource source = Morena.selectSource(null);  // Mostrar cuadro de diálogo con dispositivos

            if (source != null) {
                System.out.println("Fuente seleccionada: " + source.toString());

                // Configurar el modo de color y la resolución
                //source.setColorMode();   // Modo de color predeterminado
                //source.setResolution(100);  // Resolución a 100 DPI

                // Obtener la imagen escaneada
                MorenaImage morenaImage = new MorenaImage(source);

                // Convertir la imagen escaneada a formato de Image de Java
                Image scannedImage = Toolkit.getDefaultToolkit().createImage(morenaImage);

                // Mostrar la imagen en una ventana gráfica
                showImage(scannedImage, "Imagen escaneada de red");

                // Cerrar la fuente
                Morena.close();
            } else {
                System.out.println("No se seleccionó ningún dispositivo.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Método para mostrar la imagen en un JFrame
    public static void showImage(Image image, String title) {
        JFrame frame = new JFrame(title);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Convertir Image a ImageIcon y agregarla a un JLabel
        JLabel label = new JLabel(new ImageIcon(image));

        // Agregar el JLabel al JFrame
        frame.getContentPane().add(label);
        frame.pack();  // Ajustar tamaño del frame al contenido
        frame.setVisible(true);
    }
}

With this program, the printer scan works correctly, and there are no interruptions in the process. But when I try to scan using another library called mmscomputing, the scanning process stops when the scan starts.

My code with mmscomputing library:

package MorenaExample;
import uk.co.mmscomputing.device.scanner.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;

import javax.swing.JComponent;

public class ScannerManager implements ScannerListener {
    private Scanner scanner;
    private boolean isScanning = false;
    private String lastError = null;
    private BufferedImage lastScannedImage = null;
    private String scannerName;
    
   

    public ScannerManager() {
        initializeScanner();
    }

    private void initializeScanner() {
        try {
            scanner = Scanner.getDevice();
            if (scanner != null) {
                scanner.addListener(this);
            } else {
                lastError = "No se pudo inicializar el escáner. Verifique que esté conectado y los drivers instalados.";
            }
        } catch (Exception e) {
            lastError = "Error al inicializar el escáner: " + e.getMessage();
        }
    }
    
    //Devolver dispositivos de escaneres en la pc
    public String[] listDevices() {
        String[] scannersList = null;
        try {
            //Deberia poder mostrar los escaneres en una lista de escaneres
            scannersList = scanner.getDeviceNames();
        }catch (ScannerIOException e) {
            // TODO: handle exception
            System.out.println("Error a la hora listar dipositivos");
        }
        return scannersList;
    }
    
    public boolean isInitialized() {
        return scanner != null;
    }

    public String getLastError() {
        return lastError;
    }

    public BufferedImage getLastScannedImage() {
        return lastScannedImage;
    }

    public String[] getAvailableScanners() {
        try {
            return scanner.getDeviceNames();
        } catch (ScannerIOException e) {
            lastError = "Error al obtener la lista de escáneres: " + e.getMessage();
            return new String[0];
        }
    }
    

    public boolean selectScanner(String scannerName) {
        try {
            scanner.select(scannerName);
            return true;
        } catch (ScannerIOException e) {
            lastError = "Error al seleccionar el escáner: " + e.getMessage();
            return false;
        }
    }

    public String getCurrentScanner() {
        try {
            return scanner.getSelectedDeviceName();
        } catch (ScannerIOException e) {
            lastError = "Error al obtener el nombre del escáner actual: " + e.getMessage();
            return null;
        }
    }
    public boolean startScan() {
        if (isScanning) {
            return false;
        }

        try {
            System.out.println("-----> El escaner es:" + scanner.getDevice());
            scanner.acquire();
            isScanning = true;
            return true;
        } catch (ScannerIOException e) {
            lastError = "Error al iniciar el escaneo: " + e.getMessage();
            return false;
        }
    }

    public void cancelScan() {
        try {
            scanner.setCancel(true);
        } catch (ScannerIOException e) {
            lastError = "Error al cancelar el escaneo: " + e.getMessage();
        }
    }

    public JComponent getScannerUI() {
        try {
            return scanner.getScanGUI();
        } catch (ScannerIOException e) {
            lastError = "Error al obtener la interfaz del escáner: " + e.getMessage();
            return null;
        }
    }

    @Override
    public void update(ScannerIOMetadata.Type type, ScannerIOMetadata metadata) {
        System.out.println("HOLA");
        System.out.println("Estado del escáner: " + type + type.toString());
        
        if (type.equals(ScannerIOMetadata.ACQUIRED)) {
            lastScannedImage = metadata.getImage();
            System.out.println("Imagen adquirida correctamente.");
            isScanning = false;
        } else if (type.equals(ScannerIOMetadata.FILE)) {
            File file = metadata.getFile();
            System.out.println("Imagen guardada en: " + file.getAbsolutePath());
        } else if (type.equals(ScannerIOMetadata.NEGOTIATE) && metadata.getDevice() != null)  {
            try {
                metadata.getDevice().setResolution(150.0); // Resolución en DPI
                //metadata.getDevice().setRegion(0, 0, 100, 100); // Configura el área de escaneo si es aplicable
            } catch (ScannerIOException e) {
                e.printStackTrace();
            }
        } else if (type.equals(ScannerIOMetadata.STATECHANGE)) {
            String state = metadata.getStateStr();
            System.out.println("Cambio de estado del escáner: " + state);
            
            if (state.contains("Connection Lost")) {
                System.out.println("La conexión con el escáner se ha perdido.");
                isScanning = false;
                // Aquí puedes intentar reconectar o dar alguna notificación al usuario
            }
        } else if (type.equals(ScannerIOMetadata.EXCEPTION)) {
            lastError = metadata.getException().getMessage();
            System.out.println("Error durante el escaneo: " + lastError);
            isScanning = false;
        }
        // Añadir una pausa de 500 ms entre cada cambio de estado
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("La pausa fue interrumpida: " + e.getMessage());
        }
    }




    public void close() {
        if (scanner != null) {
            scanner.waitToExit();
        }
    }
}

My GUI:

package ScannerPruebaGUI;


import java.awt.EventQueue;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import MorenaExample.ScannerManager;
import uk.co.mmscomputing.device.scanner.ScannerIOException;

public class UILibrary extends JFrame {

    private JPanel contentPane;
    private JList<String> listShowScanners;
    private String selectedScanner; // Variable para almacenar el escáner seleccionado
    private ScannerManager gestorScanner;
    
    

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    UILibrary frame = new UILibrary();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                
            }
        });
    }

    public UILibrary() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        listShowScanners = new JList<>();
        listShowScanners.setBounds(50, 50, 200, 150);
        contentPane.add(listShowScanners);

        // Listener para guardar el escáner seleccionado
        listShowScanners.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) { // Asegurarse de que se haya terminado la selección
                    selectedScanner = listShowScanners.getSelectedValue(); // Guardar el escáner seleccionado
                    //System.out.println("Escáner seleccionado: " + selectedScanner);
                    
                    try {
                        //Acceder al escaner que se selecciono
                        gestorScanner.selectScanner(selectedScanner);
                        boolean escanning = gestorScanner.startScan();
                        gestorScanner.close();
                    }catch (Exception f) {
                        // TODO: handle exception
                        System.out.println("Error en el proceso de escaneo" + f.getMessage());
                    }
                    //getSelectedScanner();
                }
            }
        });

        loadScannersList(); // Llenar la lista de escáneres disponibles
    }

    private void loadScannersList() {
        gestorScanner = new ScannerManager();
        String[] misEscaneres = gestorScanner.listDevices();
        
        if (misEscaneres != null && misEscaneres.length > 0) {
            DefaultListModel<String> model = new DefaultListModel<>();
            for (String scannerName : misEscaneres) {
                model.addElement(scannerName);
            }
            listShowScanners.setModel(model);
        } else {
            System.out.println("No se encontraron escáneres.");
        }
    }

    // Método para acceder al nombre del escáner seleccionado desde otra parte de la clase
    public void getSelectedScanner() {
        //Aca tengo en selectScanner el nombre, por lo que de la clase ScannerManager podria seleccionarlo
        boolean seleccion = gestorScanner.selectScanner(selectedScanner);
        System.out.println("El escaner seleccionado es: " + selectedScanner + " ,se selecciono con exito: " + seleccion);
    }
}

I have already read all the documentation and tested a few projects, but nothing works for me.

I want to scan an image from printer scanner with java 7, I have some scanners connected with red or resources shares, and i want my program to be able to do that.

Upvotes: 0

Views: 37

Answers (0)

Related Questions