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