一、前言

        在前段时间构建打印系统的过程中,积累了一些打印相关知识,为实现上述目标也制定了计划,本文档就是计划任务具体实现的技术文档。分为如下几个部分:

1.    ARM-LINUX平台下实现文本文件打印方案。

2.    上层服务软件的移植。

3.    打印接口制作。

       在计划最后,还准备实验佳能公司打印机,会编写单独的实验报告,本文档不会详细介绍。

二、ARM-LINUX平台下实现文本文件打印方案

        根据前期工作,已明确使用Ghostscript 和Hpijs方案能实现基于ARM-LINUX平台的USB打印机Demo(Ghostscript 和Hpijs软件的移植可以查看总结的移植文档) 。但这只是个开始,最终目的是面向用户的打印功能(对于用户来说,比较友好的是word、txt、jpg、ppt等格式的文件,Ghostscript只支持ps、eps、PDF等中间格式)。

  1. 打印系统的几个关键词

        (1)打印机设备节点

       即插上USB打印机后,会在dev目录下自动创建lp0的设备节点,如果没有,需要自己创建,否则不能打印。

       Linux操作系统下基于USB打印机通信协议驱动源文件为usblp.c,在移植内核时候需要配置上这个驱动。此驱动相当于一个通道,Linux内核收到需要打印的数据后,通过此协议把数据传送给打印机,当然这些数据是打印机可以识别的。

(2)通用Unix打印系统

        CUPS--Common Unix Printing System,是一个假脱机打印服务程序,由苹果公司维护,遵循GNU GPL。在Linux下进行CUPS驱动开发是遵循GPL协议规定的,也就是说必须开源。作用:

	采用IPP以加强网络打印功能;
	可自动检测网络打印机;
	Web接口设置工具;
	支持PPD(PostScript Printer Description)打印机文件;
	支持大多数打印机使用.

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

(3)Ghostscript

        Ghostscript--是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的免费软件,即开源软件,在CUPS中被认为是一种过滤器。(如果需要深入了解可以查看源代码目录下的文档),下面是gs命令的例子:

gs  -sDEVICE=ijs  -sIjsServer=hpijs  -dIjsUseOutputFD  -sDeviceManufacturer=
"HEWLETT-PACKARD"  -sDeviceModel="deskjet 5550"  -r300x300  -dNOPAUSE
-dSAFER  -sOutputFile="/dev/lp0"   /home/fengel/ReadmeWin.pdf   -c  quit

注意:GS软件支持的中间格式的像PS、EPS、PDF等格式,注意事项也需要查看gs软件源代码目录下的说明文档。下面说明打印PDF时可用参数:

  1. –dFirstPage参数和-dLastPage参数

–dFirstPage=pagenumber1 , -dLastPage=pagenumber2,打印的PDF文档从pagenumber1开始,到pagenumber2结束。

  1. 其他参数查看gs源代码目录下的说明文档。
  2. 如果在Adobe 阅读软件能打开的pdf文件在gs下不能解析,那么最大可能情况就是此pdf文件生成时有错误。

(4)HPIJS

        HPIJS--Hewlett-Packard Inkjet Driver Project,惠普喷墨打印机驱动程序项目。开源软件

支持ARM架构的DDwindows 支持arm架构的打印机_支持ARM架构的DDwindows

        执行完gs -h后,如果没有看到高亮的ijs设备,说明编译的Ghostscript版本没有对HPIJS内置支持,需要更换Ghostscript更高的版本。

        使用gs命令行打印文件时,需要一些参数。如果使用打印机驱动(非内核层面的USB打印机驱动,内核的那个是一个USB通信驱动)为HPIJS,那么如下参数是必须的:

