SDB:Printing to PDF
安全警告!
只有在了解后果的情况下才执行此操作,尤其是在运行多用户系统时。这可能会导致服务拒绝(假脱机目录填满,导致硬盘空间耗尽),数据隐私泄露(任何人都可以读取 PDF),或者精心设计的打印任务可能会导致安全问题。本文适用于 Linux 下 CUPS 版本高达 2.x,以及那里的传统过滤系统和后端。
如今的无驱动程序打印工作流程则大不相同。
从桌面打印到 PDF
根据安装的桌面系统(特别是 Gnome 与 KDE),以及桌面系统的版本和安装的附加软件包,桌面系统可能已经提供了开箱即用的打印到 PDF 或 另存为 PDF 功能,因此不需要 CUPS-PDF。
下载并安装 cups-pdf 包
访问 软件搜索页面,并搜索cups-pdf适用于您 openSUSE 版本的软件包。
最好使用“打印”仓库中的软件包。
请阅读“打印”项目描述,网址为 https://build.opensuse.org/project/show?project=Printing
要手动从“打印”仓库下载 RPM 包,请使用 http://download.opensuse.org/repositories/Printing/ 并进入与您的特定系统和体系结构(特别是 32 位 i586 与 64 位 x86_64)匹配的子目录。
如果您从任何任意仓库安装软件,请确保您真正了解自己在做什么。这真的是您期望的确切软件吗?它真的与您当前运行的系统匹配吗?
为 cups-pdf 设置打印队列
必须设置一个打印队列,以便用户应用程序可以打印,请参阅 Concepts printing。在这种情况下,将设置一个特殊的打印队列,该队列不会打印到真实的打印机设备,而是将打印输出存储为 PDF 文件。
可以使用任何符合 CUPS 的打印机设置工具。
- 应选择“虚拟 PDF 打印机 (CUPS-PDF)”,它使用 CUPS 设备 URI “cups-pdf:/”。
- 匹配的打印机驱动程序是“通用 CUPS-PDF 打印机”(在制造商“通用”下),它使用 PPD 文件“/usr/share/cups/model/CUPS-PDF.ppd”。
作为 root 用户通过 lpadmin 命令,可以如下操作(请参阅 SDB:CUPS in a Nutshell 中的“如何完全符合 CUPS 设置打印队列”):
lpadmin -h localhost -p cups-pdf -v cups-pdf:/ -P /usr/share/cups/model/CUPS-PDF.ppd -E
或者,如果您使用 CUPS Web 前端设置打印队列,则过程如下(具体取决于 CUPS 版本可能会有所不同):
- 使用 Web 浏览器(如 Firefox)打开 CUPS Web 前端 https://:631。
- 在提示身份验证时,使用“root”用户名和密码(或具有 CUPS 管理员权限的任何用户名)。
- 选择“管理”选项卡,然后单击“查找新打印机”。
- 您应该看到 虚拟 PDF 打印机 (CUPS-PDF),单击“添加此打印机”,然后单击“继续”。
- 在下一个屏幕“CUPS-PDF 的制造商”,选择 通用,然后单击“继续”。然后选择 通用 CUPS-PDF 打印机,然后单击“添加打印机”。
- 可选地,在 PDF:General, 页面大小设置下,将默认页面大小更改为匹配本地化设置(例如 A4 与 US Letter)。
调整 cups-pdf 的权限
cups-pdf 提供了 CUPS 后端 /usr/lib/cups/backend/cups-pdf,该后端需要 root 权限才能为提交打印作业的用户设置 PDF 的文件所有权。请参阅 SDB:CUPS in a Nutshell 中的“什么是 CUPS 后端以及它是如何工作的”。
默认情况下,cups-pdf 的权限应正确。
在特殊情况下,您可能需要运行以下命令作为 root,以便以“root”身份运行 /usr/lib/cups/backend/cups-pdf
chmod u=rwx,go= /usr/lib/cups/backend/cups-pdf
因为从 CUPS 1.2 开始,没有世界可执行权限的后端将以 root 用户身份运行,请参阅“man backend”。
对于 CUPS 1.1,您可能需要使用类似如下命令:
chmod u=rwxs,go= /usr/lib/cups/backend/cups-pdf
甚至(当 CUPS 1.1 cupsd 以用户“lp”身份运行时):
chown root:lp /usr/lib/cups/backend/cups-pdf chmod u=rwxs,g=x,o= /usr/lib/cups/backend/cups-pdf
以便以 setuid root 程序运行 CUPS 后端。
cups-pdf 的配置选项
配置选项存储在/etc/cups/cups-pdf.conf文件中。有关一些提示和说明,请参阅/usr/share/doc/packages/cups-pdf/README.
PDF 输出位置
PDF 文件的默认位置是
/var/spool/cups-pdf/yourusername/
要更改此设置,请编辑/etc/cups/cups-pdf.conf文件。例如,要在每个用户的主目录的“桌面”目录中存储 PDF 文件,您可以设置
Out ${HOME}/Desktop
在这种情况下,请记住打印系统无法在任意位置存储文件,请参阅下面的“打印为 PDF 与另存为 PDF 的背景信息”。
外部链接
打印为 PDF 与另存为 PDF 的背景信息
用户应用程序(包括用户打印对话框程序)在用户的本地机器上作为用户的进程在用户的 ID 下运行(即它们在用户的个人环境中运行)。因此,用户应用程序可以将文件(例如 PDF)存储在用户的主目录中(或用户在应用程序中指定的任何位置)。
另一方面,打印系统的进程不在用户的 ID 下运行,并且在网络中打印的情况下,它们甚至在网络中的任意不同机器上运行。
因此,打印系统无法将文件存储在提交打印作业的用户指定的任何位置。
在单用户独立系统上,打印到“PDF 打印机”并将 PDF 存储在预定义的文件位置是可以工作的,但这可能会在多任务多用户网络系统中引起问题。
一些应用程序提供“打印到(PostScript/PDF)文件”功能。这是由用户应用程序本身完成的。当用户应用程序不将其打印输出发送到打印队列而是将其存储到用户喜欢的任何文件中时,不涉及打印系统。
“打印到文件”一词具有误导性,因为实际上发生的是“另存为(PostScript/PDF)文件”。
造成混淆的原因可能是“另存为 PS/PDF”功能通常没有在“文件”菜单中找到。相反,可以在“打印”菜单中找到“打印到文件”选项,幸运的是,这会生成 PostScript 或 PDF 文件,因此对于用户来说,看起来就像在想要执行“另存为 PS/PDF 文件”时进行打印一样。
严格来说,“另存为 PS/PDF”和“打印到文件”在结果方面并不相同。只有“另存为 PS”才能保证结果是 PostScript 文件,而“另存为 PDF”才能保证结果是 PDF 文件。
与此相反,“打印到文件”可能会产生应用程序生成的任何任意打印机特定的(二进制)数据作为打印作业发送。
只有通过运气(更准确地说,因为 PostScript 或 PDF 是 Unix/Linux 应用程序生成打印数据时的常用数据格式,请参阅 Concepts printing)才会在没有“另存为 PS/PDF”功能的情况下滥用“打印到文件”。
不能保证以后可以在任何打印机上打印这样的 PostScript 或 PDF 文件,因为它们可能是特定于打印机的 PostScript 或特定于打印机的 PDF。例如,OpenOffice 众所周知会生成特定于打印机的 PostScript,因此这样的 PostScript 文件可能只能在 OpenOffice 为其制作的打印机上打印。
当应用程序中没有“另存为 PS/PDF”功能时,在独立系统上的一种可能的解决方法是设置一个“PDF 打印机”,该打印机将 PDF 存储在预定义的文件位置,以希望获得与打印机无关的 PDF 文件。
真正的解决方案是在应用程序中实现一个正确实现的“另存为 PDF 文件”功能,该功能确实会生成与打印机无关的 PDF 文件。
与打印机无关的 PDF 文件应该是 PDF/A - 最好是 PDF/A-1 - 或 PDF/X(请参阅 Concepts printing 中的“PostScript 与 PDF 作为标准打印作业格式”)。