原文:https://blog.csdn.net/limelove/article/details/121988838
CUPS(Common UNIX Printing System,即通用Unix打印系统)是苹果公司所有,一个打印集成服务。包括了前端接收打印命令的相关程序,后端控制打印机硬件的程序,中间则是打印驱动。首先来看看CUPS驱动打印机的方式。这里要说明的是所谓驱动,其实是一系列的程序加定义文件的总和,不像我们有时候想像的那样是一个很简单的单一文件。当CUPS接受到打印命令时,首先会进行一个格式的预转换,将如.jpg等各种文件先转换成PostScript格式。然后进一步将PostScript格式转换成 CUPS内部格式,这个称为PostScript到PostScript转换,这两种PostScript格式还是有差别的,当然大家可以不必深究(我也没好好看,只是知道在MIME中定义了这两种不同的PostScript)。
以上这些都是预处理工作,接下来CUPS的工作围绕PostScript展开,CUPS会根据PPD(PostScript Printer Description 文件)文件来选择相应的处理流程。PPD文件其实是驱动的核心,不同的打印机有不同的PPD文件,PPD 包含有关输出设备的信息,CUPS使用 PPD 文件中的信息来确定在打印文档时向打印机发送哪些 PostScript 信息。需要说明的是,CUPS实际上把所有打印机都“看成”PostScript打印机,即便打印机本身不支持PostScript,也可以通过CUPS 自带的PostScript解释程序(pstoraster)或者GhostScript来解释PostScript文件,从而把普通的打印机模拟成 PostScript打印机。(一般的打印机并不能识别PostScript格式的信息,所以在使用过程中我们还需要安装一类解释性的驱动,让CUPS能通过这类驱动将信息转换成一般打印机能识别的信息。)可以分为三种,第一种就是接正在的 PostScript打印机的,而后面两种就是分别用CUPS的pstoraster或GhostScript来解释PostScript,虚拟出一台 PostScript打印机。三种工作方式能够分别支持不同的打印机(这也是CUPS兼容性非常好的原因):
第一种,直接传输PostScript文件给CUPS的后台,再将打印流传输到PostScript打印机,接下来的事情全部丢给打印机去处理,当然,这种打印机大多价格不菲;
第二种方式是交给CUPS的内置程序处理,把PostScript转换成其特有的raster格式,这种格式是CUPS特有的,至于为什么要转成这种格式,是为了方便打印机生产商,让他们可以只需开发CUPS的raster格式到其打印机的接口,方便大家统一,但似乎这一方式的驱动还不多。
第三种方式,也是支持打印机最多的方式,叫做GhostScript格式的驱动模式。它其实和第二种打印驱动比较类似,只把CUPS的解释器换成了外置的 GhostScript来解释PostScript文件,之所以这么周折,是因为目前支持这种方法的打印机比支持CUPS的raster的打印机要多很多。GhostScript程序是独立于CUPS运行的,它的功能也不仅限于打印,但很多情况下通过CUPS来调用GhostScript打印是件很方便的事情。foomatic则是用于连接CUPS和GhostScript的一个脚本程序(用perl写的),用来打包各种不同格式的打印机命令,它非常有用,对于通过CUPS调用GhostScript来说则是必须的。GhostScript格式的驱动程序很多,大家可以到Open Printing - OpenPrinting去看看,现在大部分打印机在Linux都是用GhostScript驱动的。当然,有些时候,GhostScript还不能包打天下,像HP的1020就比较特殊,它的打印流有点不一样,需要再用特殊的程序进行处理,GhostScript负责讲PostScript格式转换成点阵模式后,还要进过foo2zjs处理,转换成特殊的打印流,再交给后台。这种模式,相当于给GhostScript又装了个插件,附加了一个小模块。
总之,无论是哪种模式,实际上CUPS都是把打印机“看成”PostScript打印机,或是直接调用,或是用自带的方法虚拟,或者用GhostScript虚拟。
打印驱动的安装
用Ubuntu系统为例(命令行仅供参考,实际安装时可能会因为系统和版本的差别或有差异,可针对不同的系统作些修改)
(1)安装CUPS
sudo apt-get install cups
(2)安装GhostScript
sudo aptitude install ghostscript
(插一句,在ubuntu下,本人推荐用aptitude替代apt-get,aptitude处理包的依存关系比apt-get要好)
(3)安装foomatic
sudo aptitude install foomatic
改用sudo apt-get install foomatic安装
在系统管理-软件源中,修改官方软件仓库,选择了浙江大学和阿里的镜像。
命令行输入sudo apt-get update更新软件源列表。再次安装foomatic仍失败。
去http://www.openprinting.org/download/foomatic/ 下载foomatic-filters-4.0.16.tar.gz压缩包,交叉编译安装。(注意不要随便换版本,以免编译失败)
# 1.下载源码
wget http://www.openprinting.org/download/foomatic/foomatic-filters-4.0.16.tar.gz
# 2.解压源码
tar xvzf foomatic-filters-4.0.16.tar.gz
# 3.配置
cd foomatic-filters-4.0.16 &&
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=i686-linux CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld RANLIB=arm-linux-gnueabihf-ranlib AR=arm-linux-gnueabihf-ar --disable-dbus --prefix=/
# 4.修改文件"config.h"
sed -i '30s/#define HAVE_MALLOC 0/#define HAVE_MALLOC 1/' ./config.h &&
sed -i '37s/#define HAVE_REALLOC 0/#define HAVE_REALLOC 1/' ./config.h &&
sed -i '157s/#define malloc rpl_malloc/#define malloc_xx/' ./config.h &&
sed -i '163s/#define realloc rpl_realloc/#define realloc_xx/' ./config.h
# 5.编译
make
# 6.安装
make install
到此安装结束。只要再稍加配置,系统就应该已经能够支持很多种打印机了。GhostScript本身就已经带了很多打印机的驱动,还有很多GhostScript标准写的驱动,可以从Open Printing - OpenPrinting下载到。
至于像hp 1020这样的机器,我们还得多装一点东西,不用担心,此程序的作者已经想得很周到了,只需稍许几个命令就能解决安装。(参考rkkda.com - )
下载:
wget -O foo2zjs.tar.gz
解压缩:
tar zxf foo2zjs.tar.gz
进入相应的目录:
cd foo2zjs
编译foo2zjs:
make
取得打印机的韧件(firmware):
./getweb 1020
安装:
sudo make install
安装热插拔系统支持:
sudo make install-hotplug
安装到CUPS系统:
sudo make cups
这样,所有的安装工作都完成了。接下来需要配置调试CUPS服务了。
CUPS系统的配置
CUPS系统装好的时候是只能从本地打开的,就是安装CUPS的那台机器能打开:http://127.0.0.1:631。打开web页面管理,点击 “Administration”页面,可以看到添加打印机的按钮,点击按照提示就能完成安装(图形界面添加打印机)
如果要支持从其他机器登录,要修改配置文件:/etc/cups/cups.d/ports.conf,
在里面添加要监听的地址,例如:
Listen 127.0.0.1:631
#默认的本地监听
Listen /var/run/cups/cups.sock
#默认的监听端口
Listen 192.168.1.2:631
#要添加的监听地址
另外,由于安全的需要,CUPS将很多从网络安装维护打印机的功能作了限制,经过尝试,建议对配置文件再做一些修改,增加几个配置参数,降低一些安全设置,以方便在普通内网条件下使用。当然,如果你对安全性有很大的要求,请参考相CUPS的说明进行修改:
# Authenticate against system accounts by default...
...
DefaultEncryption IfRequested
#添加默认的对密码加密的要求
... ... ...
# Restrict access to the server...
...
Allow 192.168.1.0/24
#添加可以访问服务器的网段
... ... ...
# Restrict access to the admin pages...
...
Allow 192.168.1.0/24
#添加那些机器可以访问管理页面
... ... ...
# Restrict access to the admin pages...
...
Encryption Never
#表示访问管理员页面无需对密码加密
... ... ...
配置完成后,就可以通过web页面来管理你的打印机了。
最后,将PPD文件放到/usr/share/cups/model目录下,CUPS就能识别你的打印机了。
PPD文件哪里来的呢,这个有很多途径可以获得:CUPS自己本身带了很多PPD已经在/usr/share/cups/model/cups- included/目录下存在;从linuxprinting网站,也能下载到很多的PPD文件;还有,最经典的,可以用foomatic- compiledb编译出来,当然这个编译过程需要相应的数据库支持,默认编译的时候,会把所有foomatic支持的都编译出来,选择你要的就好了。以 HP1020为例,你可以直接从linuxprinting网站下到PPD;也可以在安装好foo2zjs后,用foomatic编译一个PPD文件,编译好后的文件存放在当前目录下的ppd/文件夹里。最后把对应型号的PPD文件拷贝到/usr/share/cups/model就完成了。
CUPS系统的使用
在使用CUPS,需要添加打印机,打开打印机。然后输入CUPS服务器地址“http://192.168.1.2:631”打开web页面管理,点击 “Administration”页面,可以看到添加打印机的按钮,点击按照提示选择相应的端口和打印机信号就能完成安装。该过程和在 widnows下安装很类似,完成后可以点“Print Test Page”试下测试页,打印机很快就会打出相应的页面。到此,我们已经完全完成了对CUPS系统的配置,打印服务已经可以直接使用了。在Linux服务器上,可以直接调用CUPS服务打印文件。另外也能通过网络,共享这台打印机,让其他的系统包括Windows系统使用这台打印机。
在Window下使用CUPS共享的打印机
在Windows下,安装CUPS共享的打印机。网上有很多解决方案,很多方案提到用samba来共享打印机,那种方法可行,但配置samba也是一项比较复杂的工作。我们完全可以使用CUPS的网络打印功能,来完成这一任务。例如,在Windows中添加一台网络打印机并输入URL:http://192.168.1.2:631/printers/HP_LaserJet_1020,就可以完成打印机添加了,之后的步骤和安装普通的本地打印机一样。其中“192.168.1.2:631/printers”是CUPS打印服务所在地址和端口,“HP_Laser_1020”是你的打印机名。(看有别的教程说可能需要Windows的机器先连接下打印机装下驱动,没有实际尝试过)
总结
通过CUPS的配置,我们能够将普通的打印机安装在Linux服务器上,从而提供网络服务,相比市售的网络打印机,这种方法不但降低了成本,一台带有 64M内存的奔腾就能很好的完成任务,而且该服务器还能同时兼任NAT,Web Server,FTP等服务,为10台以内的机器服务绰绰有余,CPU占用率100%的时间很少;而且相对传统网络打印机CUPS打印服务更加灵活可靠。