-sDEVICE=ijs
  -sIjsServer=hpijs
  -dIjsUseOutputFD
  -sDeviceManufacturer=x   (x equals: "HEWLETT-PACKARD", "HP", "APOLLO")
  -sDeviceModel=x          (x equals: "DESKJET 990", "DESKJET 670", etc...)
  -r300x300    -r后面的参数为dpi

         根据需要还要其他参数,这些都可以在hpijs_readme.html文档和gs文档里面查看。

       如果制造商是HP,那么对于HP deskjet1000 J110喷墨打印机使用的-sDeviceModel参数可以为如下:(注意区分大小写,参考hpijs-readme.html)

dj450
     deskjet 5100
     deskjet 5550
     deskjet 5551
     deskjet 5600
     deskjet 5800
     deskjet 9600
     Photosmart 320
     Photosmart 330
     Photosmart 370
     Photosmart 380
     photosmart 7150
     photosmart 7260
     photosmart 7268
     photosmart 7345
     photosmart 7350
     photosmart 7550
     photosmart 7660
     photosmart 7760
     photosmart 7960
     OfficeJet 6100
     OfficeJet 6150
     PSC 2100
     PSC 2150
     PSC 2170
     PSC 2200
     psc 2300
     psc 2400
     psc 2500
     hp business inkjet 1100    打印语言: hp PCL Level 3增强
     HP Business Inkjet 1200

(5)Gutenprint

       对于打印机驱动Hpijs,它只对HP系列的喷墨打印机支持较良好。如何支持其他厂商的打印机,初步方案是移植新发现的gutenprint驱动,以佳能打印机进行实验,Gutenprint中包含了一个ijsgutenprint和hpijs类似的基于ijs的实现,可以支持市面上各个厂商70%打印机型号。

(6)a2ps

        a2ps是一个postscript过滤器,起初用来把Text转换为PostScript,现在能处理其他更多的格式(PostScript, Texinfo, compressed, whatever...)。源代码开源,该名的原意是将ASCII格式的文件转化为PostScript格式的文件,而文本文件里面只有字符、符号,所以肯定是ASCII文件,所以a2ps软件可以把txt格式的文本文件转换为打印机驱动能够识别的中间格式的文件。

(7)Enscript

        Enscript是一个自由软件,它也是一个把ASCII格式文件转换为PostScript格式的软件,与a2ps不同的是,它的输入只能是ASCII格式的文件,输出可以多种,包括.PS格式,转换完成后会把转换完成的文件保存为指定格式。

(8)专用打印驱动程序

        对于不能识别PostScript语言的打印机来说,必须采用各个打印机专用驱动程序将PostScript格式的页面描述语言转换为这些打印机能够识别的打印命令,上面叙述的ghostscript软件就能实现这样的功能,它集成了很多类型打印机的免费驱动,能够通过命令调用相应的打印机的驱动来解析PostScript文件,将其转换为打印机能够识别的命令并把处理的结果输出到打印设备上,另外,Ghostscript还具有多种类型的文件格式转换和PS文件的显示功能。

       如果Ghostscript不支持使用的打印机,并且有此打印机在Linux系统下的打印机驱动程序,那么可以自行把驱动添加到Ghostscript源码中,并修改对应Makefile,重新编译生成的gs就会包含对此打印机驱动的支持。

       对于HP公司使用的USB打印机,还需要上述的hpijs,它由ghostscript的IJS接口调用,实现HP打印机的驱动功能。

(9)其他关键词

        如PPI DPI PDL PPD CUPS POSTSCRIPT,可以查看资料kangear、邮件列表等。

2. 方案

        文本文件一般采用ASCII编码,所以能通过移植a2ps或enscript软件实现此类文本文件的打印,但有个缺陷是只能对ASCII码的文本文件正常打印,如果含有其他非ASCII字符,打印出来就是乱码。

       首先移植上层服务软件cups,然后移植支持ASCII编码的的软件用于文本打印,然后再想其他办法或移植其他软件对中文文本的打印支持。

三、上层服务软件的移植

        在以前的文档或上述内容多次强调Gostscript程序只能处理PS格式的文件,所以还需要一种把txt、jpg等格式的文件转换为标准PostScript格式的软件,按常用打印类型分为两类:

