扫描仪 HOWTO

Howard Shane

修订历史
修订 1.12004-05-16修订者:jhs
Libusb 和内核 2.6 系列更新,澄清
修订 1.052004-01-15修订者:jhs
杂项勘误和更新
修订 1.02003-08-19修订者:tm
初始版本,由 LDP 审核
修订 0.0407-03修订者:jhs
在邀请 SANE-devel 邮件列表的参与者提供反馈后,进行澄清、修订和编辑
修订 0.0106-03修订者:jhs
完成草稿。

本文档旨在记录在运行 Linux 的系统上访问和使用照片扫描仪设备所需的步骤。


目录
1. 介绍
1.1. 版权信息
1.2. 免责声明
1.3. 新版本
1.4. 致谢
1.5. 反馈
1.6. 本文档中使用的约定
2. 通用支持和接口类型
2.1. SCSI 扫描仪
2.2. USB 扫描仪
2.3. 并行端口扫描仪
2.4. IEEE 1394 (Firewire™, i.Link™)
2.5. 操作系统支持
2.6. USB 扫描仪和 Libusb
2.7. Linux 内核对扫描仪设备的支持
2.8. 并行端口扫描仪
3. 创建和访问扫描仪设备
3.1. 设备文件系统和 Udev
3.2. 手动创建设备
3.3. 组和权限
4. SANE
4.1. 获取 SANE
4.2. 配置 SANE
5. 测试扫描仪
6. SANE 前端
7. 故障排除
7.1. 帮助,我的扫描仪无法被 scanimage 或 xsane 找到!
7.2. 帮助,我不确定我的 USB 硬件是否正常工作!
7.3. 帮助,scanimage 或我正在使用的前端识别了错误的设备!
7.4. 帮助,我只能以 root 身份访问我的并行端口扫描仪!
7.5. 帮助,我有一个 Acme Whizzbang™ 或其他型号的扫描仪,但您没有解决我的特定问题!
8. GNU 自由文档许可证

1. 介绍

本文档旨在帮助 Linux 用户设置光栅图像扫描仪设备,包括平板扫描仪、手持扫描仪、视频和静止相机、帧捕获器等。它不涉及如何使用可用的软件工具来实现特定的摄影效果或充分利用扫描仪设备的功能。有关该信息,请查阅文本中引用的应用程序主页以及硬件随附的制造商信息。

最后,本文档不回答 “我应该购买哪种类型的扫描仪?” 这个问题。答案因您对扫描仪设备的需求而异。我建议查看 第 2 节 中的受支持硬件列表链接以及 SANE 项目 FAQ 中的 此链接


1.1. 版权信息

本文档版权归 2004 Howard Shane 所有。

在 GNU 自由文档许可证 1.2 版或自由软件基金会发布的任何更高版本的条款下,允许复制、分发和/或修改本文档,无需不变部分,无需封面文本,也无需封底文本。许可证副本可以在第 8 节中找到。


1.2. 免责声明

对于本文档的内容,不承担任何责任。使用本文档中的概念、示例和其他内容,风险完全由您自行承担。由于这是新版本,可能存在技术或其他不准确之处,可能导致系统故障、硬件损坏和不可替代的数据丢失。请谨慎操作,并注意,尽管不太可能发生错误,但作者对这些错误不承担任何责任。

所有版权均归其各自所有者所有,除非另有特别说明。在本文档中使用术语不应被视为影响任何商标或服务标志的有效性。

对特定产品或品牌的命名不应被视为认可。


1.3. 新版本

这是初始版本。

本文档的最新版本可以在此处找到。


1.4. 致谢

我要感谢 Oliver Rauch、Henning Meier-Geinitz、Jonathan Buzzard、Laurent-jan、Jochen Eisinger 以及其他参与 SANE 开发和/或为 SANE-devel 邮件列表做出贡献的人,没有他们的投入,这个项目即使不是不可能,也很难以任何质量控制措施来执行。我还要感谢许多花时间给我发邮件提供新信息和更正的个人。

此外,我要感谢 Marla 宽容地容忍我花费所有时间敲击键盘进行此类项目的工作。你太棒了。


1.5. 反馈

请将与本文档相关的任何添加或评论发送至以下电子邮件地址。由于这是第一个版本,我特别关注任何勘误,因此如果您知道我有任何错误或需要更新的地方,请随时与我联系。如果您知道任何可能帮助不幸用户的快捷方式、工具或信息,并且您认为应该包含在内,也请告诉我。我提前道歉,但我无法回答任何技术问题或关于扫描仪的 “请帮帮我” 请求;任何发送给我的邮件都将被转发到/dev/null;有关包括实时帮助在内的帮助来源,请参阅第 7.5 节,但仅在完整阅读本文档的相关章节之后。我既不是扫描仪专家,也没有每种型号的扫描仪可供测试。我对 Linux 中扫描仪支持的唯一贡献是汇编我自己有限的经验,并结合其他人的详尽输入,以制作一个简洁但(希望)直截了当的 HOWTO。


1.6. 本文档中使用的约定

本文档中使用了以下约定,并在此处概述,供那些可能尚未完全了解如何在 Linux 中访问和控制底层操作系统的人使用,这几乎总是通过 Bash shell。

首先,文件名在段落中像这样引用/path/file

Linux 中的命令在命令提示符下执行(或“调用”),也称为“命令行”。如果您在非图形(基于文本的)环境中,您通常会看到 Bash shell 提示符,这是一个美元符号

$
...或井号
#
...如果您以 root 身份登录或已获得 root 或“超级用户”权限。您也可以在 X 窗口系统(也称为 X 或 X11)中使用 xterm 或类似的 X 终端模拟器访问 Bash shell。要在 Bash 提示符下执行但在本文档的段落中引用的命令通常如下所示:do this now

命令和/或命令的结果输出也可以在其自己的段落或标题中用屏幕输出概述

$ date
Sun Jul 27 22:37:11 CDT 2003

当命令写在 Bash 提示符前面时(例如,上面的 $ date),则假定在命令之后按下了 [Return] 或 [Enter] 键,可能后跟输出(例如,日期)。


2. 通用支持和接口类型

