Linux下打印驱动的问与答

第一波

> 1>. 通过上面demo可知,这个适用于HP打印机,那我这里想使用epson打印机,想使用ijsgutenprint,这里也就要求移植gutenprint,

是的,是这样的。需要移植gutenprint.

>   那请问在这里,gutenprint 编译仅只需要ijsgutenprint即可,还是同时需要其他什么文件(按照我的理解是同时需要其他文件,但不知道其他配置文件  应该如何设置)

是需要编译gutenprint就可以了。

   2>. cups打印时,发现在设置打印机时会生成ppd文件,请问该ppd文件与打印机驱动有什么关系?

正是由于cups才有了ppdcups是一个大管家,全部型号它都管理,如何管理就是依靠的ppd文件。Ppd文件决定了cups在每一步应该派谁出场。

   3>. 按照我的理解,hpijsijsgutenprint等才是打印机的驱动,ppd 文件在打印时起到什么作用?

Hpijs ijsgutenprint仅仅是整个驱动中的九牛一毛而已.ppd文件应用在cups在宏观调控时,比如决定在最后时刻调用hpijs还是ijsgutenprint

   4>. 请问命令: $ gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sOutputFile="/dev/lp0" ./tiger.ps -c quit

        中-sDeviceManufacturer -sDeviceModel 是根据什么规则生成的?

这个是hpijs中写的。由于hpijs开发时间比较早,新的型号驱动中并没有,所以对于这里使用型号“deskjet 5550”是试出来的。


20140926更:补充网友的提问

第二波

      最近也想在Exynos4412-Linux3.5平台上实现USB打印机功能,现具备条件如下:
(1)惠普HP Deskjet 1000 J110a 彩色喷墨打印机一台 (采购中,机器还未到)
(2)自己静态编译的ghostscript-9.04软件和hpijs软件
(3)4412-Linux开发平台

       我使用的编译器是友善之臂提供的arm-linux-gcc-4.5.1,支持基于ARM v7指令集,问题如下:
 (1)我只需要在Linux下实现,配置编译内核支持USB打印机,也能自动创建lp0设备文件。剩下的工作是不是运行如下命令即可?
        gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sOutputFile="/dev/lp0"   /xxx/sample.ps -c quit
是的,直接运行就可以了。但是注意/xxx/sample.ps是要打印的文件。不要认为是命令中固定中的一部分。
       是不是在执行此条命令前还要做些准备工作,如建立tmp目录等,但是直接在Linux下就有tmp目录呢,还需要准备一些库吗?
你的是标准的嵌入式Linux不需要创建这些东西,我移植到不标准的Linux的系统中如Android中没有/tmp目录才需要自己创建一个。
(2)我插上USB打印机后直接在dev目录下生成的lp0设备节点,不是在/dev/usb目录下生成,是否一样?     
嗯,这个是一样的,无论生成在哪里。自己mknod建立也是可以的,对应的驱动源码都是内核中的usblp.c这个文件在kernel源码中有些年头没有更新了,我估计。
(3)上面那条命令是不是只针对HP Deskjet 1000 J110a这一款打印机,其他打印机应该如何适配?
hpijs源码中有一个文件描述了它支持的所有的打印机型号,替换-sDeviceModel中就可以了。那么你会问"deskjet 5550"而不是"deskjet 1000",是因为hpijs在很早都不维护了,deskjet 1000是近几年才上市的型号,不可能存在于hpijs中。但是都是一些换汤不换药的新型号,把老的型号中一个一个试试可以试中。:)
(4)现在我只是先实现,即用Exynos4412--Linux平台能控制USB打印机,后面的维护才是开始(比如实现较好的打印质量等等),那么我应该学习什么资料?
是的,会编译并实现打印其实和在PC上所谓的技术宅们会配置打印机驱动是一样的,没有什么深的技术,都是些熟能生巧的东西。
但是要想打印的好,就要了解其原理。打印机语言PDL 也叫页面描述语言,这种实现仅仅是将固定格式(pdf or ps(postscript))的文件转换成页面描述语言传输给打印机,而面对用户的是txt word jpg png exl ppt等等各种格式,怎么把它们处理好成「固定格式」也是重点。再给一些关键词:PPI DPI PDL PPD CUPS POSTSCRIPT GUTENPRINT ...。

enjoy it.

第三波