图像文件的转换

        Linux中将图像转换为ps文件的软件如gif2ps、tiff2ps、jpeg2ps等等,可以将这些软件交叉编译后移植到ARM-LINUX平台上,使用这些软件的一个问题就是它们最终生成的PS格式的文件描述的图像分辨率不统一,调整起来很不方便。

        Netpdm软件会自动调整图像的分辨率,并且包含了一百多种图形格式的转换程序,可以实现这些图像文件格式的相互转化,功能十分强大。并且Netpbm支持ARM板的安装包,不需要交叉编译,使用此软件把各种格式的图像文件转换为pnm格式,然后通过pnmtops命令把pnm格式转换为PS格式。

中文文本的打印

        中文打印一直是困扰中文Linux系统实现打印本地化的一个难题,Linux的打印机制在开始的时候根本没有考虑中文打印,目前GhostScript的正式发行版中也不支持中文字体,可以采用比较简单的方法,将中文文本文件直接转换为内嵌中文点阵字体的PostScript文件,Ghostscript在处理的时候直接将汉字像图像一样打印出来,而不需要调用中文字库。

        在Linux中,将中文文本转换为PS文件,经常使用bg5ps,它的缺点是不是在硬件资源有限的ARM系统上,因为它采用Python语言开发,处理移植软件本身、中文字库外,还得移植近10M的Python。蔡依道编写了基于汉字点阵字库(HBF)的cnprint软件短小精悍,能够将中文文本转换为内嵌中文点阵字体的PS文件,也可以调整PS文件描述的打印页大小,页边距,纸张大小等等,将cnprint交叉编译后,和HBF字库一起移植到开发板下面,直接执行cnprint –w xxx.txt命令就可以得到xxx.txt的ps文件。

  1. Cups的移植

        到目前为止,我所熟知的打印系统为中间层软件Ghostscript、打印驱动hpijs或gutenprint、Linux内核空间USB打印通信协议驱动。这只是一个简易的打印系统,只适合开发人员使用:一方面它的使用是面向命令行的;另一方面,在打印系统中,打印机只能识别它能识别的打印机语言,比如惠普打印机能识别的pcl打印语言,这也是需要打印的数据文件最终转换为的格式,在上述最简打印系统中,gs直接处理ps、eps、pdf等中间格式为打印机能够认识的最终格式(gs使用hpijs驱动转换),然后进行打印,最终产品中,可能面向的都是txt、jpg、word、ppt等格式的用户熟知的文件,那么就需要上层服务软件把这些格式转换为GS支持的中间格式。

       通用Unix打印系统在Linux中比较常用,但大都使用于桌面系统(比较占用系统资源),对于嵌入式平台1GB、EMMC为4GB,所以能胜任运行CUPS服务的任务。可以通过下图对CUPS有个整体框架的认识:        

支持ARM架构的DDwindows 支持arm架构的打印机_嵌入式打印机_02

(1) CUPS简介

         CUPS没有给每种打印机都使用一种专门的打印工具,而是使用了一系列过滤器来把一个要打印的文件转换为您的打印机能理解的东西。CUPS的过滤器方案相当不错。当您交给CUPS一个要打印的文件时,它就推断出这个文件的MIME类型、您的打印机能够理解的各种MIME类型,以及把前者转换为后者所需的过滤器。

对于CUPS,我总结了如下几点(前提是Linux安装了cups系统)

	对多台打印机,修改PRINTER环境变量指定一台,如export  PRINTER=printer_name。
	PPD文件描述了打印机属性和功能。
	打印机PPD文件位置:/etc/cups/ppd(当前在用的),/usr/share/cups/model(CUPS的发布库里带的PPD)
	使用locate .PPD可以找到整个Linux系统上所有PPD文件
	在PPD文件中,找到cupsFilter一行,如cupsFilter:”application/vnd.cups-raster 0 hpcups”中,hpcups就是此PPD文件对应的打印机的过滤器,也就是hpijs-3.14.6-5.fc20.i686
	在/usr/lib/cups/filter下,可知系统上可以使用的过滤器(此路径是执行locate  PstoPs得来)
	Lpinfo –v命令要求cups给出可以使用的后端列表。

