Here's how I managed to get Linux to recognise scan button presses on the S1500, and automatically initiate a scan to a pdf file. You first need to download Scanbd and install it. Unfortunately, there doesn't seem to be any apt repository for Scanbd, so I had to download the source and build it. Here's the minimal setup needed to get this built, based on instructions on the web here, followed by updated info that I pieced together on getting this enabled that didin't require xinetd, etc.
1 Building Scanbd
First, as root (sudo su -), install the following packages to allow you to compile Scanbd:
apt-get install build-essential
apt-get install libconfuse-dev libusb-dev libudev-dev libdbus-1-dev dbus libsane-dev
Next, get the source code for Scanbd and build it:
cd /root
mkdir src
cd src
wget http://sourceforge.net/projects/scanbd/files/releases/scanbd--1.3.1.zip/download -O scanbd.zip
unzip scanbd.zip
cd <UNZIPPED DIRECTORY>
./configure
make
make install
2 Configuring Scanbd
Scanbd is now installed into /usr/local/sbin/scanbd, and its configuration files are in /usr/local/etc/scanbd. Follow similar instructions to ArchLinux.
cp -R /etc/sane.d /usr/local/etc/scanbd
Modify /etc/sane.d/dll.conf to only have the net line uncommented, then update the /etc/sane.d/net.conf to have the following
connect_timeout = 3 localhost
Now, do the following to startup the daemon that responds to button presses on the S1500
export SANE_CONFIG_DIR=/usr/local/etc/scanbd/sane.d/
/usr/local/sbin/scanbd -df -c scanbd.conf
You can see messages in the syslog /var/log/syslog. After you run the command, it will take about 10 to 15 seconds to detect and start listening to your scanner.
3 Custom scan script
The default script that gets executed when the button is pushed simply logs a message to syslog. (the script is /usr/local/etc/scanbd/test.script). If you look in /usr/local/etc/scanbd/scanbd.conf, you can set test.script to your own shell script. Here's my trigger script that is called scanadf.script:
#!/bin/bash
logger -t "scanbd: $0" "Begin of $SCANBD_ACTION for device $SCANBD_DEVICE"
mydate=$(echo "BLAH" | awk '{ print strftime("%Y%m%d_%H%M%S") }')
scanpdf --dpi=300 -d scan pdf /home/virantha/scans/scan_${mydate}.pdf 2>&1 > /tmp/output.log
logger -t "scanbd: $0" "End of $SCANBD_ACTION for device $SCANBD_DEVICE"
First, it logs the start of the scan to the syslog, and then it gets the current date using awk/strftime to use for the final pdf filename, and calls my scanpdf python program that handles all the scanning/post processing to pdf. You can find scanpdf documentation online, with source on github, and download on PyPI.
The script as written is slightly suboptimal, in that scanpdf does some processing (removing blank pages, etc) that can take some time, blocking the button response until it's done. A better way would be to spawn a background job to do this instead:
#!/bin/bash
logger -t "scanbd: $0" "Begin of $SCANBD_ACTION for device $SCANBD_DEVICE"
mydate=$(echo "BLAH" | awk '{ print strftime("%Y%m%d_%H%M%S") }')
myfile="/home/virantha/scans/scan_${mydate}.pdf"
scanpdf --dpi=300 --tmpdir=/tmp/${mydate} scan
scanpdf --dpi=300 --tmpdir=/tmp/${mydate} pdf ${myfile} &
logger -t "scanbd: $0" "End of $SCANBD_ACTION for device $SCANBD_DEVICE"
This way, as soon as the paper is out of the scanner, you can load the next job and hit the scan button immediately; the long-running post-processing job is run in the background.
4 Starting Scanbd as a service
Ubuntu uses upstart, so just create a conf file in /etc/init/scanbd like so:
# Scanbd
description "Scanbd service"
author "Virantha Ekanayake"
# When to start the service
start on runlevel [2345]
# When to stop the service
stop on runlevel [016]
# Automatically restart process if crashed
respawn
# Essentially lets upstart know the process will detach itself to the background
expect fork
# Specify the process/command to start, e.g.
exec sudo SANE_CONFIG_DIR=/usr/local/etc/scanbd/sane.d/ /usr/local/sbin/scanbd -df -c /usr/local/etc/scanbd/scanbd.conf
Then, run the following command to check this service:
initctl reload-configuration
initctl list | grep scanbd
service scanbd start
Wait about 20 seconds and check:
tail -f /var/log/syslog
ro make sure it started up. Now, after every boot, your scanbd service will be up and running, watching for button presses from your scanner.