Sectors: Finance • Information Technoloy • Government • Healthcare • Industries • Education • (show all)
We'll continue to offer JTwain and JSane. However, there are some limitations with both of them. JTwain can only runs on 32bit JVM. The main reason is most of vendors do not offer any 64bit TWAIN driver. This means even if JTwain is compiled into a 64bit library, no device will ever show up. Currently, you need JSane to access scanners on Linux and Unix operating systems.
Java 1.6 is required. The SDK may work with Java version 1.4 and 1.5, however, these are not officially supported.
The typical code flow: 1. Get the device and the functional unit; 2. Set the capabilities – color, bitdepth, paper size, etc; 3. Scan.
List<Device> devices = ScanManager.getDefaultManager().getDevices(); // list all devices
String deviceId = ScanManager.getDefaultManager().selectDeviceUsingUI(); // UI select
Device device = Utils.searchDevice(devices, deviceId); // device object obtained
FunctionalUnit flatbed = device.getFlatbed(); // each device may have multiple functional units
FunctionalUnit feeder = device.getDocumentFeeder(); // could be null
flatbed.setPixelDataType((FunctionalUnit.PixelDataType.COLOR); // set capabilities
flatbed.setBitDepth(FunctionalUnit.BitDepth.BIT_DEPTH_24_BITS);
flatbed.setResolution(300);
functionalUnit.scanOnePage(new File("test.jpg"), new ScanProgressListener() {
@Override
public void started() {
// progressBarScanPureJava.setValue(0);
}
@Override
public void progress(final int percent) {
// progressBarScanPureJava.setValue(percent);
}
@Override
public void finished(String error) {
// progressBarScanPureJava.setValue(100);
}
}, null);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
functionalUnit.scanOnePage(outputStream, null, null);
System.out.println("Size of image scanned is: " + outputStream.size());
byte[] bytes = outputStream.toByteArray();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
Image image = ImageIO.read(inputStream); // then you can display to UI
output to PNG:
functionalUnit.scanOnePage(outputStream, null, new FunctionalUnit.PropertyBuilder() .setOutputFormat(FunctionalUnit.OutputFormat.PNG).toString());
Output to TIFF:
functionalUnit.scanOnePage(outputStream, null, new FunctionalUnit.PropertyBuilder() .setOutputFormat(FunctionalUnit.OutputFormat.TIFF).setTiffCompressionScheme(FunctionalUnit.TiffCompression.CCITT4).toString());
Output to PDF:
functionalUnit.scanOnePage(outputStream, null, new FunctionalUnit.PropertyBuilder() .setOutputFormat(FunctionalUnit.OutputFormat.PDF).setTiffCompressionScheme(FunctionalUnit.TiffCompression.CCITT4).toString());
When file size is a concern, do use TIFF/PDF with CCITT Group 4 (T.6) to get ultra small size image files.
Asprise Scanning and Image Capture SDK offers a clean and powerful API for ADF scan. Sample code:
ScanManager manager = ScanManager.getDefaultManager();
Device device = manager.getDevices().get(0);
FunctionalUnit feeder = device.getDocumentFeeder();
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
fu.scan(new AbstractScanListener() {
@Override
public Object getPageOutputTarget(int pageIndex, long pageId) {
if(pageIndex <= 2) {
return outputStream;
} else { // accept max 3 pages (0, 1, 2).
return 0;
}
}
},
new FunctionalUnit.PropertyBuilder()
.setAdf(true)
.setOutputFormat(FunctionalUnit.OutputFormat.TIFF)
.setTiffCompressionScheme(FunctionalUnit.TiffCompression.CCITT4)
.setMode(FunctionalUnit.Mode.HIGH_SPEED)
.toString()
);
The above code will scan max 3 pages and save the content in TIFF format into the memory. Note you use the getPageOutputTarget method to control output destination or to stop the scan by returning null. Besides streams, you can also return File.