T-bagwell 发表于 2008-08-29 09:47

是很困难啊

对了
不能像在LCD上输出一样的实现在打印机上?
比如颜色的值

黑白打印机用0xff000000这样的黑色的或者0x00000000这样的通过alpha值来做判断打印不打印?
彩色打印机就用他的颜色值来做打印,不可以吗?
有点不理解,主要是没做过,所以就按照自己在这方面的通用性来做的理解,呵呵
做好了一定要发篇原创给大伙学习学习啊

pilgrim_kevin 发表于 2008-08-29 12:43

原帖由 T-bagwell 于 2008-8-29 09:47 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
是很困难啊

对了
不能像在LCD上输出一样的实现在打印机上?
比如颜色的值

黑白打印机用0xff000000这样的黑色的或者0x00000000这样的通过alpha值来做判断打印不打印?
彩色打印机就用他的颜色值来做打印 ...

在过去的老式的文本打印机上,可以通过 cat xxx > /dev/lp0的方式进行打印,但是现代的打印机都是在特定的打印机语言驱动下工作的。打印机语言指的是控制打印机工作的命令,它告诉打印机如何组织被打印的文档,打印机按照这些命令来处理计算机传来的打印数据,并最终准确的打印出文字与图像。打印语言就是一个命令集,这些命令不是被单独地传送,而是由打印机驱动程序把它们嵌在打印数据中传给打印机,并由打印机的打印控制器再分开解释。打印机语言大体上可分为两类:一种是页面描述语言(PDL),另一种是嵌入式语言(Escape码语言)。它们的代表分别是Adobe公司的Postscript语言和Hp公司的PCL语言,它们是已经成为业界标准的两种打印机语言。而现在普遍应用的是PCL6和postscript level 2的版本。

除了这两种打印机语言之外许多厂商都使用自己的打印机控制语言,如爱普生(Epson)的Esc/Page,佳能的Capsyl,施乐的Xes、Jdl,Ibm的Ipds,Dec的Ansi/Sixel等,它们都各具特点。

所以从概念上来说,向打印机发送真正打印机可接受的打印数据,跟向LCD的framebuffer输出图像数据相差甚远。也跟老式文本打印机可以直接接收文本数据进行打印相差甚远。

[ 本帖最后由 pilgrim_kevin 于 2008-8-29 12:48 编辑 ]

pilgrim_kevin 发表于 2008-08-29 12:54

现在的打印机本身就是一个嵌入式系统,用ARM的CPU,P1008有8M ram。它接收到打印数据后要进行若干处理与运算来控制打印机工作,跟过去的老式打印机不可同日而语。

T-bagwell 发表于 2008-08-29 14:06

经典,斑竹不给他的回帖加精就太浪费啦

pilgrim_kevin 发表于 2008-08-29 17:31

回头我做完了一定写个帖子。我在网上找资料,太TMD痛苦了,基本上啥也找不到

ivorhuang 发表于 2008-09-06 09:31

楼主是准备 通过网络进行打印吗?
只要有CUPs,网络功能正常。就可以通过IPP协议进行网络打印了。

pilgrim_kevin 发表于 2008-09-06 13:20

原帖由 ivorhuang 于 2008-9-6 09:31 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
楼主是准备 通过网络进行打印吗?
只要有CUPs,网络功能正常。就可以通过IPP协议进行网络打印了。

你好像没有仔细看我的帖子

eveson 发表于 2008-09-08 15:46

这个帖子这么多人加分,我也要加阿:lol:

pilgrim_kevin 发表于 2008-09-24 17:36

经过一段时间的研究,现已基本实现在arm linux里打印的功能。

首先交叉编译CUPS,这个就不细说了,configure一下即可。

先后用过两个打印机,第一个打印机HP P1008由于不支持标准的PCL,而只支持特殊的XQX Stream Protocol,最终无法搞定在板子上的文档数据转换而放弃。原因主要是:cups使用foomatic-rip做智能文档过滤器,这是一个perl程序,需要一个perl运行环境;需要调用第三方驱动foo2xqx和gs去进行数据转换,太复杂,通用性也不够(假如换打印机或支持更多打印机)。后来更换了一个支持PCL的HP打印机。

最终的实现抛开了cupsd和ghostscript,因为我的需求比较简单:打印jpeg图片。

我最终只使用了cups的两个过滤器程序imagetoraster, rastertohp,后端backend程序usb,还有打印机的PPD文件,一共只有几百K的大小。自己写脚本和程序实现打印,基本的流程如下:

imagetoraster | rastertohp | cat > /dev/usb/lp0

因为/dev/usb/lp0是独占打开的,所以这样打印会导致无法并发提交打印任务,所以自己写了个to_printer程序代替cat,其中使用简单的文件锁来产生当前有进程在打印时另外的打印进程等待的效果。

如果要支持多种复杂文档格式的打印,估计gs还是必不可少的,因为cups的过滤器也会调用gs,比如imagetops。

[ 本帖最后由 pilgrim_kevin 于 2008-9-25 11:02 编辑 ]

pilgrim_kevin 发表于 2008-09-27 09:03

目前针对支持HP PCL打印语言的打印机可以使用上贴的方法进行打印。如果是使用Epson的打印机,如果支持ESC/P,应该使用rastertoepson也可以实现。

上述的实现主要针对打印图片。实际上打印其他任何文档的思路应该是一样的,选择一个过滤器路径,用管道组合,比如pdftops | pstoraster | rastertohp > printer 。只是涉及到要转换到ps的状况,要调用gs。

另外,我自己实现打印过程的原因是CUPS没有彻底搞定(我这里主要是backend/usb的问题)。如果彻底搞定CUPS(配合ghostscript),那么会是一个比较理想的嵌入式Linux打印管理系统的方案。
页: 1 [2] 3 4 5
查看完整版本: 嵌入式Linux打印功能的实现