我熟悉内核模块,并且听说过 IPP、PPD、PS、PCL、PDL 打印机驱动程序概念。我读到有“通用的“Mac/Windows 上预装了打印机驱动程序,因此您无需安装自定义驱动程序,并且可以实现无缝的用户体验。
有鉴于此,我正在寻找这些通用驱动程序可能是什么样子(假设它是一个内核模块)。没有找到任何关于该主题的示例,但找到了这些存储库:
- https://github.com/koenkooi/gutenprint
- https://github.com/OpenPrinting/cups-filters
- https://github.com/watson/ipp-printer
- https://github.com/apple/cups
与这些相关,我在Gutenprint中找到:src/main/print-lexmark.c和src/main/canon-printers.h,其中有这些cap_t
~table~ 东西,这些东西似乎具有编码的功能个别型号的打印机。这似乎有很多工作要做。 Gutenprint 中有大量支持的打印机列表这里。
我的问题分为几个部分:
- 如果这些打印机规格/功能(如上面的 2 个链接)是逆向工程,或从某种规范中获得。 (有点离题)。
- 其中,在上面列出/编号的 4 个 GitHub 存储库中的任何一个中,“通用的" 存在 PCL、PCD 或 PPD 等设备驱动程序。
- 我应该寻找驱动程序的概念:PPD、PCL、PDL、PS、IPP。听起来 PPD 是打印机定义的配置格式,而 PS/PCL(也许还有 PDL)是打印机定义的配置格式。主要的驱动程序规范语言/格式,IPP是一个驱动程序协议但没有得到广泛支持。 PS适用于高质量照片,而PCL适用于标准文档打印。这就是为什么我专门关注 PCL,而不是 PS,但我没有在 GitHub 上找到任何“通用 PCL 驱动程序”之类的东西,并且不确定这是否是我应该寻找的。
- 否则,如果在我提供的驱动程序之外存在任何开源打印机驱动程序,则提供实现示例。
答案1
PCL 和 PostScript (PS) 不是驱动器规格但页面描述语言(PDL):如果您的打印机支持其中任何一种,则打印机驱动程序的工作是将打印作业转换为 PCL 或 PS。
PCL和PS都可以做出高质量的照片。但 PCL 实际上对于大型高分辨率位图图像更有效,尤其是当计算机的主处理器比打印机的处理器强大得多时(当今的常见情况)。 PostScript 在文本和矢量图形方面处于最佳状态:它可以将大部分缩放/渲染过程卸载到实际打印机上,这在过去单独的激光打印机可能拥有与其他打印机一样多的内存和处理能力时非常有用。电脑。对于矢量图形,PostScript 可以仅传输绘制图形所需的命令,然后打印机将使用其完整的原始分辨率自行复制图形。
驱动程序需要考虑打印机的可用功能:例如,如果打印作业的某些部分一直到达纸张边缘,但打印机在无法打印的纸张边缘处需要一定的最小边距,它需要决定是否缩放整个页面以适应,将部分作业移动到另一页或只是剪掉不可打印的边缘。将颜色数据发送到只能产生灰色阴影的打印机只是浪费时间(如果是网络打印机,还浪费网络带宽)。 PPD(= PostScript 打印机描述)文件提供此打印机型号特定的信息。
Unix/Linux 打印机驱动程序通常是不是内核模块:相反,它们只是常规的用户空间程序(甚至脚本),将发送到其标准输入的打印作业转换为标准输出上适当的页面描述语言。在 CUPS 术语中,这称为筛选。
如果本地连接的打印机使用非标准 USB 端点结构(某些情况下为“基于主机的打印”)或某些其他特殊协议,则驱动程序也可能包含处理特殊通信协议的程序。在 CUPS 术语中,这称为“端口监视器”。 CUPS 包括一些常见情况的端口监视器,但打印驱动程序可以提供定制的端口监视器。
这打印后台处理程序守护进程(现在,大多数cups
)的工作是从用户那里接收打印作业,识别其格式,应用任何必要的转换(通过过滤器程序,也可能称为“驱动程序”),最后将结果输出到打印机设备(可以选择使用针对该特定打印机型号定制的端口监视器)。
CUPS 具有内置的“通用驱动程序”,通过使用 PPD 文件(PostScript 打印机描述)提供打印机特定的详细信息来处理大多数 PostScript 打印机。杯也扩展了 PPD 文件规范因此非 PostScript 打印机也可以通过 PPD 文件来描述。在这种情况下,PPD 扩展指定 CUPS 应运行的一个或多个额外程序,以将打印作业从 CUPS 已知的格式之一转换为打印机可接受的任何数据格式。
对于您的编号问题:
1.) 最广泛使用的页面描述语言(如 PCL 和 PS)已经发布了规范文档:很久以前,当实际的纸质手册随硬件一起提供时,规范手册甚至可能已包含在打印机中。
其他语言和协议,如许多用于“基于主机的打印机”的语言和协议,都已被逆向工程化。是的,这是一个巨大的努力。
2.) 在https://github.com/apple/cups/tree/master/filter,您将找到 CUPS 通用 PostScript 和光栅(= 原始位图数据)驱动程序。还有读取 PPD 文件的代码。
3.)请参阅我上面回答的介绍性文字。
4.)开放印刷网拥有庞大的打印机型号数据库及其开源打印驱动程序解决方案。如果特定打印机存在开源驱动程序解决方案,我希望很可能在那里找到它 - 或它的链接。