lp
在类Unix系统上(一般为Linux跟Mac平台),使用lp命令来打印文件。
lp命令在Linux跟Mac平台,使用的是cups服务(没有其它的),来支持打印。
CUPS
可以参考这篇文章
lp通常支持两种文件格式的打印
PSPDF
PS
PostScript是一种编程语言,最适用于列印图像和文字(无论是在纸、胶片或非物质的CRT都可)。用现今的行话讲,它是页面描述语言。它既可以像程序代码一样具有可读性,又能表示出可任意放大和缩小的矢量图。
PDF(Portable Document Format的简称,意为“可携带文档格式”),是由Adobe Systems用于与应用程序、操作系统、硬件无关的方式进行文件交换所发展出的文件格式。PDF文件以PostScript语言图象模型为基础,无论在哪种打印机上都可保证精确的颜色和准确的打印效果,即PDF会忠实地再现原稿的每一个字符、颜色以及图象。
Qt对打印的支持
Qt在Linux上对PS跟PDF格式都是支持的,QPrinter提供了对应的接口。
(PS格式相关的接口在Qt5中已经被废弃)
相关的具体API支持可以参考自己使用的Qt版本
void QPrinter::setOutputFormat(QPrinter::OutputFormat format)
命令详解
在Linux上,你可以使用WPS,打开,点击ctrl+p调出打印对话框,然后点击属性,就可以看到当前打印机支持的属性了。
这些属性,基本上都可以通过lp命令来使用。
lp -i request-ID [-c] [-m] [-p] [-s] [-w] [-d destination] [-f form-name] [-H special-handling] [-n number] [-o options] [-p pagenumbers] [-q priority-level] [-S character-set | print-wheel] [-t title] [-T content-Type [-r]] [-y mode-list]
属性
-O 属性
小结
WPS在Linux上打印实际上也是先生成一个pdf,然后把pdf文件扔给cups。cups再去调用驱动来处理对应的pdf文件,然后扔给打印机(硬件)
如果觉得WPS另存为生成的pdf文件过大的话,可以尝试使用WPS的打印到文件这个功能。也是同样的生成一个PDF。
如果你不连打印机,只有打印机驱动的话,可以直接用wps打印,然后进入root用户
进入目录/var/spool/cups
下,会发现生成一个中间缓存文件,这个实际上就是一个pdf文件。这个文件跟WPS打印到文件实际上是一样的。
安装Linux打印驱动的时候,不只是有ppd驱动文件,还会有对应的厂商的二进制文件来处理对应的pdf文件,扔给打印机的,一般厂商都会放到/usr/lib/cups/filter
文件夹下
目前国内打印机在Linux平台上,支持的最好的就是奔图了。他们的研发水平我还是比较认可的。
cups的一个bug
目前有社区用户反馈说,如果文件目录过深的话,wps是打印不出来文件的。吓得我赶紧看了看发现并不是wps的问题,然后跟了跟cups的源码,发现cups对pdf中title的处理只有256个字节。
超过256个字节居然就不给打印了。。。
也不做个兼容啥的,我也是服了。
而且这还是Apple维护的。。。。
代码在这里
/apple/cups/blob/82e3ee0e3230287b76a76fb8f16b92ca6e50b444/backend/lpd.c
int/* O - Exit status */main(int argc,/* I - Number of command-line arguments (6 or 7) */char *argv[]) /* I - Command-line arguments */{const char *device_uri; /* Device URI */char scheme[255], /* Scheme in URI */hostname[1024], /* Hostname */username[255], /* Username info */resource[1024], /* Resource info (printer name) */*options, /* Pointer to options */*name, /* Name of option */*value, /* Value of option */sep, /* Separator character */*filename, /* File to print */title[256]; /* Title string */
这是关键代码
title[256];/* Title string */
我本以为,CUPS是为了节省空间。所以就给了256个字节,还想说,嗯,节省空间。
直到我看到了
char mailtoCc[1024]; /* Cc email address */char mailtoFrom[1024]; /* From email address */char mailtoReplyTo[1024]; /* Reply-To email address */
这就是完全扯淡了
这篇文章,算是我对上一篇Qt中的CUPS源码解析的一个补充吧。