如何为制造商不再支持的打印机编写我自己的打印机驱动程序?

How to write my own printer driver for a printer that is no longer supported by manufacturer?

这个问题几乎已经说明了一切。我基本上想创建一个与我当前的 MacOS (Catalina) 兼容的驱动程序。我面临的问题是我的打印机(带扫描仪)目前只能扫描页面并将其打印出来。我希望能够使用我的扫描仪来保存扫描文档的图像。

老实说,我不确定编写驱动程序是否是执行此操作的最佳方法,但制造商 (Canon) 不再提供适用于此旧扫描仪的驱动程序。但它和我们拿到它的那一天一样好用,所以我真的不想把这个扔掉再买一个新的。

更新:目前遇到以下问题:

rabdelazin@rabdelazim Downloads % device=$(sane-find-scanner | awk '/Canon/{print $NF}')
rabdelazin@rabdelazim Downloads % echo $device                                          
libusb:020:029
rabdelazin@rabdelazim Downloads % scanimage --device Canon:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > ~/Downloads/scan.tiff       
scanimage: open of device Canon:libusb:020:029 failed: Operation not supported

我在 macOS 上有一张 EPSON Perfection 4990 Photo,所以我无法为您的 Canon 提供完整的代码和示例,但它可以帮助您入门。我一生都在终端上度过,而不是使用 GUI 来做任何事情,所以我只是以全分辨率扫描平台的整个区域,然后在必要时使用 ImageMagick 或 Photoshop 做任何我需要的事情。

所以,为了让它继续运行,我从 here 安装了 homebrew。然后我安装了一些包:

brew install libusb
brew install sane-backends

然后我可以通过以下方式找到我的扫描仪:

sane-find-scanner

示例输出

found USB scanner (vendor=0x04b8 [EPSON], product=0x012a [EPSON Scanner]) at libusb:003:002

现在你需要该行的最后一个词,libusb:003:002 部分,对于我的 EPSON,我使用:

sane-find-scanner | awk '/EPSON/{print $NF}'

你需要看到你得到的,并稍微适应。

样本输出

libusb:003:002

因此,为了进行扫描,我将其捕获到名为 devicebash 变量中并执行此操作:

device=$(sane-find-scanner | awk '/EPSON/{print $NF}')

scanimage --device epson:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > ~/Desktop/scan.tif

我把所有内容都放在一个名为 scanbash 脚本中,如下所示:

#/bin/bash

TMP="$HOME/Desktop/scan.tif"

# Find libusb device name
device=$(sane-find-scanner | awk '/EPSON|HP/{print $NF}')
if [ -z $device ]; then
   echo ERROR: Unable to find libusb device
   exit 1
fi
echo Found scanner at: $device

# Now scan full-size, colour, hi res
scanimage --device epson:$device -x 210 -y 297 --mode color --resolution 240 --format=tiff --depth 8 > "$TMP"

# Check we got a file
if [ ! -s "$TMP" ]; then
   echo ERROR: Empty scan
   exit 1
fi

我的脚本在末尾有一些进一步的、可选的、ImageMagick东西来创建一个 Web 可用的 JPEG,如果你添加它,你将需要做:

brew install imagemagick

然后将此添加到上面的脚本中:

# Copy the file to User's Desktop and number nicely...
# ... save as hi-res 16-bit TIF
# ... and medium res, medium quality JPG for web use
cd ~/Desktop
i=0
while :; do
   base=$(printf "scan-%03d" $i)
   if [ ! -f "${base}.jpg" ]; then
      cp "$TMP" "${base}.tif"
      convert "$TMP" -resize 2000x2000 -quality 85% "${base}.jpg"
      break
   fi
   ((i++))
done

这里有一些我在全力以赴时发现有用的资源。您可以使用以下命令调试 scanimage 程序:

SANE_DEBUG_SNAPSCAN=128 scanimage -L

This resource 很有用。

您可以获得这样的帮助:

scanimage --help -d epson

请注意,您也可以使用 Raspberry Pi 或类似的小型低成本 Linux 机器作为 “扫描服务器”。基本上,您可以通过 USB 将扫描仪连接到 Raspberry Pi 和 Raspberry Pi 上的 运行 SANE。一旦你让它工作,你可以 运行 saned 这是一个守护进程服务,在 Raspberry Pi 上,它在网络上侦听其他设备(比如你的 Mac)发出扫描请求。它使用其 Linux SANE 驱动程序进行扫描,并通过以太网将图像传送回 Mac(或其他)客户端。我知道你不喜欢这个选项,但未来可能会有读者...

关键词: macOS, OSX, scan, scanner, scanning, EPSON, Canon, HP, libusb, SANE, sane-backends

好吧,经过大量的反复试验,我终于想出了一个解决方案。

TL;DR:我用 raspberry-pi 制作了一个打印服务器并安装了 cups 并将打印机设置为通过服务器共享。很有魅力!

我进行了大量调查,但作为恢复旧笔记本电脑的一部分,我通过安装 Ubuntu 20.04 获得了它 运行。只是为了好玩,我决定尝试从笔记本电脑打印一些东西。我不得不安装 CUPS 和其他一些软件包,但它确实有效。这让我想到我应该只做一个知道如何与打印机通信的打印服务器,这样所有其他机器就可以来来去去,但我的打印机 应该 仍然可以工作。