本文档讨论了四种主要的扫描仪接口类型:SCSI、USB、并行端口、IEEE 1394。正如 SANE 项目所率先提出的,Linux 支持大多数扫描仪。这与 TWAIN 不同,如果您在另一个操作系统(例如 Microsoft Windows™)下使用过扫描仪设备,您可能对此很熟悉。后一种协议以一种不允许在专有图形环境之外使用的方式将驱动程序和用户界面结合在一起。因此,SANE 或 Scanner Access Now Easy,是为了在 Un*x 环境下使用而构思的(但绝不仅限于此)。SANE 标准允许驱动程序满足应用程序的模块化,并允许更大的灵活性和可移植性。使用 SANE,您可以使用命令行扫描设备,您可以设计自己的前端应用程序来使用 SANE 后端,通过网络访问扫描仪,甚至访问相机和其他 video4linux 设备以获取照片。因此,SANE 是 SANE,而 TWAIN 则不是。

注意:在继续阅读之前,您应该查看 SANE 主页 http://www.sane-project.org/sane-mfgs.html,以查看您的扫描仪设备是否受支持。或者,您可以使用SANE 受支持扫描仪搜索引擎

如果您有集成设备,即具有扫描仪、打印机和/或传真功能的设备,您可以按照以下步骤操作扫描仪功能,使用适当的接口,就像标准扫描仪一样。拥有 HP officejet 的用户应查阅 HP Officejet Linux 驱动程序项目站点, 其中详细介绍了如何在 Linux 中使此集成设备的各种功能正常工作。


2.1. SCSI 扫描仪

这些扫描仪由 SCSI 控制器管理。一般来说,假设支持 SCSI 硬件,则几乎任何使用 SCSI 接口的扫描仪都应该可以工作。如果您不确定是否支持 SCSI 控制器,则应查看 硬件 HOWTO 的 SCSI 控制器列表。如果您的 SCSI 控制器与扫描仪捆绑在一起,则您的硬件可能不受支持或仅部分受支持,因为随附的 SCSI 卡可能无法作为完整的 SCSI 控制器运行。

如果在配置 SCSI 扫描仪时遇到任何困难,您应该查阅 man sane-scsi


2.2. USB 扫描仪

您可能已经知道通用串行总线 (USB) 连接器的外观以及插入位置。如果您有 USB 扫描仪,则您的硬件很可能在 Linux 中受支持。有关启用 USB 子系统和 USB 扫描仪支持的信息,请参见 第 2.5 节


2.3. 并行端口扫描仪

如果存在支持并行端口扫描仪的后端,则总体而言,可以使并行端口扫描仪工作,但是如果您的设备也具有 USB 端口(现在发布的大多数新扫描仪都具有 USB 端口)和可用的 USB 后端,则强烈建议您改用 USB,因为它可能更容易配置。

如果您的型号仅具有并行端口接口和专有或非标准控制器,则您可能运气不佳。如果您发现并行端口扫描仪接口有受支持的后端,则应参见 第 2.8 节


2.4. IEEE 1394 (Firewire™, i.Link™)

截至撰写本文时,某些 IEEE 1394 扫描仪受到支持,特别是 Nikon 和 Epson 制造的扫描仪。自 2.4 系列 Linux 内核以来,IEEE 1394 接口已受到支持。IEEE 1394 扫描仪需要您的系统配备 IEEE 1394 PCI 卡或主板 IEEE 1394 端口,并且在内核中或作为加载模块启用 IEEE 1394 支持。您应该查看 第 2 节中按制造商链接的 SANE 受支持设备,并阅读硬件旁边的手册页(如果有),以了解与您的特定硬件相关的任何问题。


2.5. 操作系统支持

如果您没有 USB 扫描仪,则应跳至 第 2.7 节,如果您的设备是并行端口类型,则应转到 第 2.8 节


2.6. USB 扫描仪和 Libusb

本节曾经的标题是 “USB 扫描仪内核支持”,但是 libusb 的出现有望使 USB 扫描仪启用内核变得不必要。Libusb 是一个创建用户空间(即非内核)库的项目,用于访问 USB 设备,而与操作系统无关。有关这些差异的更多信息,请查阅 man sane-usb

如果您更喜欢对 USB 扫描仪的更传统的内核支持,请继续 第 2.7.2 节,但请注意,在内核版本 2.6.0 及更高版本中,内核对 USB 扫描仪设备的支持已删除,转而支持 libusb。此时,大多数发行版都在其稳定分支中提供 libusb(有些默认安装),因此如果您尚不具有内核对 USB 扫描仪设备的支持,则可能只需要安装 libusb 软件包即可访问设备。您必须在内核中启用 USB 设备文件系统支持,大多数发行版都这样做。要确定,请在命令行中发出以下命令

$ cat /proc/filesystems

您应该看到(其中包括)

nodev   usbdevfs
nodev   usbfs

您可能需要挂载 usbdevfs 才能启用它并查看设备文件,您可以使用 mount -t usbdevfs none /proc/bus/usb 在命令行中执行此操作。在内核扫描仪支持静态启用或模块加载的情况下,请勿尝试使用 libusb;您一次只能使用一个。

您可以从以下位置获取 libusb 软件包.rpm, .tgz.deb格式从您的 Linux 发行版中获取。如果您计划从源代码编译自己的 SANE 二进制文件并启用 libusb 支持,则还需要libusb-dev软件包。


2.7. Linux 内核对扫描仪设备的支持

SCSI、USB 和并行端口通用接口支持以及 USB 扫描仪支持(如果不使用 libusb)都需要内核支持。您的库存内核可能已经支持您需要的功能,判断方法是使用 dmesg 命令并查找确认驱动程序在启动时已加载的确认信息。如果您没有看到它,则驱动程序可能作为模块存在(但不一定已加载)。要确定,您可以在命令行中键入以下内容

 $  ls -R /lib/modules/X.XX/kernel/drivers 

其中“X.XX”是您的内核版本号。以下输出是在启用 USB 扫描仪的内核中可以找到的示例(尽管为了简洁起见,已编辑了除相关行以外的所有行)

./usb:
scanner.o
usbcore.o

(给新手的提示:如果 dmesg 或上面的模块列表中的信息滚动太快,您可以尝试将输出管道传输到“less”(如果您没有 less,则使用“more”):ls -R /lib/modules/X.XX/kernel/drivers | less 或或者将其捕获到文件中:ls -R /lib/modules/X.XX/kernel/drivers > file.txt,其中“file.txt”将包含可以使用 cat [file] | less 访问的信息。)

