Linux下打印驱动的问与答

第一波

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

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

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

是需要编译gutenprint就可以了。

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

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

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

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

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

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

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

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就可以在命令行上输入命令进行打印了,问题是三个软件都移植了,而只使用了gs和hpijs就可以实现命令行打印了,而CUPS不知道是如何调用gs软件的,也不知道如何用,请指点一二?(只大概认为gs通过ijs接口调用hpijs的)

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

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

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

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

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

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

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

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

嵌入式Linux开发板:

-dFirstPage=2-dLastPage=3

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

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

/system/usr/bin/gs\

-sDEVICE=ijs\

-sIjsServer=hpijs\

-dIjsUseOutputFD\

-sDeviceManufacturer="HEWLETT-PACKARD"\

-sDeviceModel="deskjet5550"\

-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="deskjet5550"-r300x300-dNOPAUSE-dSAFER-sstdout=%stderr-sOutputFile="/dev/usb/lp0"/mnt/external_sd/chinese.pdf-cquit

gs-sDEVICE=ijs-sIjsServer=hpijs-dIjsUseOutputFD-sDeviceManufacturer="HEWLETT-PACKARD"-sDeviceModel="deskjet5550"-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="deskjet5550"-r300x300-dNOPAUSE-dSAFER-sOutputFile="/dev/usb/lp0"/home/kangear/Work/Printer/res/Ruler/ruler.pdf-cquit

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

一个能从别人的观念来看事情,能了解别人心灵活动的人,永远不必为自己的前途担心。

Linux下打印驱动的问与答

相关文章:

你感兴趣的文章:

标签云: