Scanners: Difference between revisions
imported>Tobias.bora m minor typo |
Starfish2228 (talk | contribs) →GIMP support: Fix code example |
||
(10 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
==Installing scanner support== | ==Installing scanner support== | ||
Scanner support is provided by the SANE library. To enable scanner support, amend | Scanner support is provided by the [http://www.sane-project.org SANE] library. To enable scanner support, amend your system configuration like so: | ||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | { | ||
... | ... | ||
hardware.sane.enable = true; | hardware.sane.enable = true; # enables support for SANE scanners | ||
... | ... | ||
} | } | ||
</ | </nowiki>}} | ||
Users in the <code>scanner</code> group will gain access to the scanner, or the <code>lp</code> group if it’s also a printer. To add yourself to these groups, amend your system configuration as follows: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
< | |||
{ | { | ||
... | ... | ||
users.users.YOURUSERNAME.extraGroups = [ "scanner" "lp" ]; | |||
... | ... | ||
} | } | ||
</ | </nowiki>}} | ||
{{evaluate}} | {{evaluate}} | ||
{{Tip|The detection of installed backends by SANE depends on the < | {{Tip|The detection of installed backends by SANE depends on the <code>LD_LIBRARY_PATH</code> environment variable, which is set at login. You will need to '''logout''' and '''login''' again for backend changes to take effect after evaluation.}} | ||
==Testing scanner support== | ==Testing scanner support== | ||
Line 30: | Line 25: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
If you can only see scanners when running as root, try adding the user to the <tt>scanner</tt> or <tt>lp</tt> either using the | If you can only see scanners when running as root, try adding the user to the <tt>scanner</tt> or <tt>lp</tt> groups, either using the method given above, or as follows (beware, don't forget to logout/login after running this command): | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ sudo usermod -a -G scanner,lp username | $ sudo usermod -a -G scanner,lp username | ||
Line 36: | Line 31: | ||
==Supported backends== | ==Supported backends== | ||
See the [http://www.sane-project.org/sane-supported-devices.html Supported Devices] page to | See the [http://www.sane-project.org/sane-supported-devices.html Supported Devices] page to check if your scanner is supported. Some backends are proprietary and are not installed by default; see below. You may also be interested in "driverless" scanning (see below) if your scanner supports Apple AirScan and/or Microsoft WSD. | ||
===Driverless Apple AirScan and Microsoft WSD=== | ===Driverless Apple AirScan and Microsoft WSD=== | ||
A large number of printers now support "driverless" scanning. As explained | A large number of printers now support "driverless" scanning. As explained [https://github.com/alexpevzner/sane-airscan at the sane-airscan backend project]: | ||
<blockquote> | <blockquote> | ||
Line 46: | Line 41: | ||
* Apple AirScan or AirPrint scanning (official protocol name is eSCL) | * Apple AirScan or AirPrint scanning (official protocol name is eSCL) | ||
* Microsoft WSD, or WS-Scan ( | * Microsoft WSD, or WS-Scan (Web Services for Devices) | ||
This backend implements both protocols, choosing automatically between them. It was successfully tested with many devices from | This backend implements both protocols, choosing automatically between them. It was successfully tested with many devices from Brother, Canon, Dell, Kyocera, Lexmark, Epson, HP, Panasonic, Ricoh, Samsung and Xerox, both in WSD and eSCL modes. | ||
For eSCL devices, Apple maintains a [https://support.apple.com/en-us/HT201311 | For eSCL devices, Apple maintains a [https://support.apple.com/en-us/HT201311 comprehensive list of compatible devices]. This list has scanners, multifunction devices and pure printers. | ||
</blockquote> | </blockquote> | ||
eSCL/Apple Airscan scanners should be found natively by the default escl backend. However, the <tt>sane-airscan</tt> third party backend is more actively maintained and you may have better luck using it: | |||
<syntaxhighlight lang="nix"> | <syntaxhighlight lang="nix"> | ||
hardware.sane.extraBackends = [ pkgs.sane-airscan ]; | hardware.sane.extraBackends = [ pkgs.sane-airscan ]; | ||
services.udev.packages = [ pkgs.sane-airscan ]; | |||
</syntaxhighlight> | |||
It can be that your scanner is found twice (once by <tt>escl</tt> and once by <tt>airscan</tt>, in this case disable <tt>escl</tt>: | |||
<syntaxhighlight lang="nix"> | |||
hardware.sane.disabledDefaultBackends = [ "escl" ]; | |||
</syntaxhighlight> | |||
To detect Microsoft WSD "driverless" scanning, also use the <tt>sane-airscan</tt> backend. | |||
If the scanner is connected by USB, also set the following option: | |||
<syntaxhighlight lang="nix"> | |||
services.ipp-usb.enable=true; | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 79: | Line 87: | ||
<syntaxhighlight lang="nix">{ | <syntaxhighlight lang="nix">{ | ||
hardware.sane.enable = true; | hardware.sane.enable = true; | ||
hardware.sane.drivers.scanSnap.enable = true; | |||
# the below may be necessary | |||
nixpkgs.config.sane.snapscanFirmware = pkgs.fetchurl { | nixpkgs.config.sane.snapscanFirmware = pkgs.fetchurl { | ||
# https://wiki.ubuntuusers.de/Scanner/Epson_Perfection/#Unterstuetzte-Geraete | # https://wiki.ubuntuusers.de/Scanner/Epson_Perfection/#Unterstuetzte-Geraete | ||
Line 91: | Line 101: | ||
<syntaxhighlight lang="nix">{ | <syntaxhighlight lang="nix">{ | ||
... | ... | ||
imports = [ | imports = [ | ||
<nixpkgs/nixos/modules/services/hardware/sane_extra_backends/brscan4.nix> | <nixpkgs/nixos/modules/services/hardware/sane_extra_backends/brscan4.nix> | ||
./hardware-configuration.nix | ./hardware-configuration.nix | ||
]; | ]; | ||
... | ... | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
Line 122: | Line 132: | ||
<ol> | <ol> | ||
<li> | <li>Enable GIMP support in xsane by editing <tt>/etc/nixos/configuration.nix.</tt> Remove <tt>pkgs.xsane</tt> from your package list, and use the following instead: | ||
<syntaxhighlight lang="nix">{ | <syntaxhighlight lang="nix">{ | ||
... | #... | ||
environment.systemPackages = [ | |||
(pkgs.xsane.override { gimpSupport = true; }) | |||
]; | |||
... | #... | ||
}</syntaxhighlight></li> | }</syntaxhighlight></li> | ||
<li>Rebuild: <syntaxhighlight lang="console">$ sudo nixos-rebuild switch</syntaxhighlight></li> | <li>Rebuild: <syntaxhighlight lang="console">$ sudo nixos-rebuild switch</syntaxhighlight></li> | ||
<li>Finally, you will need to manually create a symlink: | <li>Finally, you will need to manually create a symlink: | ||
<syntaxhighlight lang="console">$ ln -s /run/current-system/sw/bin/xsane ~/. | <syntaxhighlight lang="console">$ ln -s /run/current-system/sw/bin/xsane ~/.config/GIMP/2.10/plug-ins/xsane</syntaxhighlight> | ||
</li></ol> | </li></ol> | ||
==Network scanning== | ==Network scanning== | ||
If | If NixOS cannot find a scanner located on your network, you may be interested in adding in your <tt>configuration.nix</tt>: | ||
<syntaxhighlight lang="nix">{ | <syntaxhighlight lang="nix">{ | ||
Line 163: | Line 173: | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
== | ==Using the scanner button== | ||
Many scanners feature a hardware button which makes for very convenient operation, especially in combination with an automated document processing system like <tt>paperless</tt>. NixOS includes the scanner button daemon <tt>scanbd</tt> which can be used for this purpose; however, its setup isn't terribly user friendly. | |||
Basic <tt>scanbd</tt> configuration requires us to provide: | |||
# a config file; | |||
# a script to execute the scanning sequence; | |||
# a systemd service that loads the config file, starts polling the scanner, and executes the script when it detects a button press. | |||
{{Tip|As <tt>scanbd</tt> continuously polls the scanner, it can't be used at the same time by SANE, which must be disabled.}} | |||
There is a more advanced configuration which allows sharing the scanner with SANE frontends, but I haven't yet figured out how to set this up under NixOS (the config is a bit recursive). | |||
Full documentation is in [https://sourceforge.net/p/scanbd/code/HEAD/tree/releases/1.5.1/doc/README.txt the project README]. | |||
[https://kliu.io/post/automatic-scanning-with-scansnap-s500m/ kliu's blog] includes in his writeup a nice script, bits of which have been cribbed here. | |||
Here is a working derivation that dumps the scanned document into the <tt>paperless</tt> intake directory; you'll need to modify it to suit your own needs. | |||
<syntaxhighlight lang="nix"> | |||
{ config, lib, pkgs, ... }: | |||
with lib; | |||
let | |||
configDir = "/etc/scanbd"; | |||
saneConfigDir = "${configDir}/sane.d"; | |||
scanbdConf = pkgs.writeText "scanbd.conf" | |||
'' | |||
global { | |||
debug = true | |||
debug-level = ${toString config.services.scanbd.debugLevel} | |||
user = ${config.services.scanbd.user} | |||
group = ${config.services.scanbd.group} | |||
scriptdir = ${configDir}/scripts | |||
pidfile = ${config.services.scanbd.pidFile} | |||
timeout = ${toString config.services.scanbd.timeOut} | |||
environment { | |||
device = "SCANBD_DEVICE" | |||
action = "SCANBD_ACTION" | |||
} | |||
multiple_actions = true | |||
action scan { | |||
filter = "^scan.*" | |||
numerical-trigger { | |||
from-value = 1 | |||
to-value = 0 | |||
} | |||
desc = "Scan to file" | |||
script = "scan.script" | |||
} | |||
${config.services.scanbd.extraConfig} | |||
} | |||
''; | |||
scanScript = pkgs.writeScript "scanbd_scan.script" | |||
'' | |||
#! ${pkgs.bash}/bin/bash | |||
export PATH=${lib.makeBinPath [ pkgs.coreutils pkgs.sane-frontends pkgs.sane-backends pkgs.ghostscript pkgs.imagemagick ]} | |||
set -x | |||
date="$(date --iso-8601=seconds)" | |||
filename="Scan $date.pdf" | |||
tmpdir="$(mktemp -d)" | |||
pushd "$tmpdir" | |||
scanadf -d "$SCANBD_DEVICE" --source "ADF Duplex" --mode Gray --resolution 200dpi | |||
# Convert any PNM images produced by the scan into a PDF with the date as a name | |||
convert image* -density 200 "$filename" | |||
chmod 0666 "$filename" | |||
# Remove temporary PNM images | |||
rm --verbose image* | |||
# Atomic move converted PDF to destination directory | |||
paperlessdir="/var/lib/paperless/consume" | |||
cp -pv "$filename" $paperlessdir/"$filename".tmp && | |||
mv $paperlessdir/"$filename".tmp $paperlessdir/"$filename" && | |||
rm "$filename" | |||
popd | |||
rm -r "$tmpdir" | |||
''; | |||
in | |||
{ | |||
###### interface | |||
options = { | |||
services.scanbd.enable = mkOption { | |||
type = types.bool; | |||
default = false; | |||
description = '' | |||
Enable support for scanbd (scanner button daemon). | |||
<note><para> | |||
If scanbd is enabled, then saned must be disabled. | |||
</para></note> | |||
''; | |||
}; | |||
services.scanbd.user = mkOption { | |||
type = types.str; | |||
default = "scanner"; | |||
example = ""; | |||
description = '' | |||
scanbd daemon user name. | |||
''; | |||
}; | |||
services.scanbd.group = mkOption { | |||
type = types.str; | |||
default = "scanner"; | |||
example = ""; | |||
description = '' | |||
scanbd daemon group name. | |||
''; | |||
}; | |||
services.scanbd.extraConfig = mkOption { | |||
type = types.lines; | |||
default = ""; | |||
example = '' | |||
device canon { | |||
filter = "^genesys.*" | |||
desc = "Canon LIDE" | |||
action file { | |||
filter = "^file.*" | |||
desc = "File" | |||
script = "copy.script" | |||
} | |||
} | |||
''; | |||
description = '' | |||
Extra configuration lines included verbatim in scanbd.conf. | |||
Use e.g. in lieu of including device-specific config templates | |||
under scanner.d/ | |||
''; | |||
}; | |||
services.scanbd.pidFile = mkOption { | |||
type = types.str; | |||
default = "/var/run/scanbd.pid"; | |||
example = ""; | |||
description = '' | |||
PID file path. | |||
''; | |||
}; | |||
services.scanbd.timeOut = mkOption { | |||
type = types.int; | |||
default = 500; | |||
example = ""; | |||
description = '' | |||
Device polling timeout (in ms). | |||
''; | |||
}; | |||
services.scanbd.debugLevel = mkOption { | |||
type = types.int; | |||
default = 3; | |||
example = ""; | |||
description = '' | |||
Debug logging (1=error, 2=warn, 3=info, 4-7=debug) | |||
''; | |||
}; | |||
}; | |||
###### implementation | |||
config = mkIf config.services.scanbd.enable { | |||
users.groups.scanner.gid = config.ids.gids.scanner; | |||
users.users.scanner = { | |||
uid = config.ids.uids.scanner; | |||
group = "scanner"; | |||
}; | |||
environment.etc."scanbd/scanbd.conf".source = scanbdConf; | |||
environment.etc."scanbd/scripts/scan.script".source = scanScript; | |||
environment.etc."scanbd/scripts/test.script".source = "${pkgs.scanbd}/etc/scanbd/test.script"; | |||
systemd.services.scanbd = { | |||
enable = true; | |||
description = "Scanner button polling service"; | |||
documentation = [ "https://sourceforge.net/p/scanbd/code/HEAD/tree/releases/1.5.1/integration/systemd/README.systemd" ]; | |||
script = "${pkgs.scanbd}/bin/scanbd -c ${configDir}/scanbd.conf -f"; | |||
wantedBy = [ "multi-user.target" ]; | |||
aliases = [ "dbus-de.kmux.scanbd.server.service" ]; | |||
}; | |||
}</syntaxhighlight> | |||
==See also== | ==See also== | ||
Line 170: | Line 373: | ||
* [https://download.tuxfamily.org/xcfaudio/ Misc Agfa Snapscan] | [https://ipfs.io/ipfs/QmZJ2SfpfYUAS23TujhcdLpTox1SW3Dw3MoCej9GAfs4ya IPFS mirror] | * [https://download.tuxfamily.org/xcfaudio/ Misc Agfa Snapscan] | [https://ipfs.io/ipfs/QmZJ2SfpfYUAS23TujhcdLpTox1SW3Dw3MoCej9GAfs4ya IPFS mirror] | ||
[[Category:Hardware]] |