如何为制造商不再支持的打印机编写我自己的打印机驱动程序?
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
因此,为了进行扫描,我将其捕获到名为 device
的 bash
变量中并执行此操作:
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
我把所有内容都放在一个名为 scan
的 bash
脚本中,如下所示:
#/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 和其他一些软件包,但它确实有效。这让我想到我应该只做一个知道如何与打印机通信的打印服务器,这样所有其他机器就可以来来去去,但我的打印机 应该 仍然可以工作。
这个问题几乎已经说明了一切。我基本上想创建一个与我当前的 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
因此,为了进行扫描,我将其捕获到名为 device
的 bash
变量中并执行此操作:
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
我把所有内容都放在一个名为 scan
的 bash
脚本中,如下所示:
#/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 和其他一些软件包,但它确实有效。这让我想到我应该只做一个知道如何与打印机通信的打印服务器,这样所有其他机器就可以来来去去,但我的打印机 应该 仍然可以工作。