此存储库包含用于 PostScript 打印机的打印机应用程序,该应用程序使用 PAPPL 支持从多个操作系统进行 IPP 打印。此外,它还使用cups-filters 2.x(libcupsfilters、libppd中的过滤器函数)和pappl-retrofit(在打印机应用程序中封装经典CUPS驱动程序)的资源。这项工作(或者现在的 pappl-retrofit 的代码)源自 hp-printer-app。
欢迎您的贡献。请发布问题并拉取请求。
非光栅打印机应用程序:目标格式是 PostScript,一种高级/矢量格式。接受 PostScript 或 PDF 中的输入数据,并完成所需的转换,无需任何中间光栅步骤。
使用cups-filters 2.x 的新过滤器功能的打印机应用程序。过滤器函数是源自 CUPS 过滤器的库函数,自 2000 年推出 CUPS 以来,经过数十年的发展和完善。
经典 CUPS 驱动程序的改进型打印机应用程序,在本例中是用于 PostScript 打印机的最简单的 PPD 文件形式。它列出 Snap 中包含的存储库中的 PPD 文件,加载实际打印机所需的 PPD,从 PPD 中提取选项以在 Web 界面中显示它们,接受作业设置作为 IPP 属性,并正确插入 PPD 提供的 PostScript 代码进入输出数据流。
不传递原始(输入格式是打印机的本机格式)作业的打印机应用程序。为了确保 PPD 文件的 PostScript 代码始终插入到输出流中,我们将打印机的本机格式称为“application/vnd.printer-specific”,该格式不作为输入格式存在,因此强制使用“application/postscript”输入通过 pstops() 过滤函数。
可扩展的打印机应用程序:用户可以通过管理 Web 界面添加 PPD 文件以支持其他打印机型号。
其他属性有:
为了避免重新发明用于分叉到子进程的代码,以便我们可以通过一系列过滤器传递数据,我们创建一个过滤器函数将数据发送到打印机并形成实际转换过滤器的链函数(pstops() 和 pdftops() 之一)与此过滤器函数一起使用 filterChain() 过滤器函数。
对于 PWG/Apple 光栅输入,我们使用光栅回调,以便进行流式处理,从而允许大型甚至无限长的作业。我们使用 libppd 函数在输出流中插入 PPD 选项的 PostScript 代码,并使用 filterPOpen() 函数为 libppd 函数创建文件描述符以将数据发送到设备。
PostScript 打印机应用程序 Snap 内置了 foomatic-db 和 HPLIP 项目的所有 PostScript PPD 文件,因此大多数 PostScript 打印机 PPD 通常随 Linux 发行版一起提供。为了避免大量 PPD 增大 Snap 的大小,我们使用 pyppd 对其进行高度压缩。请注意,某些 PPD 使用某些 CUPS 过滤器来实现额外功能。这些过滤器包含在 Snap 中,因此支持额外的功能(在大多数情况下是 PIN 保护打印)。用户可以添加额外的 PPD,而无需重建 Snap(见下文)。
我们首先使用打印机的 IEEE-1284 设备 ID 来识别它是 PostScript 打印机(通过 CMD: 字段)来查看它是否受支持,然后才通过 make 和 model 检查我们是否使用 PPD 明确支持它。没有 PPD 的 PostScript 打印机会分配一个通用 PPD。通过在查找 make/model 之前检查 CMD: 字段,我们可以确保如果 PostScript 是由附加模块提供的,则该模块实际上已安装。
标准作业 IPP 属性映射到最适合它们的 PPD 选项设置,以便用户可以从仅支持标准 IPP 属性且无法检索 PPD 选项的任何类型的客户端(例如电话或 IoT 设备)进行打印。纸盒、介质尺寸、介质类型和双面打印可以轻松映射,但当涉及到颜色和质量时,它会变得更加复杂,因为 PPD 文件中的相关选项差异很大。在这里,我们使用一种算法,该算法可以自动(想要手动编辑约 10000 个 PPD 的作业)为print-color-mode
( color
/ monochrome
)、 print-quality
( draft
/ normal
/)的每种组合找到正确的选项设置集。 high
),以及当前打印机 PPD 中的print-content-optimize
( auto
/ photo
/ graphics
/ text
/ text-and-graphics
)。因此,您可以轻松获得打印机的全部质量或速度,而无需处理特定于打印机的选项设置(仍可通过 Web 管理界面访问原始选项)。
给定打印机型号(打印机应用程序中的“驱动程序”)的打印机功能在打印机应用程序中设置的打印队列的整个生命周期中并不是静态的。用户可以通过网络管理界面中的页面配置打印机上安装的硬件配件(额外纸盘、双面打印单元、整理器等),并且打印机应用程序更新驱动程序数据结构以及打印机功能。对 get-printer-attributes IPP 请求的响应得到适当更新。
PostScript 是一种成熟的编程语言,许多 PostScript 打印机允许查询选项设置以及执行适当 PostScript 代码的可安装硬件附件的存在。如果可以查询某个设置,制造商会将所需的 PostScript 代码与可查询选项一起放入 PPD 文件中。打印机应用程序的 Web 界面支持这些查询。
可用的打印机设备是通过 CUPS 的后端而不是 PAPPL 自己的后端发现(和使用)的。通过这种方式,可以使用具有兼容性问题的 USB 打印机的怪异解决方法(并且是可编辑的),并且除了套接字(通常端口 9100)之外,PostScript 输出还可以通过 IPP、IPPS(加密!)和 LPD 发送到打印机。可以配置 SNMP 后端(社区、地址范围)。
如果您有不寻常的系统配置或个人防火墙,您的打印机可能不会被发现。在这种情况下,完全手动输入“网络打印机”与主机名/IP 字段相结合会很有帮助。
在“添加 PPD 文件”页面上已添加的用户 PPD 文件列表中,标记哪些文件实际由打印机应用程序中设置的打印机使用,以避免用户删除这些文件。
供应商选项的人类可读字符串(需要 PAPPL 的支持:问题 #58:本地化支持)
国际化/本地化(需要 PAPPL 的支持:问题 #58:本地化支持)
通过 ps_status() 函数检查 SNMP 墨水量(需要 PAPPL 的支持:问题 #83:CUPS 通过后端进行 IPP 和 SNMP 墨水量轮询,PAPPL 应该具有这方面的功能)
cups-filters 的构建选项,无需 libqpdf 和/或 libppd 即可构建,前者将允许创建此打印机应用程序的快照,而无需下载和构建 QPDF
要运行并使用此打印机应用程序,只需从 Snap Store 安装它即可:
sudo snap install --edge ps-printer-app
然后按照以下说明进行设置。
要自己构建 Snap,请在此存储库的主目录中运行
snapcraft snap
这将下载所有需要的包并构建 PostScript 打印机应用程序。请注意,PAPPL(即将推出的 1.0)和 cups-filters(即将推出的 2.0)是直接从其 GIT 存储库中提取的,因为还没有合适的版本。这也可能导致该打印机应用程序突然不再构建。
注意:Ubuntu Groovy (20.10) 中存在一个错误,导致其无法构建 Snap,请参阅 Snapcraft 论坛上的讨论。问题已经解决了,但还没有进入 Groovy。
任何较旧的(如 20.04)或较新的(如 21.04)Ubuntu 版本都应该可以工作。
安装生成的 Snap 运行
sudo snap install --dangerous ps-printer-app_1.0_amd64.snap
打印机应用程序将作为服务器守护程序自动启动。
进入网页界面
http://localhost:8000/
使用 Web 界面添加打印机。提供名称,选择发现的打印机,然后选择品牌和型号。还可以设置已安装的附件、加载的媒体和选项默认值。附件配置和选项默认值也经常会从打印机获取。
然后使用以下命令打印 PDF、PostScript、JPEG、Apple Raster 或 PWG Raster 文件
ps-printer-app FILE
或使用 CUPS 进行打印,CUPS(以及 cups-browsed)发现使用此打印机应用程序设置的打印机并将其视为无驱动 IPP 打印机(IPP Everywhere 和 AirPrint)。
您还可以通过使用 Web 界面中的“添加 PPD 文件”按钮或手动复制 PPD 文件来添加 PPD 文件,而无需重建 Snap:
sudo cp PPDFILE /var/snap/ps-printer-app/common/ppd/
手动复制(或删除)PPD 文件后,您需要重新启动服务器或在 Web 界面中,在“添加 PPD 文件”页面上单击底部的“刷新”按钮。这会将更改添加到内部驱动程序列表中。
在“添加打印机”页面的下拉菜单中选择驱动程序,用户添加的PPD 文件被标记为“USER-ADDED”。设置具有自动驱动程序选择的打印机时,首选用户添加的 PPD 文件。
上面命令行中的PPDFILE
不仅可以是单个 PPD 文件,还可以是任意数量的单个 PPD 文件、包含 PPD .tar.gz
文件(任意目录结构)以及通常放入/usr/lib/cups/driver
中的 PPD 生成可执行文件/usr/lib/cups/driver
。您还可以在/var/snap/ps-printer-app/current/ppd/
中创建任意子目录结构,其中包含上述类型的文件。只需确保不要将任何可执行文件放在那里,以执行除列出和生成 PPD 文件之外的任何其他操作。
请注意,使用 Web 界面,您只能管理/var/snap/ps-printer-app/current/ppd/
本身中的单个 PPD(未压缩或使用gzip
压缩)。不显示存档、可执行文件或子目录,并且不接受适当的上传。这尤其可以防止添加没有 root 权限的可执行文件。
任何添加的 PPD 文件都必须适用于 PostScript 打印机,因为非 PostScript PPD 文件适用于 CUPS 驱动程序,因此它们需要其他文件才能工作,并且此打印机应用程序不支持此类文件。如果上传此类文件,“添加 PPD 文件”页面会显示警告。
看
ps-printer-app --help
以获得更多选择。
使用“-o log-level=debug”参数在终端窗口中进行详细日志记录。
您可以将文件添加到/var/snap/ps-printer-app/common/usb/
以获得其他 USB 怪异规则。编辑现有文件仅用于快速测试,因为它们会在 Snap 的每次更新时被替换(以引入新规则)。
您可以编辑/var/snap/ps-printer-app/common/cups/snmp.conf
文件来配置 SNMP 网络打印机发现。
您还可以进行“快速而肮脏”的构建,无需捕捉,也无需在系统中安装 PAPPL、cups-filters 2.x 和 pappl-retrofit。您需要一个包含 PAPPL 最新 GIT 快照、cups-filters 最新 GIT 快照和 pappl-retrofit 最新 GIT 快照(每个分支的主分支)的目录。它们都需要编译( ./autogen.sh; ./configure; make
),不需要安装。还要安装所有需要的库的头文件(安装“libcups2-dev”就可以了)。
在 ps-printer-app.c 目录中运行命令行
gcc -o ps-printer-app ps-printer-app.c $PAPPL_SRC/pappl/libpappl.a $CUPS_FILTERS_SRC/.libs/libppd.a $CUPS_FILTERS_SRC/.libs/libcupsfilters.a $PAPPL_RETROFIT_SRC/.libs/libpappl-retrofit.a -ldl -lpthread -lppd -lcups -lavahi-common -lavahi-client -lgnutls -ljpeg -lpng16 -ltiff -lz -lm -lusb-1.0 -lpam -lqpdf -lstdc++ -I. -I$PAPPL_SRC/pappl -I$CUPS_FILTERS_SRC/ppd -I$CUPS_FILTERS_SRC/cupsfilters -I$PAPPL_RETROFIT_SRC/pappl/retrofit -L$CUPS_FILTERS_SRC/.libs/ -L$PAPPL_RETROFIT_SRC/.libs/
还有一个 Makefile,但这需要将 PAPPL、cups-filters 2.x 和 pappl-retrofit 安装到您的系统中。
跑步
./ps-printer-app --help
运行非快照版本时,默认情况下会在以下位置搜索 PPD 文件:
/usr/share/ppd/
/usr/lib/cups/driver/
/var/lib/ps-printer-app/ppd/
使用 Web 界面中的“添加 PPD 文件”页面添加 PPD 文件时,将使用最后一个路径。
您可以设置PPD_PATHS
环境变量来搜索其他位置:
PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
只需将任意数量的路径的冒号分隔列表放入变量中,最后一个始终由“添加 PPD 文件”页面使用。建议创建包装脚本。
此打印机应用程序使用 CUPS 的后端而不是 PAPPL 的后端,这意味着对于 USB 打印机,使用 CUPS 的 USB 怪异解决方法来解决兼容性问题,网络打印机还可以与 IPP、IPPS 和 LPD 协议一起使用,并且 SNMP 打印机发现是可配置的。
如果需要,可以编辑/usr/share/cups/usb
中的 USB Quirk 规则和/etc/cups/snmp.conf
文件。
确保您安装了 CUPS(至少是其后端)。
您还需要 Ghostscript 来打印 PDF 作业。
要访问测试页testpage.ps
请使用 TESTPAGE_DIR 环境变量:
TESTPAGE_DIR=`pwd` PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
或者您自己创建测试页(PostScript、PDF、PNG、JPEG、Apple Raster、PWG Raster):
TESTPAGE=/path/to/my/testpage/my_testpage.ps PPD_PATHS=/path/to/my/ppds:/my/second/place ./ps-printer-app server
PostScript 打印机应用程序版权所有 © 2020,作者:Till Kamppeter。
它源自 HP PCL 打印机应用程序,这是使用 PAPPL 的光栅打印机应用程序的第一个工作模型。它可以在这里找到:
https://github.com/michaelrsweet/hp-printer-app
HP PCL 打印机应用程序版权所有 © 2019-2020,作者:Michael R Sweet。
该软件根据 Apache 许可证版本 2.0 获得许可,但允许链接到 GPL2/LGPL2 软件(如旧版本的 CUPS)。有关详细信息,请参阅文件“许可证”和“通知”。