以下信息根据扫描仪接口类型排列。如果您的内核不包含必要的支持,您可以随时重新编译内核。如果您不熟悉编译自己的内核的过程,我建议您查阅 Kernel HOWTO 以获取更多信息。


2.7.1. 内核 SCSI 支持

如果您具有 SCSI 类型接口,则在调用 make configmake menuconfigmake xconfig 等时,请注意,除了支持特定 SCSI 适配器的选项外,还需要通用 SCSI 设备支持。此类通用设备通常命名为 /dev/sg0, /dev/sg1.... 由于您可能已经从 受支持的 SCSI 控制器列表中知道是否支持您的卡,因此在确认您的内核支持您的硬件和通用 SCSI 设备之后,唯一需要做的就是加载适当的模块

# modprobe CARD_MODULE_NAME

# modprobe sg

...以 root 身份。请注意,有报告称 ide-scsi 仿真支持(用于 ATAPI-eide CDRW 支持)会导致扫描仪访问出现问题;如果您知道您的硬件受支持并且您无法使其工作,请尝试卸载 ide-scsi 模块

rmmod ide-scsi

...但有人向我报告称,这在最近的 (2.4.20+) 内核中已得到修复。


2.7.2. 内核 USB 和 USB 扫描仪支持

对于 USB 扫描仪支持,您需要在内核中具有 USB 子系统支持,无论是 usb-ohci、usb-ehci 还是您的系统首选的任何 USB 驱动程序协议。自 2.2 系列后期以来,Linux 内核中就已存在 USB 支持。有关 USB 支持的更深入讨论,请查阅 linux-usb 项目站点。如果您有 2.4 系列或更早版本的内核,并且希望使用内核 USB 扫描仪支持来访问扫描仪(而不是 第 2.6 节 中概述的 libusb),则需要启用“USB 扫描仪支持”,如果存在,则在 dmesglsmod 中可见(如果已加载模块)。如果您想知道加载了哪些模块,请在命令行或 xterm 中键入以下内容

# lsmod

如上面的提示所示,您需要具有 root 权限才能执行此操作。您应该获得包括(但不限于)以下内容的输出

cdrom                  29312   0  (autoclean) [sr_mod]
usb-ohci               17888   0  (unused)
usbcore                56768   0  [scanner ibmcam usbvideo usb-ohci]
scanner                 8704   0 

如果您没有scanner已加载,并且您知道您的内核中具有作为模块的 USB 扫描仪支持,请尝试直接加载它

# modprobe -v scanner

...此时您应该看到类似以下内容

Using /lib/modules/2.4.20/kernel/drivers/usb/scanner.o

通过将条目scanner放在/etc/modules(请注意,这因发行版而异),您可以使模块在启动时自动加载。然后,您可以通过检查 syslog 或在启动时记录中使用 dmesg | less 来确认模块已加载),您应该看到类似以下内容的条目

May 16 23:17:25 K7 kernel: usb.c: registered new driver usbscanner
May 16 23:17:25 K7 kernel: scanner.c: 0.4.6:USB Scanner Driver


2.8. 并行端口扫描仪

到现在为止,您可能已经弄清楚并行端口扫描仪的配置可能存在问题。同样,如果您的设备同时具有并行端口接口和 USB 接口,则应考虑选择 USB 以简化设置过程。


2.8.1. 内核 Parport 支持

对于 2.2 和 2.4 内核系统,必须静态或作为模块启用并行端口支持(库存内核通常默认启用此支持)。在开始此过程之前,您可能需要阅读 有关 Linux 内核下并行端口设备支持的更多通用信息。要确定是否加载了模块parport您可以检查dmesg文件或使用上面概述的 lsmod 。使用 dmesg | less 您应该看到(在许多其他行中)以下内容

Mar  3 08:00:25 K7 kernel: parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE]
Mar  3 08:00:25 K7 kernel: parport0: irq 7 detected

如果您正在编译自己的内核,请启用“并行端口支持”。您应该启用“IEEE 1284 传输模式”,并且如果您具有 x86 类型架构,则还应该启用“PC 风格硬件”。

如果在尝试加载模块时 modprobe 返回错误,请注意,您可能需要在调用 modprobe 时确定并提供硬件地址。对于 x86 系统,最常见的地址是 0x378;0x278 和 0x3BC 是集成或 ISA 并行端口的其他可能性。附加 PCI 并行端口可能具有不寻常的基地址。也可以使用 parport_pc 或 parport_arc 模块排列多个设备,尽管该主题超出了本文档的范围。警告:在命令行中输入此信息之前,请确保您具有正确的地址,否则您的机器可能会变得不稳定、崩溃或以其他方式内爆。

您的并行端口应设置为首选 “EPP” 模式,或备选 ECP/EPP。“双向”(也称为 “BPP”“PS/2”)可能有效,但速度要慢得多。“单向” 模式不适合扫描。至少在 x86 系统上,通常可以通过 BIOS 菜单访问上述设置。

根据您的并行端口扫描仪是否需要 SCSI 支持,您可能需要修补内核以获得 parport-SCSI 支持。您可以在 www.torque.net/parport/ppscsi.html 找到该套工具。如果需要这样做,您还需要启用以下功能

  • SCSI 支持

  • SCSI 通用支持

  • 对 ppSCSI 控制器核心模块的支持(APA-348 和 T348 的 t348,APA-358 和 T358 的 t358,较旧的 Shuttle EPSA-2 的 epsa2,Shuttle EPST 和 APA-1350 的 epst,OnSpec 90c26 的 onscsi 以及 SparCSI 和 ParaSCSI 的 sparcsi)

一旦编译完成,就只需加载适当的模块即可。


3. 创建和访问扫描仪设备

以下部分适用于所有硬件类型。本节末尾的段落中提到了有关扫描仪接口类型的一些具体信息。


3.1. 设备文件系统和 Udev

Devfs 或“设备文件系统”自 2.2 系列后期以来一直是 Linux 内核中的一个选项。设备文件系统守护程序 Devfsd 在您的系统上动态创建和删除设备,而无需手动创建设备。如果您正在运行 devfsd/devfs,则可能可以跳过以下部分,因为设备节点的创建过程将为您完成,而只需在/dev.

中找到相应的设备节点即可。Devfs 并未消除更改设备权限以供用户访问的需求。

从 2.6 系列内核开始,devfs 已被弃用,转而支持称为 udev 的用户空间守护程序,尽管 devfs 仍然是一个选项。您可以在此处找到有关 udev 的信息。