1 . 我使用Linux3.5,那么在Linux下USB打印机子系统是不是就只有你上面提到的usblp.c源文件?没有其他的了?
内核做的工作更单一,只是把「最终的数据」传输到打印机。可以从这个链接来看它被修改的历史usblp.c。内核只提供这个,内核才不管你是什么型号打印机要什么数据呢,毕竟它只是内核。它只做大家都通用的功能。
2 . 我手上有台佳能的MF4830d激光一体打印机,插上开发板后控制台输出这款打印机相关信息。我想问的就是这些打印机信息是Linux内核本身就有的,还是插上USB接 口后由打印机把这些打印机厂家等信息给内核,然后内核识别到再输出信息?
USB设备都是要自报家门的。usb协议中有专门的打印协议,内核是「不生产信息只是软硬件之间的搬运工」。型号的区别是通过运行sudo /usr/lib/cups/backend/usb输出的信息来区别的。而不是打印机贴的谁家的Logo。
3 . 那么在Linux内核层面,USB打印机的驱动就只需要usblp.c就可以了吗?看懂这个驱动我会收获哪些?看懂这个驱动我要具备哪些知识?(先了解个框架)
我也没有完全看懂,也不需要看懂 很成熟的东西好些年都不大变;不过看懂也不错,可以让你理解了内核usb通信的实现方式。使用内核的usblp.c只是因为它是个通道,不是目的,目的是将数据传输给打印机。使用libusb(应用层的usb通信库)直接传输也是一样的,参见hplip的实现;真到Android中使用usb host api也是一样的,参见Google play中 USB打印APP 的实现。当然以上几种方案我都有实现验证的,因地制宜就好。
4 . 从上面的提问中你能帮我总结下我在哪方面的知识比较欠缺?比如是Linux下内核驱动?还是USB协议? 
如果是采用了usblp.c这种方式,内核驱动不需要任何考虑。USB协议也是无需任何的考虑。那都不是重点。重点是「在应用层如何处理好打印数据」。多搜索上篇中提到的那几个关键词就好,那就是应用层打印相关的。不过也建议遇到什么问题再找什么解决方案也不错,毕竟用不到时就去了解,会没有目的。


20141010更:

4波: 

    你好,前段时间根据你的思路实现了ARM-LINUX平台下的USB打印机,使用方案是gs-hpijs,打印机为deskjet1000。对这块非常感兴趣,再次咨询几个问题:

1.  大致了解了下,在Linux打印系统中,只要Linux内核支持USB打印通信协议,然后使用打印系统 CUPS→gs→hpijs就可以在命令行上输入命令进行打印了,问题是三个软件都移植了,而只使用了gshpijs就可以实现命令行打印了,而CUPS不知道是如何调用gs软件的,也不知道如何用,请指点一二?(只大概认为gs通过ijs接口调用hpijs)

这就要用到之前提到过「ppd文件」,需要添加「打印机」到cups中,这个过程中要指定ppd文件(包含在hpijs源码中),这样就可以使用通用的lpr xxx.ps命令来打印了。Cups会自动根据ppd文件中调用之前手动执行的打印命令。

2. hpijs是针对惠普公司的喷墨打印机驱动,如果我要在ARM-LINUX平台上实现爱普生、佳能打印机,是不是还是可以使用gs--xxx方案,这个xxx可以是其他驱动?

Gutenprint中包含了一个ijsgutenprinthpijs类似的基于ijs的实现,可以支持市面上各个厂商70%打印机型号。

3. 命令行打印时,都是把ps格式的文件送给/dev/lp0,如果要打印常用的txtjpg等格式的文件时,应该把txtjpg文件先转换为ps格式的文件,然后再用命令行打印,可以使用gs软件转换吗?不知道怎么转换,没有一点思路,请提醒一下.

Ps格式是比较原始的 中间格式,Gs同样支持PDF格式作为 中间格式,txt,jpg等格式文件转换成PDF就相对容易了。整体思路就是先使用其它库或者工具将常见格式如txt,jpg等等转换为PDF,接下来交给GS处理就好了。

4. 我想深入理解,而只看了gshpijs软件源代码中的说明文档,需要看gshpijs软件的源代码吗?如何下手?

这些开源项目很成熟,个人目前看法是会用就好。




还有一些东西也存在这里吧:

嵌入式Linux开发板:

-dFirstPage=2 -dLastPage=3

/system/usr/bin/gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile="/dev/lp0" /sdcard/ruler.pdf -c quit

 

/system/usr/bin/gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile=- - < /sdcard/ruler.pdf > /dev/lp0

 

/system/usr/bin/gs \

-sDEVICE=ijs \

-sIjsServer=hpijs \

-dIjsUseOutputFD \

-sDeviceManufacturer="HEWLETT-PACKARD" \

-sDeviceModel="deskjet 5550" \

-r300x300 \

-dNOPAUSE \

-dSAFER \

-sstdout=%stderr \

-sOutputFile=- - < \

/sdcard/ruler.pdf \

> /dev/lp0

 

 

Android

/system/usr/bin/gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile="/dev/usb/lp0" /mnt/external_sd/chinese.pdf -c quit

 

gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile=- - < /mnt/external_sd/chinese.pdf > /dev/usb/lp0

 

PC

/system/usr/bin/gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sOutputFile="/dev/usb/lp0" /home/kangear/Work/Printer/res/Ruler/ruler.pdf -c quit

 

gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -sstdout=%stderr -sOutputFile=%stdout  ~/HelloWorld.pdf -c quit > HelloWorld.PCL3GUI

 

 


你可能感兴趣的:(Linux下打印驱动的问与答)