(2)CUPS的移植。

1)源码获取

        可以从http://www.cups.org获取源码,并使用tar zxvf命令解压。

2)使用如下命令配置

./configure --host=arm-linux --target=arm-linux --build=i686-linux CC=arm-linux-gcc CXX=arm-linux-g++ LD=arm-linux-ld RANLIB=arm-linux-ranlib AR=arm-linux-ar  --disable-gnutls --disable-gssapi --disable-dbus

3)编译、安装

        通过实验,cups只能进行有限的转换,并不能实现文本文件到PS文件的转换,但是它可以对整个打印系统进行合理的管理,比如简化打印命令(用它可以直接调用移植的gs),管理打印队列等打印管理,这里的移植对后期功能扩展还是很有帮助的。

        a2ps和enscript软件针对性就较强,它们都能直接把ASCII码的文本文件转换为ps文件实现不含中文文本的打印,主要介绍enscript的移植。

2. enscript


在官网 ( http://ftp.gnu.org/gnu/enscript/ ) 下载较新的Enscript-1.6.5.tar.gz版本软件,使用tar zxvf  xxx  -C /XXX解压,进入目录。(一定要查看源码目录doc目录下的FAQ.html) (1)配置         此软件为开源软件,开发人员可以得到源代码并移植,交叉编译前需要配置,配置前需要查看配置选项,一般执行configure –help命令查看,可以指定交叉编译器、指定安装目录等。


        然后配置,./configure --host=arm-linux -prefix=/usr/local/enscript-arm,配置参数为使用arm-linux交叉编译器,安装目录为/usr/local/enscript-arm,即后面执行make install时会在主机的/usr/local/目录下生成enscript-arm目录,在此目录下会有bin、share头、lib库子目录用于对运行此应用程序的支持,对于交叉编译,将要在开发板上运行应用程序,所以在主机上执行完make install后要把在主机端/usr/local/目录下生成的目录也拷贝到目标端对应路径下,这样,应用程序在运行时就会在相关路径下找一些支持,比如配置文件等,因为这个路径是在交叉编译时配置已经指定了的。

        另外,在后面如果编译成功后,需要把应用程序也要拷贝到开发板环境变量指定的地方。这样才能保证移植的应用程序能正常运行。我是把要运行的应用程序拷贝/bin目录下,然后在任何地方运行都能识别。

       (注意只需要拷贝应用程序到/bin目录下实验也成功,而应用程序需要的lib和share目录中的文件会自动到安装路径里面去找)


(2)编译


        上面描述中省略掉了配置出现错误时解决的过程,在编译时也会出现错误,因为这个源代码运行平台大部分都是基于X86处理器的Linux平台,要想在自己处理器的Linux平台上运行,必须交叉编译移植,移植时也绝对会遇到错误,解决这些错误就是整个移植工作的核心,也是最难的部分之一。

(3)安装

        执行完make编译后,执行make install 安装,上述所有过程中,执行完一条命令后都可以用echo $?来检测执行上一条命令是否发生错误。

       安装完后就把生成的文件拷贝到开发板对应目录,然后进行实验,看是否能实现自己想要的功能。

       最后,通过编译与调试,此软件被顺利移植到ARM-LINUX平台,实现了此平台下的txt文件到.ps文件格式的转换。

(注意上面完成工作只限与英文文本的转换,中文不支持)

(4)enscript参数

输出介质(纸张格式)

        用此软件把文本转换为ps格式的文件后,ps格式的文件表现的纸张格式设置(如A4):

       在开发板目录/usr/local/enscript-arm/etc/enscript.cfg文件,在Default output media选项修改为A4、letter或其他文件,如果不修改默认是A4,如果改为A5,用A4打印出来后排版会变化,并且在运行enscript软件后也会提示把txt转换成为ps文件时,多了一页(A5排版较大的缘故)。

       注意可以在配置文件中改,也可以使用-M  A4来修改。命令如下:

enscript text.txt -M A4 -o text.ps  在使用命令时如果没有加-M参数指定输出媒介规格,那么enscript软件将读取配置文件使用默认媒介规格把txt转换为ps文件。

       从这里也可看出,只要媒介规格(纸张格式)确定后,对于txt文件里面到底有打印几页的内容就不用关心了,反正转换为A4规格的ps文件,需要打几页就打几页。

       如果转换成的xx.ps文件不能使用gs软件正常打印,如果是由于纸张设置引起,可以使用上述方法在生存xx.ps文件过程中设置enscript软件参数解决,也可以在真正打印时使用gs软件时指定参数-Spapersize=a4来解决(参考FAQ.html文件)。

	分栏打印
使用-Gnr参数可实现分栏打印,如果其中的n=2,表示分为两栏打印,每栏的内容为原先一张纸的内容,所以这个时候可能会超出打印范围,要设置为A5打印才能在一张纸上显示完全,要不然本来一页的内容要分成两页来打印。
	-p参数
初步认定此参数后面接ps文件,如enscript -ptext.ps text.txt即把text.txt转换为text.ps文件。
	-v 参数
如enscript -v -G2r -pfoo.ps latin2.txt
初步认为是默认字体意思。

3.Cnprint

        对于中文文本的支持,此软件将中文文本文件直接转换为内嵌中文点阵字体的PostScript文件,Ghostscript在处理的时候直接将汉字像图像一样打印出来,而不需要调用中文字库。由于此软件较小,只有一个源文件,交叉编译也较简单,这里不详细介绍。只是在交叉编译的时候注释掉了573-651行,并把652行改为while(0),因为具体产品中不可能在终端中输入。

        在转换的时候,不需要打印时要加上-w参数。

四、打印接口的制作

        在方案中已提到,最终目的是面向用户,而用户交互界面为QT,所以需要给QT提供调用接口或库(相当于在前面已实现的功能基础之上封装,针对的打印机为HP的deskjet 1000打印机)

  1. Gs和hpijs、cnprint路径

        在一个产品中,不可能再在终端中敲入命令方式实现特定功能,必须使用脚本或其他方式运行编译的应用程序,为了在Linux系统中任何程序能正确调用gs或hpijs、cnprint程序,必须添加他们的环境变量。

        把静态编译好的GS和hpijs、cnprint软件拷贝到/home/fengel/xxx目录,然后编辑开发板端/etc/profile文件,加入如下内容:

export PATH=$PATH:/home/fengel/xxx

       下次开机后会生效或使用source /etc/profile立即生效,输入echo $PATH可查看是否加入成功。这样,不管是在脚本还是在源码中调用gs或hpijs,系统都会先从环境变量指定的路径去查找,然后再在当前目录下查找,否则不能正确执行程序。

       Cnprint是一个把文本文件转换为ps文件的一个程序,它与enscript的区别是支持中文,此程序运行依赖与用户自定义环境变量HBFPATH,而此变量指定了此程序运行需要的字体文件。所以在/etc/profile中还需要加上如下内容才能使cnprint能正常运行。

export HBFPATH="/usr/local/HBF" (需要把整个HBF文件夹拷贝到/usr/local目录下。

  1. 打印脚本和打印文件路径

        打印脚本里面主要内容是使用移植过的gs和hpijs软件处理PS、PDF格式的文件,并把处理后的数据通过内核空间提供的USB驱动传送给USB打印机打印。比如部分内容如下:

gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER  -sOutputFile="/dev/lp0"  /home/fengel/xxx  -c  quit

        注意,上述能正常运行的前提是在/home/fengel目录下有ps或pdf格式的文件,如果没有,可以在脚本中增加转换,如cnprint  -w  xxx.txt,xxx.txt也必须在/home/fengel目录下,才能保证生成的ps文件也在/home/fengel目录下。

3. Linux下shell脚本

(1)shell编程初步介绍     

        在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。下面,让我们一起来看看shell是如何工作的:

建立一个脚本:

        Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell 中运行)。

  如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行):

  #!/bin/sh

  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。