3.2. 手动创建设备

如果您正在运行配置正确的 devfs、udev 或 libusb 系统,则可以跳过此步骤并转到 第 4 节。有两种方法可以手动完成必要设备的创建。一种是使用 MAKEDEV,另一种是在命令行中创建设备节点。

MAKEDEV 脚本是两种方法中较简单的一种,其可执行文件可能位于/dev或用于存储二进制可执行文件的常用位置(/bin,/sbin等等)。我建议您查阅 man MAKEDEV,并提醒您注意特定于设备的命令选项,以便您可以确保主次编号正确(有关此内容的更多信息以及为什么它很重要,请参阅下一段,特别是如果 MAKEDEV 不起作用或者您喜欢以困难的方式做事)。

设备可以创建为块设备(例如驱动器)、fifo(先进先出文件或管道,如 xconsole)或字符设备,字符设备代表其他硬件。每个设备都有一个主编号和一个次编号 “坐标”,以告知内核它是什么以及在哪里访问它。这些数字不是任意的。


3.2.1. SCSI 设备

如果您正在运行 2.4 系列内核,则应考虑熟悉 SCSI proc 接口访问,并且无论您运行的是哪个内核,都应在继续阅读之前阅读 man sane-scsi。当系统启动时,通用 SCSI 设备文件会映射到/dev/sgN,其中 N 是从零开始的数值。SCSI 设备的主次编号分别为 21 和 0,1,2,3...。您可以使用 ls -l /dev/sg* 找出已加载的设备,这将产生类似于此的输出

crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg0
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg1
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg2
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg3
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg4
crw-------   1 root   sys     21,  0 Jan 06  2003 /dev/sg5

您需要创建一个/dev/scanner到现有设备的符号链接(原因稍后说明)。例如,如果您的扫描仪连接到 SCSI 主机设备的第一个 scsi 总线(以及 lun 和 target),则应将其链接到相应的设备

#  ln -s /dev/sg0 /dev/scanner


3.2.2. 手动创建 USB 设备

同样,如果使用 libusb,则可以跳过此步骤。USB 扫描仪设备的主编号为 180,次编号为 48、49 等,最多为 63。首先,检查/dev以查看您的发行版将其 USB 目录设备布置在哪个目录中,因为某些发行版可能在scanner0, scanner1...等设备/dev/usb中或作为usbscanner0, usbscanner1...等等,在基本/dev/目录中。如果您在/dev/目录中发现扫描仪设备已经为您创建,那么您的工作就完成了。否则,您需要自己创建它们。以 root 身份,为您的扫描仪创建一个字符设备,如下所示

# mknod /dev/usbscanner0 c 180 48

...或者,如果您的发行版具有“/dev/usb”子目录

# mknod /dev/usb/scanner0 c 180 48


3.2.3. 手动创建并行端口设备

按照上一节中概述的示例创建以下通用并行端口设备

crw-------    1 root     root      99,   0 Jun 24 13:47 parport0
crw-------    1 root     root      99,   1 Jun 24 13:47 parport1
crw-------    1 root     root      99,   2 Jun 24 13:47 parport2
crw-------    1 root     root      99,   3 Jun 24 13:47 parport3
crw-r-----    1 root     root       1,   4 Jan  1  1970 port

您可能还需要创建/dev/port和/或/dev/parport具体取决于您将使用的后端,因此如果您的应用程序需要,请准备好返回此步骤。


3.3. 组和权限

确保您的用户帐户在所有模块加载且设备节点创建后可以访问设备是一个好主意。最注重安全性的方法是将扫描仪访问权限添加到特定组。在我的系统上,“scanner”组的成员被允许使用扫描仪。实现此目的的方法是首先更改/dev中设备的所有权,如下所示(以 root 身份)

# chown root.scanner /dev/usb/scanner*

...其中 root.scanner 是设备现在将属于的所有者和组。显然,具体命令会因您的系统和设备类型而异,无论是/dev/sg*在 SCSI 扫描仪上等等。重要的是,您要更改设备节点本身的所有权,而不是符号链接;符号链接的所有权仅受更改它们指向的父设备或文件的影响。

要查看您的用户帐户是否是相关组的成员,请以 root 身份发出以下命令:grep -e scanner /etc/group。您应该看到类似以下内容

scanner:x:103:

...其中“103”是组号。由于“scanner”组中最后一个冒号后没有成员,我们可以添加它们,例如用户“jhs”,使用命令

# adduser jhs scanner 

之后,只需允许相关用户对设备进行读写访问,如下所示

# chmod g+rw /dev/usb/scanner0

...其中 g+rw 表示为g组添加r读取和w写入访问权限。有关更多信息,请参阅 chmod 的文档(man chmodinfo chmod)。


4. SANE

扫描仪访问的最后一个先决条件是 SANE 后端和可选的合适的 SANE 前端。前者是驱动程序和底层访问工具,用于与扫描仪接口,后者是用于在 X 中访问和使用扫描仪的图形应用程序。只有前者是扫描仪访问所必需的,尽管强烈建议使用前端以便操作图像并实际能够在窗口环境中查看图像,而无需打印它们。


4.1. 获取 SANE

您可以在 http://www.sane-project.org/source.html 获取 SANE 后端套件,您可以在那里获得几乎所有 Linux 发行版的二进制文件以及源代码。如果您计划从源代码编译,您可能已经知道该怎么做,但是对于那些想要复习的人,可以使用以下链接:软件构建 HOWTO。此外,请确保在安装新编译的版本之前删除以前的 sane 安装,并且您应该获取最新发布的稳定版本的源代码进行编译。

希望安装二进制文件的用户应下载相应的文件,然后像往常一样安装,即对于基于 rpm 的发行版

# rpm -iVh sane-backends-VERSION.rpm

对于 Debian 用户,在 stable (Woody)、testing (Sarge) 和 unstable (Sid) 软件包存储库中都有 SANE 软件包,因此,无论您使用哪个版本,只需简单的 apt-get install sane 即可。

喜欢从源代码编译最新版本的 SANE 的用户可以从 ftp.mostang.com/pub/sane 获取它。在 Laurent-jan 的 HOWTO 页面(最初由 Steve Sheriff 编写) 中,更深入地(尽管有些悲观地)介绍了如何从头开始编译 SANE 并使 SCSI 扫描仪工作(图形也很有趣)。


