SANE
SANE (Scanner Access Now Easy) 提供了一个库和一个命令行工具,用于在 GNU/Linux 下使用扫描仪。
安装
安装 sane 软件包。大多数前端和驱动程序无论如何都会将其作为依赖项拉取,因此通常没有必要显式安装它。
扫描仪驱动
许多现代扫描仪都支持“无驱动”扫描。[1] 您可以在 sane-airscan GitHub 或 Apple AirPrint 设备上查找您的设备的兼容性。
安装 sane-airscan 软件包,如果已知扫描仪在“无驱动”模式下工作。如果您的扫描仪使用 USB,也请安装 ipp-usb 软件包并 启动/启用 ipp-usb.service
以允许通过 USB 连接使用 IPP 协议。
否则,请查看 SANE - 支持的设备 和 SANE/扫描仪特定问题,以查看您的扫描仪是否可以使用不同的驱动程序。
大多数扫描仪应该开箱即用。如果您的扫描仪无法工作,请参阅 SANE/扫描仪特定问题 以获取安装说明。
前端
存在许多 SANE 的前端,可以在 SANE 项目网站上找到非详尽列表。
- GNOME 文档扫描仪 — 简化的 GUI,旨在比 XSane 更易于使用,并更好地集成到 GNOME 桌面。属于 gnome 的一部分。
- Skanlite — 简单的图像扫描应用程序,除了扫描和保存图像外,什么都不做,基于 KSane 后端。属于 kde-graphics 的一部分。
- Skanpage — 一个简单的扫描应用程序,专为多页扫描和保存文档和图像而设计。属于 kde-utilities 的一部分。
- XSane — 功能齐全的基于 GTK 的前端,看起来有点旧,但提供了扩展的功能。
- http://www.xsane.org/ || xsaneAUR
- Xsane-gimp — 一个 GIMP 插件,用于从 GIMP 使用 xsane 进行扫描。
- Scantailor — 一个扫描应用程序,可与项目一起使用,并允许在扫描过程中进行实时编辑。
一些 OCR 软件 可以使用 SANE 扫描图像:gImageReader、gscan2pdf、Linux-Intelligent-Ocr-Solution、OCRFeeder、Paperwork。
- 已知在 16 位色彩深度模式下使用 XSane 直接扫描到 PDF 会产生 损坏的文件,并且
pacman
输出中的注释会警告这一点。已知 8 位模式可以工作。
- 使用前端并不意味着您不必应用一些技巧。对于通过 mDNS 配置的设备尤其如此。例如,
skanlite
需要在命令行中指定其他信息,以便正确检测网络扫描仪,因为它无法处理 mDNS。以下是 HP Officejet Pro L7590 的示例:skanlite --device "hpaio:/net/Officejet_Pro_L7500?ip=192.168.0.17"
。
验证
现在您可以尝试查看 sane 是否识别您的扫描仪。
$ scanimage -L
如果失败,请以 root 身份再次运行该命令以检查权限问题。如果仍然失败,请检查您的扫描仪是否已插入计算机。您可能还需要拔下/插入扫描仪,以便 /usr/lib/udev/rules.d/65-sane.rules
识别您的扫描仪。
现在您可以查看它是否真正工作
$ scanimage --format=png --output-file test.png --progress
如果扫描失败并显示消息 scanimage: sane_start: Invalid argument
,您可能需要指定设备。
$ scanimage -L
device `v4l:/dev/video0' is a Noname Video WebCam virtual device device `pixma:04A91749_247936' is a CANON Canon PIXMA MG5200 multi-function peripheral
然后您需要运行
$ scanimage --device "pixma:04A91749_247936" --format=tiff --output-file test.tiff --progress
Sane 为许多扫描仪类型提供了许多特殊的后端选项。要查看您的设备的这些选项是什么
$ scanimage -A
固件
固件通常具有 .bin 扩展名。
首先,您需要将固件放在安全的地方,建议将其放在 /usr/share/sane/
的子目录中。
然后您需要告诉 sane 固件在哪里
- 从 sane 支持的设备列表中找到您的扫描仪的后端名称。
- 打开文件
/etc/sane.d/backend-name.conf
。 - 确保固件条目未注释,并让文件路径指向您放置扫描仪固件文件的位置。确保
scanner
组的成员可以访问/etc/sane.d/backend-name.conf
文件。
如果您的扫描仪的后端不是 sane 软件包的一部分(例如 hpaio.conf
,它是 hplip 的一部分),您需要在 /etc/sane.d/dll.d
或 /etc/sane.d/dll.conf
中取消注释相关的条目。
在网络上共享您的扫描仪
您可以与网络上使用 sane、xsane 或启用 xsane 的 GIMP 的其他主机共享您的扫描仪。要设置服务器,首先指示允许哪些主机访问您的网络。
根据您的喜好更改 /etc/sane.d/saned.conf
文件,例如
# required localhost # allow local subnet 192.168.0.0/24
其次,在您的服务器上安装、启动并启用 avahi-daemon(如果尚未激活),以便可以通过多播找到您的扫描仪。或者,如果您的扫描仪受 Airscan 支持,则安装 sane-airscan 软件包是一种替代方案。
如果您使用 iptables,插入 nf_conntrack_sane
模块,以让防火墙跟踪 saned
连接。
Conntrack 助手似乎默认禁用。[2] 您可以使用以下命令激活它
# echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
要永久配置此项,请为 nf_conntrack
模块设置 nf_conntrack_helper=1
选项,请参阅 内核模块#使用 modprobe.d。
现在启动/启用 saned.socket
。您的扫描仪现在可以通过网络使用。有关更多信息,请参阅 saned(8)。
scanimage -L
的输出以查看扫描仪 URL。从远程工作站访问您的扫描仪
您可以从远程 Arch Linux 工作站访问启用网络的扫描仪。
首先,在 /etc/sane.d/net.conf
文件中指定服务器的主机名或 IP 地址
# static IP address 192.168.0.1 # or host name stratus
其次,根据您在服务器端配置的内容,在远程工作站上安装、启动并启用 avahi-daemon 或安装 sane-airscan。
现在测试您的工作站的连接
$ scanimage -L
网络扫描仪现在也应该在某些 前端 中显示。
Windows 客户端
由于 SANE 的 Windows 端口似乎 不受支持、过时且难以获取,您可以尝试 SANEWinDS 或 SaneTwain(旧)。
故障排除
另请参阅 SANE/扫描仪特定问题。
无效参数
如果您在使用 xsane 或其他 sane 前端时收到“无效参数”错误,这可能是由以下原因之一造成的
缺少固件文件
未为使用的扫描仪提供固件文件(详情请参阅 #固件)。
错误的固件文件权限
所用固件文件的权限错误。 使用以下命令更正它们
# chown root:scanner /usr/share/sane/SCANNER_MODEL/FIRMWARE_FILE # chmod ug+r /usr/share/sane/SCANNER_MODEL/FIRMWARE_FILE
多个后端声称拥有扫描仪
可能会发生多个后端支持(或声称支持)您的扫描仪的情况,而 sane 选择了一个最终不支持的后端(扫描仪将不会被 scanimage -L
显示)。 这发生在较旧的 Epson 扫描仪和 epson2
resp. epson
后端上。 在这种情况下,解决方案是在 /etc/sane.d/dll.conf
中注释掉不需要的后端。 在 Epson 案例中,这将是注释掉 epson2
/etc/sane.d/dll.conf
#epson2 epson
独立的 iscanAUR epkowa
后端也可能干扰您的 snapscan
后端(Epson 扫描仪)。 您可能在使用 scanimage -L
命令后立即收到此错误。 再次启动扫描仪应用程序(如 xsaneAUR)也可以解决问题。 否则,请检查您的 /etc/sane.d/epkowa.conf
是否有错误的配置,或删除 iscanAUR 软件包。
通过 xHCI 通信不起作用(较旧的扫描仪型号)
当通过 USB3 端口连接时,一些较旧的扫描仪型号无法工作。 如果您遇到此问题,请尝试在启动前端之前设置 SANE_USB_WORKAROUND=1
环境变量。[3][4]
如果这不起作用,请尝试以下解决方法之一
- 如果可用,请使用 USB2 端口代替 USB3 端口。
- 通过 BIOS/EFI 禁用 xHCI。 随后将使用 eHCI,与扫描仪的通信将正常工作。 缺点是任何端口都无法达到 USB3 速度。
- 在(某些)英特尔芯片组上,可以使用
setpci
命令将特定的 USB 端口路由到 xHCI 或 eHCI 控制器。 有关更多信息,请参阅 force-a-single-usb-3-0-port-to-work-as-usb-2-0 (向下滚动到显示“setpci”的位置)。 这样就可以使用简单的 shell 脚本切换单个 USB 端口。 - 如果扫描仪支持,则通过网络连接扫描仪。
防火墙
当网络扫描扫描仪挂起时,则发生无效参数错误。
saned 使用数据端口范围,因此您必须启用与 6566/tcp 的连接以及来自 /etc/sane.d/saned.conf 的 data_portrange,或者为 sane 使用 conntrack 防火墙模块以启用数据端口,如上所述。
启动缓慢
如果您遇到启动缓慢的问题(例如 xsane
或 scanimage -L
没有几乎立即返回结果),您不使用的驱动程序之一可能是罪魁祸首。
您可以通过编辑 /etc/sane.d/dll.conf
并注释掉您不使用的扫描仪驱动程序来解决此问题。 您可以使用 scanimage -L
来确定您需要哪些驱动程序
$ scanimage -L
device `brother4:net1;dev0' is a Brother DCP-L2550DW device `v4l:/dev/video0' is a Noname Logitech Webcam C925e virtual device device `escl:http://192.168.1.2:80' is a Brother DCP-L2550DW series adf,platen scanner
输出中 `
和 :
之间的部分指示设备的驱动程序。 例如,如果您只想使用 Brother 扫描仪,而不是 网络摄像头 或通用扫描仪驱动程序,您可以注释掉 /etc/sane.d/dll.conf
中除 brother4
驱动程序之外的所有内容。
启动缓慢问题的另一个原因可能在于 /etc/sane.d/backend-name.conf
中的驱动程序特定配置文件; 例如,据报道,注释掉 /etc/sane.d/epson2.conf
中的 net autodiscovery
可以解决使用 USB 的 Epson 扫描仪的这些启动缓慢问题。
设备忙
如果您的 USB 设备通过 scanimage -L
列出,但启动测试 scanimage pixma:04A9173E_11DAD1 --format=tiff --output-file test.tiff
始终返回“Device busy”错误,您可以尝试将您的用户名添加到 scanner 组 usermod -a -G scanner yourusername
,然后通过在 /etc/modprobe.d/no-usblp.conf
中写入 blacklist usblp
来禁用 usblp
内核模块(它阻止 usblp
加载以支持扫描,xsane 和相关工具不需要,也可能与 CUPS 冲突)。 重新启动完成操作。[5]
除此之外,如果扫描模式设置为“计算机”,一些 Cannon 打印机将返回“device busy”。 将其设置为“远程扫描仪”模式应解决此问题。[6]
权限问题
使用 systemd,scanner
和 lp
组已弃用。 无需将您的用户添加到这些组。 有关详细信息,请参见 用户和组#Pre-systemd 组。
您也可以尝试更改 usb 设备的权限,但这不推荐,更好的解决方案是修复 Udev 规则,以便识别您的扫描仪。
首先使用 lsusb
检查连接的 usb 设备
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 003 Device 003: ID 04d9:1603 Holtek Semiconductor, Inc. Bus 003 Device 002: ID 04fc:0538 Sunplus Technology Co., Ltd Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 006: ID 03f0:2504 Hewlett-Packard Bus 001 Device 002: ID 046d:0802 Logitech, Inc. Webcam C200 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
在我们的示例中,我们看到扫描仪:Bus 001 Device 006: ID 03f0:2504 Hewlett-Packard
。 这里 03f0
是 vendorID,2504
是 productID。
或者,以 root 权限运行 sane-find-scanner
也会给您相同的 vendorID 和 productID。
现在打开 /usr/lib/udev/rules.d/65-sane.rules
,查看是否有包含您扫描仪的 vendorID 和 productID 的行。 如果没有任何行,请创建新文件 /etc/udev/rules.d/65-sane-missing-scanner.rules
,内容如下
ATTRS{idVendor}=="vendorID", ATTRS{idProduct}=="productID", MODE="0664", GROUP="lp", ENV{libsane_matched}="yes"
保存文件,拔出并重新插入扫描仪,文件权限现在应该正确了。
另一个技巧是,您可以将您的设备(扫描仪)添加到后端文件中
将 usb 0x03f0 0x2504
添加到 /etc/sane.d/hp4200.conf
,使其看起来像这样
# # Configuration file for the hp4200 backend # # # HP4200 #usb 0x03f0 0x0105 usb 0x03f0 0x2504
并行端口扫描仪
连接到并行端口的所有设备都假定为打印机,并被赋予 lp
组。 创建一个 udev 规则以将相关的并行端口标记为 libsane_matched
,或者将您的用户添加到 lp
用户组。 CUPS 也使用 lp
组进行对配置文件的只读访问,因此将用户添加到 lp
组存在潜在的安全隐患 - 有关更多信息,请参见 CUPS#连接接口。
avahi-daemon 不是强制性的
某些扫描仪应用程序可能要求您在启动时启动 avahi-daemon。 这实际上是 SANE 的原因。 如果由于某种原因您不想启用 avahi-daemon 服务,因为您使用有线扫描仪,或者因为您的扫描仪驱动程序已经在设置时支持网络,则注释掉 SANE 配置中的 net
后端
/etc/sane.d/dll.conf
# The next line enables the network backend; comment it out if you do not # need to use a remote SANE scanner over the network -- see sane-net(5) # and saned(8) for details. #net
然后重新启动 saned
守护程序。
设备 I/O 期间出错
如果您在使用 HP 扫描仪尝试扫描时收到 SANE: Error during device I/O (code=9)
,请确保您已安装 hplip-pluginAUR(请参阅 CUPS/打印机特定问题#HP)。
提示和技巧
scanimage 输出不令人满意
当 scanimage
输出不令人满意时,可以运行
$ scanimage --all-options
以请求列出后端公开的所有可用选项。 输出可能暗示不令人满意的输出是由于默认值太低,并说明可以显式设置哪些值可能会改善结果。
另请参阅
- Wikipedia:WS-Discovery,微软的“免驱动”协议