要使脚本可执行:

当编辑好脚本时,如果要执行该脚本,还必须使其可执行。

  chmod +x filename

  然后,您可以通过输入: ./filename 来执行您的脚本。

注释:

  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。

变量:

 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

   变量名=值

  取出变量值可以加一个美元符号($)在变量前面:

  #!/bin/sh

  #对变量赋值:

  a="hello world"

  # 现在打印变量a的内容:

  echo "A is:"

  echo $a

  在您的编辑器中输入以上内容,然后将其保存为一个文件first。之后执行chmod +x first 使其可执行,最后输入./first执行该脚本。

  这个脚本将会输出:

  A is:

  hello world

  有时候变量名很容易与其他文字混淆,比如:

  num=2

  echo "this is the $numnd"

  这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:

  num=2

  echo "this is the ${num}nd"

  这将打印: this is the 2nd

  有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。

  如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。

  除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

Shell命令和流程控制:

在shell脚本中可以使用三类命令:
  Unix 命令: 
  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
  常用命令语法及功能
  echo "some text": 将文字内容打印在屏幕上
 ls: 文件列表
  wc -l filewc -w filewc -c file&: 计算文件行数计算文件中的单词数计算文件中的字符数
  cp sourcefile destfile&: 文件拷贝
  mv oldname newname : 重命名文件或移动文件
  rm file&: 删除文件
  grep 'pattern' file&: 在文件内搜索字符串比如:grep 'searchstring' file.txt 
  cut -b colnum file&: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
  cat file.txt: 输出文件内容到标准输出设备(屏幕)上
  file somefile&: 得到文件类型
  read var: 提示用户输入,并将输入赋值给变量
  sort file.txt: 对file.txt文件中的行进行排序
  uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq 
 expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3 
 find: 搜索文件比如:根据文件名搜索find . -name filename -print 
  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile 
  basename file&: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux 
  dirname file&: 返回文件所在路径比如:dirname /bin/tux将返回 /bin 
  head file&: 打印文本文件开头几行
  tail file : 打印文本文件末尾几行
  sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus : cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file 
  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F,'{print $1 "," $3 }'这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor,34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
  概念: 管道, 重定向和 backtick 
  这些不是系统命令,但是他们真的很重要。
  管道 (|) 将一个命令的输出作为另外一个命令的输入。
  grep "hello" file.txt | wc -l 
  在file.txt中搜索包含有"hello"的行并计算其行数。
  在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
  > 写入文件并覆盖旧文件
  >> 加到文件的尾部,保留旧文件内容。
  反短斜线
  使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
  命令:
  find . -mtime -1 -type f -print 
  用来查找过去24小时(-mtime -2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
  #!/bin/sh 
  # The ticks are backticks (`) not normal quotes ('): 
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` 
  流程控制
  "if" 表达式如果条件为真则执行then后面的部分:
  if ....; then 
  .... 
  elif ....; then 
  .... 
  else 
  .... 
  fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等... 
通常用" [ ] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
	最后,把脚本也要拷到环境变量指定的目录。

4. 总结

(1)使用此接口的准备工作	
	通过设置环境变量,指定Gs、HPijs程序的路径
	通过设置环境变量,指定cnprint程序的路径(如果要把txt转换为ps)
	如果使用cnprint软件,需要设定HBFPATH环境变量的值,即指定HBF文件夹路径
	使用的脚本也要通过设置环境变量来指定脚本文件的路径。
	上述所有文件必须可执行
(2)可以把为上层应用制作库
详细过程可参考文档<linux下库文件的创建和使用>,注意Linux平台下system函数的使用。
下面为QT下执行shell或外部程序实列:
#include<QProcess>
Void Widget::on_pushButton_clicked()
{
	//1.system(“/opt/run_samplayer”);
	//2.QProcess::execute(“/opt/run_smplayer”);
	//3.
	QProcess *poc=new QProcess;
	Poc->start(“/opt/run_smplayer”);
}
第一种方法是调用linux C函数库中的system(const char *string);
第二种方法和第三种方法是调QT里的函数;
需要说明的时,上面三种方法都是可以的,但前两种方法会阻塞进程,直到smplayer程序结束,而第三种方法则不会阻塞进程,可以多任务运行。
 还有,我们知道qt在运行的时候,要启动qws(qtwindows server),如果用前面两种方法,则smplayer运行的时候,要新开启一个qws,否则不能运行;而用第三种方法,则不需要再开启qws,它和HelloQt4共用一个qws,这样,在一个窗口里可以看到这两个程序。

五、额外记录

1. Ghostscript软件参数进一步学习
(1)PDF→jpg的转换
	使用如下gs命令可以把pdf文件转换为jpg文件: 
./gs -sDEVICE=png16m  -dSAFER -dBATCH -dNOPAUSE -sOutputFile=figure-%03d.jpg printer_test.pdf -c quit
	-sOutputFile参数告诉gs输出文件名是什么。当要输出到一个文件时,-dSAFER -dBATCH –dNOPAUSE参数是必须的,也可使用相同的方法生存png格式的图像。-sOutputFile=figure-%03d.jpg中的%03表示把pdf文件的第一页输出到文件名为figure-001.jpg的文件中。
(2)gs命令的ijs接口
	使用ijs接口,用户可以增加或升级已有的驱动。常用命令方式如下:
gs -dSAFER -sDEVICE=ijs -sIjsServer=hpijs -sDeviceManufacturer=HEWLETT-PACKARD -dSAFER -sDeviceModel='DESKJET 990' -dIjsUseOutputFD -sOutputFile=/dev/usb/lp1 -dNOPAUSE -- examples/tiger.eps
	其中-sIjsServer用来指定ijs服务,即打印驱动(过滤器) ,如hpijs,这个时候gs将新增一个驱动,并使用ijs协议联系一起。路径不一定是绝对路径,可以是环境变量中包括的路径里面的应用程序。-dIjsUseOutputFD 、-dSAFER等参数一定要指定。
	注意一般在输入之前必须跟-sDEVICE指明输出设备。
(3)-o参数
	gs  -sDEVICE=jpeg  -o  out-%d.jpg  somefile.ps					  等价于:
gs  -sDEVICE=jpeg  -sOutputFile=out-%d.jpg  -dBATCH  -dNOPAUSE  somefile.ps
(4)设置纸张大小
	-sPAPERSIZE参数设置,如-sPAPERSIZE=a4,也可用如下参数设置页大小:
	-dDEVICEWIDTHPOINTS=w -dDEVICEHEIGHTPOINTS=h
(5)关于PDF文件的转换
	Pdf特定页的打印
gs -sDEVICE=ijs -sIjsServer=hpijs -dIjsUseOutputFD -sDeviceManufacturer="HEWLETT-PACKARD" -sDeviceModel="deskjet 5550" -r300x300 -dNOPAUSE -dSAFER -dFirstPage=2 -dLastPage=3 -sOutputFile="/dev/lp0" /home/fengel/test_5?.pdf   -c quit
	Pdf合适页大小设置
-dPDFFitPage参数
(6)Ghostscript查找文件
	首先按绝对路径“/”找,然后它尝试用名字打开文件,否则就按如下顺序查找:
如果启用-p开关,就在当前目录找
如果启动-I开关,就在具体目录中找
GS_LIB 环境变量指定的目录
PostScript Level 2 resources和寻找字体
(7)命令行参数
这里只列出了类别,详细介绍可查看文档中的How to use Ghostscript部分。
输入控制
文件搜索
设置参数
渲染参数
页设置参数
字体相关参数
资源相关参数
相互联系的参数
设备和输出选项参数
EPS参数
ICC颜色参数
其他参数