4.2. 配置 SANE

4.2.1. SANE 后端

无论您是获得了发行版的官方 SANE 软件包,还是从 SANE 主页获得了二进制文件,还是从源代码编译了自己的 SANE 二进制文件,当您调用 scanimage 或任何其他前端时,SANE 都应该识别出适合您硬件的后端。如果在运行 scanimage -L 或您选择的前端时未找到设备,请参阅 第 7 节 以获取更多信息。


4.2.2. 跨网络

如果您有兴趣通过网络从远程计算机或向远程计算机提供扫描仪服务,则需要在服务器(带有扫描仪的计算机)的配置目录中编辑saned.conf文件,无论是/etc/sane.d/usr/local/etc/sane.d。它通常包含一个条目“scan-client.somedomain.firm”,需要将其替换为您希望能够使用服务器扫描仪的客户端的主机名。如果您更喜欢 IP 地址,也可以使用它。

saned 守护程序以及服务器上的 inetd 或 xined 都需要运行。有关 inetd.conf 或 xined.conf 所需的确切更改,请参阅 man saned。此外,端口 6566 需要添加到/etc/services文件中

sane 6566/tcp 

客户端计算机(没有扫描仪)将需要编辑 net.conf 以包含服务器机器名称,即“scan-server.somedomain.firm”。

另外,对于客户端,请确保 “net” 条目未在dll.conf文件中注释掉。


4.2.3. 将 SANE 与 Video4linux 设备一起使用

Video4linux 设备包括网络摄像头、静止相机和视频捕获设备。SANE 能够访问这些设备。为此,请在配置目录(/etc/sane.d/usr/local/etc/sane.d)中找到名为v4l.conf的文件。打开此文件会产生类似于以下内容的内容

# In order to use the v4linux backend you have to give the device
# You can enable multiple lines if
# you really have multible [sic] v4l devices.
#
/dev/bttv0
/dev/video0
/dev/video1
/dev/video2
/dev/video3

此文件的初始行实际上告诉您所有您需要知道的内容,因此请记住这一点,当我们进入有关测试扫描仪硬件的部分时。只需确保您的内核将您的相机或其他 v4l 设备识别为的任何设备都已取消注释(即,已从上面的 # 中删除)。您显然需要以 root 身份执行此操作。此外,请确保“v4l”行未在dll.conf文件中注释掉。


5. 测试扫描仪

完成上述所有操作后,您就可以测试扫描仪设备了。本节假设您的扫描仪已打开并通过适当的接口连接。如果您有 SCSI 或 USB 扫描仪,则可以在命令行中发出以下命令

$ sane-find-scanner

...应该从可能的设备列表中查找并识别您的扫描仪。(Debian 用户请注意:从 Sarge 或 unstable 版本开始,'sane-utils' 软件包中提供了 sane-find-scanner。在 Woody 版本中,它在 'libsane' 软件包中提供。)如果您的扫描仪类型不在 sane-find-scanner 的查找范围内,您可以尝试以 root 身份运行 scanimage --list-devices,它应该会产生有关连接设备的信息。例如,这是我的系统上的输出

device `v4l:/dev/video0' is a Noname BT878 video (Hauppauge (bt878)) virtual device
device `epson:/dev/scanner0' is a Epson Perfection1240 flatbed scanner
然而,当使用 libusb 时,它注册为
device `v4l:/dev/video0' is a Noname BT878 video (Hauppauge (bt878)) virtual device
device `epson:libusb:001:003' is a Epson Perfection1240 flatbed scanner
记下获得的 'backend:device' 信息;这将是我们的设备名称,用于从命令行专门访问扫描仪。另请注意,sane-find-scanner 是一个独立的实用程序,它不保证 SANE 下的支持,它只查找声称是扫描仪的设备。

接下来,您应该测试扫描仪的图像采集能力。您可以使用 第 6 节 中列出的任何前端,或者如果您愿意,也可以使用以下命令行

$ scanimage -d backend:/dev/scanner --format pnm > outfile.pnm

因此,如果您使用 Epson 后端,例如,命令将如下所示

$ scanimage -d epson:/dev/scanner --format pnm > outfile.pnm

如果您有多个扫描仪并想选择要使用的扫描仪,则只需要 -d 选项。例如,如果您有一个 Epson 和一个 Mustek 扫描仪,使用 "-d epson" 或 "-d mustek" 应该就足够了。只有当您有多个由同一后端支持的扫描仪时,才需要完整路径。显然,/dev/scanner 应该替换为您配置的任何扫描仪设备(例如,/dev/video0对于 v4l 设备,以及 sane-find-scanner 示例中看到的 libusb)。--format 开关可以是 pnm 或 tiff,但如果省略,则默认为 pnm。有关更晦涩但有用的选项,请参阅 man scanimage.pnm 格式代表“portable anymap”(便携式位图),这是一种 Linux 中常见的图形文件图像格式,可以使用 Imagemagicknetpbm 转换为几乎任何其他图像格式。


6. SANE 前端

现在您已经使硬件正常工作,如果您计划在 X11 中使用扫描仪设备(这可能是查看您扫描内容的好主意),您可能应该获取一个合适的前端。我个人最喜欢的是 xsane,它与我见过的任何专有解决方案一样优雅且实用。它具有基于 GTK+ 的吸引人的 GUI,可以将图像保存为各种格式,将图像发送到打印机,并轻松与 GIMP 交互。它可以轻松访问您硬件的完整色彩和其他潜力。

GIMP,或 GNU 图像处理程序,如果您有兴趣从类似 Photoshop™ 的应用程序中进行扫描,那么它是一个出色的图像编辑应用程序。xsane 模块可能作为单独的软件包提供,具体取决于您的 Linux 发行版。启动 GIMP 后,单击“文件”,然后单击“获取”,再单击“Xsane:device dialog”以访问您的扫描仪。

另一个强烈推荐的前端是 Kooka,它属于 KDE 桌面环境。它具有直观的界面,可以轻松与其他 KDE 应用程序集成,并可以大大简化大型图像集合的管理。

Xscanimage 是一个稍微简单(但仍然强大)的 X11 扫描仪应用程序,用于从您的扫描仪获取图像。它可能随 SANE 后端捆绑提供,也可能不捆绑提供,具体取决于您的发行版。有关更多信息,请参阅 man xscanimage

您可以在 SANE 前端页面 找到更完整 SANE 前端列表。


7. 故障排除

7.1. 帮助,scanimage 或 xsane 找不到我的扫描仪!

首先,不要绝望。如果您确定到目前为止您已正确完成所有操作,所有正确的模块都已加载,并且所有配置文件都已按照概述进行调整,并且您知道您的硬件受支持,请检查您的权限。为了访问扫描仪硬件,您必须具有读取和写入权限。有关更多信息,请参阅 第 3.3 节。如果这不是问题,请转到/etc/sane.d/(或/usr/local/etc/sane.d)并编辑文件dll.conf,注释掉您不需要的任何后端或其他(即 v4l)协议。

如果以上方法均无效,请在包含 SANE 配置文件的目录中,打开以您的特定扫描仪后端命名的文件。该文件中有(除其他外)两个重要的条目:接口类型(scsi 与 usb)和设备名称。如果您有 usb 扫描仪,您通常需要注释掉(在前面加上 # 标记)“scsi”行,并取消注释包含“usb”的行。此外,设备名称可能需要更改,具体取决于您的发行版(即,/dev/usbscanner0可能变为/dev/usb/usbscanner0)。您可能已经注意到,此文件中可能还有其他几个选项可用于您的扫描仪,具体取决于型号,因此如果您的扫描仪未按计划运行,您可能需要查看此文件以及随附的特定型号文档(如果有);请参阅 man sane-scsisane-usb,或任何扫描仪制造商(包括 sane-plusteksane-qcamsane-ricohsane-sharpsane-snapscansane-umax 等)。要获取完整列表,请尝试 apropos sane。可用的确切协议和制造商可能取决于您的 SANE 版本。

如果以上方法均无效,请参阅 第 7.5 节。此外,如果您特别大胆,您应该查看 sane-troubleshoot 首页,在撰写本文时,该页面仍处于早期开发阶段。


7.2. 帮助,我不确定我的 USB 硬件是否正常工作!

假设您有 usbdevfs 和 /proc 文件系统支持,您应该发出以下命令:cat /proc/bus/usb/devices。它应该为您提供 USB 总线状态和连接设备的输出,并对您的硬件进行故障排除。如果您的扫描仪受支持并且您可以看到您的硬件,您就会知道您的问题出在其他地方。


7.3. 帮助,scanimage 或我正在使用的前端识别了错误的设备!

首先,找到您的配置文件,这些文件位于常用位置之一/etc/sane.d/usr/local/etc/sane.d。一般来说,如果您从您的发行版或 SANE 首页获得了预编译的软件包或二进制文件,则它位于/etc,而如果您从源代码编译它,则它位于/usr/local/etc/sane.d。更改 (cd) 到该特定目录。在 第 2 节 中,您被引导到 SANE 支持和尚未支持的硬件列表。在那里,您将在各个制造商的图表中找到 “后端” 或每个型号的 SANE 驱动程序以及支持状态。在/etc/sane.d/usr/local/etc/sane.d中,每个后端都有类似命名的文件。您应该选择名为dll.conf的文件。这将逐个列出后端协议。检查以确保您的扫描仪后端未被注释掉(即,前面没有井号标记)。如果是,您将需要(以 root 身份并使用您的编辑器程序)删除“#.”。如果您仍然无法使其工作,请参阅 第 7.5 节


7.4. 帮助,我只能以 root 身份访问我的并行端口扫描仪!

您的扫描仪的 SANE 驱动程序直接访问并行端口(通过/dev/port)。出于安全原因,这仅适用于 root 用户。有关如何解决此问题的说明,请参阅 Till Kamppeter 的 此迷你 HOWTO


7.5. 帮助,我有一个 Acme Whizzbang™ 或其他型号的扫描仪,但您没有解决我的特定问题!

请访问 SANE 网站上的 邮件列表和 IRC 频道。查看链接以获取有关如何订阅等的说明。此外,您应该阅读 SANE FAQ,其中包含几个特定于硬件的问题、答案以及相关文档的链接。


8. GNU 自由文档许可证

版本 1.2,2002 年 11 月

版权所有 (C) 2000,2001,2002 自由软件基金会有限公司,地址:59 Temple Place, Suite 330, Boston, MA 02111-1307 USA。 任何人均被允许复制和分发本许可证文件的完整副本,但不允许更改它。

0. 序言

本许可证的目的是使手册、教科书或其他功能性和有用的文档在自由的意义上“自由”:确保每个人都拥有有效自由地复制和重新分发它,无论是否进行修改,无论是商业用途还是非商业用途。其次,本许可证为作者和出版商保留了一种为其工作获得认可的方式,同时不被视为对他人所做的修改负责。

本许可证是一种“反版权”(copyleft),这意味着文档的衍生作品本身必须在相同的意义上是自由的。它补充了 GNU 通用公共许可证,后者是为自由软件设计的反版权许可证。

我们设计本许可证是为了将其用于自由软件的手册,因为自由软件需要自由文档:自由程序应附带提供与软件相同自由的手册。但是,本许可证不限于软件手册;它可以用于任何文本作品,无论主题 matter 或是否以印刷书籍形式出版。我们主要为目的为指导或参考的作品推荐本许可证。

1. 适用性和定义

本许可证适用于任何手册或其他作品,以任何媒介形式,其中包含版权持有者放置的声明,说明它可以根据本许可证的条款分发。此类声明授予全球范围内的、免版税的、无限期的许可证,以按照本文规定的条件使用该作品。“文档”(Document),下文指任何此类手册或作品。任何公众成员都是被许可人,并被称为“您”。如果您以需要版权法许可的方式复制、修改或分发作品,则您接受本许可证。

文档的“修改版本”(Modified Version)是指包含文档或其一部分的任何作品,无论是逐字复制,还是经过修改和/或翻译成另一种语言。

“次要章节”(Secondary Section)是文档的命名附录或前言部分,专门处理文档的出版商或作者与文档的整体主题(或相关 matter)的关系,并且不包含任何可以直接归入该整体主题的内容。(因此,如果文档部分是数学教科书,则次要章节不得解释任何数学。)这种关系可能是与主题或相关 matter 的历史联系,或者是关于它们的法律、商业、哲学、伦理或政治立场。

“不变章节”(Invariant Sections)是某些次要章节,其标题在声明文档根据本许可证发布的声明中被指定为不变章节的标题。如果章节不符合上述次要章节的定义,则不允许将其指定为不变章节。文档可能包含零个不变章节。如果文档未标识任何不变章节,则不存在不变章节。

“封面文本”(Cover Texts)是在声明文档根据本许可证发布的声明中被列为封面文本或封底文本的某些简短文本段落。封面文本最多可以有 5 个单词,封底文本最多可以有 25 个单词。

文档的“透明”(Transparent)副本是指机器可读副本,以其规范对公众开放的格式表示,适用于使用通用文本编辑器(对于由像素组成的图像,则使用通用绘画程序,对于绘图,则使用一些广泛可用的绘图编辑器)直接修改文档,并且适用于输入到文本格式化程序或自动翻译成各种适用于输入到文本格式化程序的格式。以其他透明文件格式制作的副本,其标记或缺少标记旨在阻止或阻止读者后续修改,则不是透明的。如果用于大量文本,则图像格式不是透明的。不是“透明”的副本称为“不透明”(Opaque)。

透明副本的合适格式示例包括没有标记的纯 ASCII、Texinfo 输入格式、LaTeX 输入格式、使用公开可用的 DTD 的 SGML 或 XML,以及符合标准的简单 HTML、PostScript 或 PDF,专为人工修改而设计。透明图像格式的示例包括 PNG、XCF 和 JPG。不透明格式包括专有格式,这些格式只能由专有文字处理器读取和编辑,DTD 和/或处理工具通常不可用的 SGML 或 XML,以及某些文字处理器仅为输出目的而生成的机器生成的 HTML、PostScript 或 PDF。

“标题页”(Title Page)对于印刷书籍,是指标题页本身,以及容纳本许可证要求出现在标题页中的材料所需要的后续页面,并且清晰可辨。对于没有标题页格式的作品,“标题页”是指最突出显示作品标题附近的文本,位于正文文本的开头之前。

“标题为 XYZ 的章节”(Section "Entitled XYZ")是指文档的命名子单元,其标题要么精确地是 XYZ,要么包含 XYZ,并在括号中跟随以另一种语言翻译 XYZ 的文本。(此处 XYZ 代表下面提到的特定章节名称,例如“致谢”、“献词”、“认可”或“历史”)。当您修改文档时,“保留标题为 XYZ 的章节”(Preserve the Title of such a section)是指它仍然是根据此定义“标题为 XYZ 的章节”。

文档可能在声明本许可证适用于文档的声明旁边包含保证免责声明。这些保证免责声明被视为通过引用包含在本许可证中,但仅限于免责声明保证:这些保证免责声明可能具有的任何其他含义均无效,并且对本许可证的含义没有任何影响。

2. 逐字复制

您可以以任何媒介形式复制和分发文档,无论是商业用途还是非商业用途,前提是本许可证、版权声明以及说明本许可证适用于文档的许可证声明在所有副本中都得到复制,并且您不得对本许可证的条件添加任何其他条件。您不得使用技术措施来阻碍或控制您制作或分发的副本的阅读或进一步复制。但是,您可以接受报酬以换取副本。如果您分发足够大量的副本,您还必须遵守第 3 节中的条件。

您也可以在上述相同条件下借出副本,并且您可以公开展示副本。

3. 大量复制

如果您出版印刷副本(或通常带有印刷封面的媒体副本)的文档,数量超过 100 份,并且文档的许可证声明要求封面文本,则您必须将副本放在封皮中,封皮上清晰可辨地印有所有这些封面文本:封面上的封面文本和封底上的封底文本。两个封面还必须清晰可辨地标识您为这些副本的出版商。封面必须以相等的突出和可见的方式呈现标题的所有单词的完整标题。您可以在封面上添加其他材料。仅限于封面的更改的复制,只要它们保留文档的标题并满足这些条件,就可以在其他方面被视为逐字复制。

如果任一封面的所需文本过于庞大而无法清晰可辨地放入,您应将首先列出的文本(尽可能多地放入)放在实际封面上,并将其余部分继续放在相邻页面上。

如果您出版或分发超过 100 份的不透明文档副本,您必须在每个不透明副本中包含一个机器可读的透明副本,或者在每个不透明副本中或随附声明一个计算机网络位置,公众可以使用公共标准网络协议从该位置下载文档的完整透明副本,且不包含添加的材料。如果您使用后一种选择,当您开始大量分发不透明副本时,您必须采取合理谨慎的步骤,以确保在您最后一次向公众分发该版本的任何不透明副本(直接或通过您的代理或零售商)后至少一年内,该透明副本将保持在该声明的位置可访问。

请求(但不是必需),在重新分发大量副本之前,您应与文档的作者联系,让他们有机会为您提供文档的更新版本。

4. 修改

您可以根据上述第 2 节和第 3 节的条件复制和分发文档的修改版本,前提是您根据本许可证精确地发布修改版本,修改版本充当文档的角色,从而许可修改版本的副本的所有者分发和修改修改版本。此外,您必须在修改版本中执行以下操作

A. 在标题页(以及封面,如果有)上使用与文档标题不同的标题,以及与以前版本不同的标题(如果以前有版本,则应在文档的历史记录部分中列出)。如果以前版本的原始出版商给予许可,您可以使用与以前版本相同的标题。

B. 在标题页上,列出作为作者的一个或多个人员或实体,他们负责修改版本的修改,以及文档的至少五位主要作者(如果文档的主要作者少于五位,则列出所有主要作者),除非他们免除您的此项要求。

C. 在标题页上声明修改版本的出版商名称,作为出版商。

D. 保留文档的所有版权声明。

E. 在其他版权声明旁边为您所做的修改添加适当的版权声明。

F. 在版权声明之后立即包含许可证声明,允许公众根据本许可证的条款使用修改版本,形式如下面的附录所示。

G. 在该许可证声明中保留文档的许可证声明中给出的不变章节和要求的封面文本的完整列表。

H. 包含本许可证的未更改副本。

I. 保留标题为“历史记录”("History")的章节,保留其标题,并在其中添加一项,至少说明标题页上给出的修改版本的标题、年份、新作者和出版商。如果文档中没有标题为“历史记录”的章节,则创建一个章节,说明标题页上给出的文档的标题、年份、作者和出版商,然后添加一项,描述如前一句所述的修改版本。

J. 保留文档中给出的任何网络位置,以供公众访问文档的透明副本,以及文档中给出的基于先前版本的网络位置。这些可以放在“历史记录”章节中。您可以省略在文档本身之前至少四年发布的 works 的网络位置,或者如果它所引用的版本的原始出版商给予许可。

K. 对于任何标题为“致谢”("Acknowledgements")或“献词”("Dedications")的章节,保留该章节的标题,并保留该章节中给出的每个贡献者致谢和/或献词的全部实质和语气。

L. 保留文档的所有不变章节,在文本和标题中均未更改。章节编号或等效项不被视为章节标题的一部分。

M. 删除任何标题为“认可”("Endorsements")的章节。修改版本中不得包含此类章节。

N. 不要将任何现有章节重新命名为标题为“认可”或与任何不变章节的标题冲突。

O. 保留任何保证免责声明。如果修改版本包含新的前言章节或附录,这些章节或附录符合次要章节的条件并且不包含从文档复制的材料,您可以选择将其中一些或全部章节指定为不变章节。为此,请将它们的标题添加到修改版本的许可证声明中的不变章节列表中。这些标题必须与任何其他章节标题不同。您可以添加标题为“认可”的章节,前提是它仅包含各方对您的修改版本的认可——例如,同行评审声明或文本已被组织批准为标准的权威定义。

您可以添加最多五个单词的一段文字作为封面文本,以及最多 25 个单词的一段文字作为封底文本,添加到修改版本中封面文本列表的末尾。任何一个实体(或通过其安排)只能添加一段封面文本和一段封底文本。如果文档已经包含您先前添加的或由您代表的同一实体安排添加的相同封面的封面文本,您不得添加另一个;但您可以替换旧的,前提是获得添加旧的文本的先前出版商的明确许可。

文档的作者和出版商不通过本许可证授予使用其姓名进行宣传或声明或暗示认可任何修改版本的许可。

5. 合并文档

您可以将文档与根据本许可证发布的其他文档合并,根据上述第 4 节中定义的修改版本的条款,前提是您在组合中包含所有原始文档的所有不变章节,未修改,并在其许可证声明中将它们全部列为组合作品的不变章节,并且您保留它们的所有保证免责声明。

组合作品只需要包含本许可证的一个副本,并且多个相同的不变章节可以用单个副本替换。如果存在多个同名但内容不同的不变章节,请通过在其末尾括号中添加该章节的原始作者或出版商的姓名(如果已知),或者添加唯一编号,使每个此类章节的标题唯一。对组合作品的许可证声明中的不变章节列表中的章节标题进行相同的调整。

在组合中,您必须合并各个原始文档中标题为“历史记录”的任何章节,形成一个标题为“历史记录”的章节;同样合并任何标题为“致谢”的章节,以及任何标题为“献词”的章节。您必须删除所有标题为“认可”的章节。

6. 文档集合

您可以制作一个集合,其中包含文档和根据本许可证发布的其他文档,并将各个文档中的本许可证副本替换为集合中包含的单个副本,前提是您在所有其他方面都遵循本许可证关于逐字复制每个文档的规则。

您可以从这样的集合中提取单个文档,并根据本许可证单独分发它,前提是您在提取的文档中插入本许可证的副本,并在所有其他方面都遵循本许可证关于逐字复制该文档的规定。

7. 与独立作品的聚合

文档或其衍生作品与卷或存储或分发介质上的其他单独且独立的文档或作品的汇编,如果汇编产生的版权不用于限制汇编用户的合法权利超出各个作品允许的范围,则称为“聚合”。当文档包含在聚合中时,本许可证不适用于聚合中不是文档衍生作品的其他作品。

如果第 3 节的封面文本要求适用于文档的这些副本,则如果文档小于整个聚合的一半,则文档的封面文本可以放在括住聚合中文档的封面上,或者如果文档是电子形式,则可以放在封面的电子等效物上。否则,它们必须出现在括住整个聚合的印刷封面上。

8. 翻译

翻译被视为一种修改,因此您可以根据第 4 节的条款分发文档的翻译。用翻译替换不变章节需要其版权持有者的特殊许可,但您可以包含一些或全部不变章节的翻译,以及这些不变章节的原始版本。您可以包含本许可证的翻译,以及文档中的所有许可证声明和任何保证免责声明,前提是您还包含本许可证的原始英文版本以及这些声明和免责声明的原始版本。如果本许可证或声明或免责声明的翻译版本与原始版本之间存在分歧,则以原始版本为准。

如果文档中的章节标题为“致谢”、“献词”或“历史记录”,则保留其标题(第 1 节)的要求(第 4 节)通常需要更改实际标题。

9. 终止

除非本许可证明确规定,否则您不得复制、修改、再许可或分发文档。任何其他复制、修改、再许可或分发文档的尝试均无效,并将自动终止您在本许可证下的权利。但是,根据本许可证从您那里收到副本或权利的各方,只要这些方保持完全合规,其许可证就不会终止。

10. 本许可证的未来修订

自由软件基金会可能会不时发布 GNU 自由文档许可证的新修订版本。此类新版本在精神上将与当前版本相似,但在细节上可能有所不同,以解决新的问题或疑虑。请参阅 https://gnu.ac.cn/copyleft/。

许可证的每个版本都给出了一个区分版本号。如果文档指定本许可证的特定编号版本“或任何后续版本”适用于它,您可以选择遵循该指定版本或自由软件基金会发布的任何后续版本(不是草案)的条款和条件。如果文档未指定本许可证的版本号,您可以选择自由软件基金会发布的任何版本(不是草案)。

附录:如何在您的文档中使用本许可证

要在您编写的文档中使用本许可证,请在文档中包含本许可证的副本,并将以下版权和许可证声明放在标题页之后

版权所有 (c) 年份 您的姓名。 允许根据 GNU 自由文档许可证 1.2 版或自由软件基金会发布的任何后续版本的条款复制、分发和/或修改本文档;不包含不变章节,不包含封面文本,也不包含封底文本。许可证的副本包含在标题为“GNU 自由文档许可证”的章节中。

如果您有不变章节、封面文本和封底文本,请将“with...Texts.”行替换为:不变章节为 列出其标题,封面文本为 列出,封底文本为 列出。如果您有不带封面文本的不变章节,或这三者的其他某种组合,请合并这两个备选项以适应具体情况。

如果您的文档包含程序代码的非平凡示例,我们建议并行地根据您选择的自由软件许可证(例如 GNU 通用公共许可证)发布这些示例,以允许在自由软件中使用它们。