SDB:How to Report a Printing Issue

跳转到:导航搜索



情况

您遇到了打印问题并希望寻求帮助或报告错误,但您不知道必须提供哪些信息,以便其他人可以帮助您或理解您的错误报告。

您可以选择诊断打印问题的根本原因。以下描述了一些基本测试。

本文适用于 Linux 下 CUPS 版本高达 2.x,以及那里的传统过滤系统和后端。

如今的无驱动程序打印工作流程则大不相同。

基础

请参阅 Concepts printing 以获取有关打印基础知识的信息。

不要假设别人了解您的特定环境和您所做的事情。

无论如何,请提供有关您的特定环境和您所做事情的足够信息,并通常提供 CUPS 调试消息。

另一方面,不要通过提供大量未经请求的信息来过度操作。

通常来说,关于“如何有效地报告错误”,建议您查看 http://www.chiark.greenend.org.uk/~sgtatham/bugs.html,其中包含以下内容(摘录)

In a nutshell, the aim of a bug report is to enable
the programmer to see the program failing in front of them.

When you report a bug, you are doing so because you want the bug fixed.
There is no point in swearing at the programmer or being deliberately
unhelpful: it may be their fault and your problem, and you might be
right to be angry with them, but the bug will get fixed faster
if you help them by supplying all the information they need.
Remember also that if the program is free, then the author is
providing it out of kindness, so if too many people are rude to them
then they may stop feeling kind. 

Give the programmer some credit for basic intelligence: if the
program really didn't work at all, they would probably have noticed.
Since they haven't noticed, it must be working for them.
Therefore, either you are doing something differently from them,
or your environment is different from theirs.
They need information; providing this information is the purpose
of a bug report. 

Providing your own diagnosis might be helpful sometimes,
but always state the symptoms. The diagnosis is an optional extra,
and not an alternative to giving the symptoms.

By all means try to diagnose the fault yourself if you think you can,
but if you do, you should still report the symptoms as well.

首先,至关重要的是提供清晰的症状描述和您的环境以及您所做的事情,而不要混入任何结论或个人意见。

您可以选择尝试诊断打印问题的根本原因,但必须严格分开。有关一些基本测试,请特别参见“从应用程序程序打印失败时的基本测试”、“测试应用程序提交给 CUPS 的内容是否正确”和“在虚拟通用 PostScript 打印机上模拟打印输出”部分。

不要偏离主题,抱怨或倾诉您对问题的个人沮丧。尽可能坚持事实,专注于提供症状和您的环境以及您所做事情的清晰描述。

无论如何,务必说明确切的打印机型号名称

即使您 100% 确定您的特定问题与您的特定打印机型号无关,也请说明型号。

提供打印机设备上标明的确切型号名称。例如,如果设备标有“ACME FunPrinter 1000 XL+”,则提供其完整名称,而不是任何缩写,例如“ACME 1000 XL”,因为可能存在不同的型号“ACME FancyPrinter 1000 XL”,即使像“+”这样小的细节也可能影响特定型号是否有效。

无论如何,务必说明打印机是如何连接的

即使您 100% 确定您的特定问题与打印机连接到您的系统的方式无关,也请提供该信息。

YaST“添加新打印机配置”或“修改”对话框(请参阅 YaST Printer)或任何设置工具显示连接方式是什么?

或者更准确地说:从您提交打印作业的 Linux 系统上的 CUPS 设备 URI 是什么?即,命令的输出是什么

lpstat -v <queue_name>

前提是您已经设置了打印机(将 <queue_name> 替换为您的打印队列名称)。

如果打印机设置失败,请提供命令的输出(以 root 用户身份运行)

lpinfo -v

该命令让 CUPS 自动检测打印机(但并非所有打印机都可以自动检测)。

如果您的打印机未自动检测到,请准确描述它是如何连接到您提交打印作业的 Linux 系统的。

例如,通过 USB 电缆直接连接,或通过中间的任何类型的适配器间接连接(例如,USB 转并行端口适配器电缆或互联网路由器盒或笔记本电脑扩展坞),或通过传统的以太网电缆直接通过网络连接,或通过中间的任何网络内容间接连接(例如,WLAN 或打印服务器)。

如果您的打印机连接间接且未被“lpinfo -v”自动检测到,请尝试直接连接它(即,通过 USB 电缆或传统的以太网电缆直接连接)。

特别是对于网络打印机,请参阅 SDB:Printing via TCP/IP network

始终说明使用的打印机驱动程序

不要认为您使用的确切驱动程序与您的特定打印机型号无关。

YaST“添加新打印机配置”或“修改”对话框(请参阅 YaST Printer)或任何设置工具显示驱动程序是什么?

或者更准确地说:PPD 中 /etc/cups/ppd/<queue_name>.ppd(将 <queue_name> 替换为您的打印队列名称)中的 NickName 和 cupsFilter 条目是什么?即,命令的输出是什么

egrep 'NickName|cupsFilter' /etc/cups/ppd/<queue_name>.ppd

前提是您已经设置了打印机。如果打印机设置失败,请参见下文。

您使用的是 openSUSE 打印机驱动程序软件包中的驱动程序(请参阅 Concepts printing),还是使用其他驱动程序软件,例如来自打印机制造商的驱动程序?

如果您使用其他驱动程序软件,请提供您获取该其他驱动程序软件的 URL。

始终说明 openSUSE 版本

始终说明您使用的 openSUSE 版本以及您如何安装的。

它是现有旧 openSUSE 版本的更新(如果是,是哪个确切的旧版本),还是从头开始安装您当前的 openSUSE 版本?

您是否仅使用 openSUSE 软件软件包,或者您是否也使用其他软件,例如特定软件包的较新版本或自行编译的软件,这些软件可能与您的打印问题相关?

如果您使用可能与您的打印问题相关的其他软件,请说明是哪个确切的软件,并提供您获取该其他软件的 URL。

始终说明您做了什么

不要假设别人知道您做了什么。

即使您 100% 确定您执行的方式与其他人相同,也请说明您做了什么。

即使所有对您来说都是显而易见的,但没有您的特定环境或不知道您的特定用例的人可能根本不理解您实际做了什么或您最终打算实现什么。

如果打印机设置失败

您正在使用哪个打印机设置工具?

我们有很多打印机设置工具,这些工具可以根据当前使用的桌面环境通过各种方式启动

  • YaST 打印机设置工具(请参阅 YaST Printer
  • Gnome 打印机设置工具(“system-config-printer”)
  • KDE 打印机设置工具
  • CUPS Web 前端(请参阅 SDB:CUPS in a Nutshell
  • CUPS 命令行工具(“lpinfo”/“lpadmin”,请参阅 SDB:CUPS in a Nutshell
  • 对于 HP 设备:HP 的设置工具“hp-setup”(请参阅 SDB:How to set-up a HP printer
  • 其他任何工具(例如,来自打印机制造商的设置工具)

如果您不知道桌面魔法运行哪个打印机设置工具,请提供屏幕截图或尝试查看您的打印机设置工具中是否有“帮助”或“关于”信息。

逐步说明您在打印机设置工具中执行的操作以及打印机设置工具在每个步骤中向您显示的内容(特别是确切的错误消息)。

最好以英语运行打印机设置工具,并为那些可能感兴趣的打印机设置工具对话框提供一些屏幕截图,以便其他人可以理解您在打印机设置工具中执行的操作以及打印机设置工具向您显示的内容。

特别是当存在 YaST 打印机设置工具的问题时,请参阅 openSUSE:Bugreport_YaST,了解如何“报告 YaST 错误”,其中最重要的是“附加 y2logs”。

从应用程序程序打印失败时的基本测试

从打印机设置工具打印测试页是否有效?

YaST 在其初始“打印机配置”对话框中提供“打印测试页”按钮。

从命令行打印是否有效?

是否运行以下命令?将 <queue_name> 替换为您的打印队列名称,并使用与打印机中实际加载的介质(A4 或 Letter)匹配的命令

echo Hello | lp -d <queue_name>
echo A4 | a2ps -1 -j -M A4 -o- | lp -d <queue_name>
echo Letter | a2ps -1 -j -M Letter -o- | lp -d <queue_name>
echo -e 'One\fTwo' | lp -d <queue_name>
echo -e 'A4-1\fA4-2' | a2ps -1 -j -M A4 -o- | lp -d <queue_name>
echo -e 'Letter-1\fLetter-2' | a2ps -1 -j -M Letter -o- | lp -d <queue_name>

您应该得到

  • 包含“Hello”的一页
  • 包含“A4”或“Letter”的一页
  • 包含“One”和“Two”的两页
  • 包含“A4-1”和“A4-2”或“Letter-1”和“Letter-2”的两页

如果 a2ps(软件包 a2ps)不可用,请使用 enscript(软件包 enscript),它也接受上述选项,例如

echo A4 | enscript -1 -j -M A4 -o- | lp -d <queue_name>
echo Letter | enscript -1 -j -M Letter -o- | lp -d <queue_name>

如果“A4”或“Letter”命令的输出不适合您的纸张,请尝试以下命令

echo A4 | a2ps -1 -j -M A4 -o- | lp -d <queue_name> -o PageSize=A4
echo Letter | a2ps -1 -j -M Letter -o- | lp -d <queue_name> -o PageSize=Letter

如果其中一个命令有效,您需要调整打印队列的默认纸张大小以及应用程序程序中的纸张大小,以匹配打印机中实际加载的纸张。

要调整打印队列的默认纸张大小,请以 root 用户身份运行以下命令之一

lpadmin -p <queue_name> -o PageSize=A4
lpadmin -p <queue_name> -o PageSize=Letter

具体如何调整应用程序程序中的纸张大小以匹配打印机中实际加载的纸张取决于具体的应用程序程序。

从其他应用程序程序打印是否有效?

在不同的用户帐户下运行相同的应用程序程序打印是否有效?

您可以设置一个新测试用户并尝试以测试用户身份打印。不同的用户可能会获得不同的打印结果,即使他们通过相同的打印队列打印相同的数据,请参阅 SDB:Print Settings with CUPS

您使用的打印失败的应用程序程序是什么?

如果您不知道桌面魔法运行哪个应用程序程序,请提供屏幕截图或尝试查看您的应用程序程序中是否有“帮助”或“关于”信息。

如果从应用程序程序打印失败,请提供足够的信息,以便其他人有机会重现该失败。

特别是,说明您是否更改了应用程序程序打印对话框中的任何默认设置,例如“横向”打印(请参阅 SDB:Landscape Printing)或高分辨率,例如“1200x1200dpi”(请参阅 SDB:Laser Printer Does Not Print Properly Or Does Not Print At All)。

如果从命令行打印失败

提供确切的打印命令和一个小的示例文件(如果您正在打印文件),其中打印失败。

通常提供一个示例文件

如果从应用程序程序打印失败或从命令行打印失败,请提供一个对您失败的示例文件(或指向公共可访问示例文件的引用)。

例如,当从浏览器打印失败时,请提供一个常用且公开可访问的网页的 URL(例如,一个 openSUSE 网页),在该网页上使用特定浏览器打印此网页时会失败。

当应用程序与文件一起工作时(例如,PDF 阅读器或 LibreOffice/OpenOffice 等办公软件),请提供一个小的示例文件,在该示例文件中使用特定应用程序打印时会失败。例如,对于 PDF 阅读器,提供一个小的 PDF 文件;或者当从 LibreOffice/OpenOffice 打印失败时,提供一个小的 LibreOffice/OpenOffice 文档。

不要提供大型示例文件,例如包含许多页面的 PDF 或办公文档。即使故障发生在 234 页文档的第 123 页,也不要提供整个文档。相反,尝试仅提取导致故障的文档部分(例如,仅第 122 页到第 124 页),并将其作为小的示例文档提供——前提是使用您的示例文档仍然会失败。

如果从应用程序打印失败,请另外提供应用程序在打印该示例文件时提交给 CUPS 的打印数据。前提条件是,从应用程序打印在提交给 CUPS 之前,应用程序本身不会在生成打印数据时就失败。

获取应用程序提交给 CUPS 的内容

要获取应用程序提交给 CUPS 的内容,请执行以下操作

  1. 停止打印队列的打印。以 'root' 用户身份运行 "cupsdisable <queue_name>"(将 <queue_name> 替换为您的打印队列名称)。
  2. 清理所有打印队列。以 'root' 用户身份运行 "cancel -a" 或从 CUPS 1.7 开始运行 "cancel -a -x",这将完全删除所有打印队列中所有现有的(旧的)打印作业(包括作业历史记录)。
  3. 以普通用户身份打印导致特定应用程序打印失败的确切示例文件。
  4. 在上一步中应用程序提交给 CUPS 的内容现在保存在打印队列中,位于 /var/spool/cups/d<job_number>-001(请参阅 SDB:CUPS in a Nutshell 中的“在 spool 目录中保存打印作业”)。
  5. 保存打印作业数据以供进一步分析。以 'root' 用户身份运行 "cp /var/spool/cups/d<job_number>-001 /tmp/print-job-data.save"(将 <job_number> 替换为您的实际打印作业编号)和 "chmod a+r /tmp/print-job-data.save",以便稍后进行分析(如下所示)也可以作为普通用户访问它。
  6. 清理打印队列。以 'root' 用户身份运行 "cancel -a <queue_name>" 或从 CUPS 1.7 开始运行 "cancel -a -x <queue_name>"(将 <queue_name> 替换为您的打印队列名称)。
  7. 重新启用打印队列的打印。以 'root' 用户身份运行 "cupsenable <queue_name>"(将 <queue_name> 替换为您的打印队列名称)。
  8. 现在可以随意检查 /tmp/print-job-data.save。

如果从应用程序打印失败,则第一个测试是检查应用程序提交给 CUPS 的打印数据是否正确。

测试应用程序提交给 CUPS 的内容是否正确

通常,应用程序会将 PostScript 或 PDF 作为打印数据格式提交给 CUPS(请参阅 Concepts printing 中的“常用打印格式”)。

获取应用程序提交给 CUPS 的内容,如上所述,并测试它是否实际上是 PostScript 或 PDF。

file /tmp/print-job-data.save

这应该报告它是一个 PostScript 或 PDF 文档。

如果 "file /tmp/print-job-data.save" 报告“gzip 压缩数据”,则首先使用以下命令解压缩它:

mv /tmp/print-job-data.save /tmp/print-job-data.save.gz
gunzip /tmp/print-job-data.save.gz

然后再次使用 "file /tmp/print-job-data.save" 测试它是否是 PostScript 或 PDF 文档。

只有对于 PostScript 或 PDF,以下使用 Ghostscript 的测试才有效。

要测试应用程序提交给 CUPS 的 PostScript 或 PDF 是否正确,请使用 Ghostscript 显示它。根据打印机中的纸张大小,使用以下命令之一:

gs -r50 -sPAPERSIZE=a4 -dFIXEDMEDIA /tmp/print-job-data.save
gs -r50 -sPAPERSIZE=letter -dFIXEDMEDIA /tmp/print-job-data.save

这将打开一个 X11 窗口,显示 PostScript 或 PDF 页面的图形内容。在您键入 "gs" 命令的命令行中,按 [Enter/Return] 键以显示下一页。要退出 Ghostscript,请键入 "quit" 或按 [Ctrl/Strg]+[C] 键。

可能的错误显示在您键入 "gs" 命令的命令行中。如果出现错误,则应用程序已提交无效的 PostScript 或 PDF 给 CUPS。

要仅测试 PostScript 或 PDF 是否有效,请运行:

gs -r50 -dNOPAUSE -dBATCH -sDEVICE=nullpage /tmp/print-job-data.save

使用 "-dNOPAUSE -dBATCH",Ghostscript 会连续处理 PostScript 或 PDF 页面,但 "-sDEVICE=nullpage" 不会显示图形内容。如果没有错误,仅表示 Ghostscript 没有处理失败。如果您有 PostScript 打印机,打印机可能仍然无法打印它(请参阅 Concepts printing)。

如果没有错误,请检查图形内容是否符合您的预期。

"-r" 参数指定分辨率,因此 "-r100" 显示的图形内容与 "-r50" 相比,显示大小加倍。

如果显示图形内容的窗口太小而无法显示全部内容,则可能的原因是特定的打印应用程序提交到打印队列的内容超出了 PPD 文件中提供的可打印区域(请参阅 SDB:Landscape Printing)。

gs -r50 -g900x900 /tmp/print-job-data.save

要显示全部打印内容,您可以指定以像素为单位的大窗口大小,例如:

Ghostscript 显示的图形内容是应用程序提交的内容,也是您的打印机应该打印的内容。

有关如何使用 Ghostscript 的详细信息,请参阅您当前安装的 Ghostscript 版本的 /usr/share/ghostscript/<ghostscript-version>/doc/Use.htm 文件。

始终有助于在虚拟的通用 PostScript 打印机上模拟打印

在虚拟的通用 PostScript 打印机上模拟打印的目标是确定根本原因是否是通用问题,或者根本原因更有可能与特定的打印机驱动程序软件相关,这对于诊断您特定打印问题的具体根本原因非常有帮助(参见下文“背景信息”部分中的“当您查看实际特定案例时,情况会变得复杂”)。

即使为您的特定打印机设备设置打印机失败,也应该始终可以设置虚拟的通用 PostScript 打印机,因此应该始终可以模拟在虚拟的通用 PostScript 打印机上打印。

通用 PostScript 打印机是 THE 参考打印机设备,因为 PostScript 是传统的打印数据格式(请参阅 Concepts printing)。因此,可以使用通用 PostScript 打印机来验证打印是否正常工作。这意味着如果通用 PostScript 打印机上的打印效果良好,那么根本原因可能不是通用问题,而是与特定的打印机驱动程序软件更相关。

设置虚拟通用 PostScript 打印机的基本思想是为通用 PostScript 打印机设置一个单独的测试打印队列(使用通用 PostScript 打印机的 PPD 文件),该打印队列将输出最终的打印数据(通用 PostScript)到文件中。

要将最终的打印数据输出到文件,您必须在 CUPS >= 1.6 的 /etc/cups/cups-files.conf 中指定 "FileDevice Yes"(对于 CUPS 高达 1.5.4,“FileDevice Yes”必须设置在 /etc/cups/cupsd.conf 中)。

此外,您还应在 /etc/cups/cupsd.conf 中设置 "LogLevel debug",以便在 /var/log/cups/error_log 文件中获得详细(即有意义的)CUPS 日志记录和调试消息。

更改 /etc/cups/cupsd.conf 或 /etc/cups/cups-files.conf 后,必须重新启动 cupsd(请参阅下文“通常提供 CUPS 调试消息”)。

lpadmin -p testq -v file:/tmp/testq.out.ps -P /usr/share/cups/model/Postscript.ppd.gz -E

设置测试队列(以 root 身份)

为通用 PostScript 打印机使用 /usr/share/cups/model/Postscript.ppd.gz。不要使用特定 PostScript 打印机型号的 PPD 文件。

lpadmin -p testq -o PageSize=A4
lpadmin -p testq -o PageSize=Letter

使用以下命令之一显式指定 A4 或 Letter 页面大小(以 root 身份):

以普通用户身份打印导致特定应用程序打印失败的确切示例文件到 "testq",或者通过命令行打印导致命令行打印失败的确切示例文件到 "testq"。

最终的打印数据出现在 /tmp/testq.out.ps 文件中,只能由 root 读取。

如果 /tmp/testq.out.ps 中没有数据(或者如果 /tmp/testq.out.ps 包含无效的 PostScript),则您的示例文件的打印作业处理失败,您可以检查 /var/log/cups/error_log 文件中的错误消息,这些错误消息可能表明您的示例文件的打印作业处理失败的原因,请参阅下面如何获取和提供“仅针对单个失败打印作业的 CUPS 调试消息”。

当 /tmp/testq.out.ps 中有数据时,您可以使用(以 root 身份)"chmod a+r /tmp/testq.out.ps" 使任何用户都可以读取它。

要查看在通用 PostScript 打印机上打印的内容,请使用 Ghostscript 显示 /tmp/testq.out.ps(请参阅上面的“测试应用程序提交给 CUPS 的内容是否正确”)。

gs -r50 -sPAPERSIZE=a4 -dFIXEDMEDIA /tmp/testq.out.ps
gs -r50 -sPAPERSIZE=letter -dFIXEDMEDIA /tmp/testq.out.ps

根据纸张大小,使用以下命令之一:

Ghostscript 显示的是通用 PostScript 打印机应该在 A4 或 Letter 纸上打印的内容(除了真实的通用 PostScript 打印机具有或多或少宽的不可打印边距,而 Ghostscript 显示到纸张边缘)。

如果 A4 或 Letter 页面窗口太小而无法显示全部打印内容,则可能的原因是特定的打印应用程序提交到打印队列的内容超出了 PPD 文件中提供的可打印区域(请参阅 SDB:Landscape Printing)。

要显示全部打印内容,您可以指定以像素为单位的大窗口大小,例如:

gs -r50 -g900x900 /tmp/testq.out.ps

当您不再需要测试队列时,将其删除(以 root 身份):

lpadmin -x testq

通常提供 CUPS 调试消息

在几乎所有打印不正常工作的情况下,您都应该提供 CUPS 调试消息

  1. 在 /etc/cups/cupsd.conf 中设置 "LogLevel debug"。以 'root' 用户身份使用纯文本编辑器(如 'vi' 或 'nano')在 /etc/cups/cupsd.conf 中设置 "LogLevel" 值,请参阅 Text editor
  2. 停止 cupsd。以 'root' 用户身份运行 "rccups stop" 或在 systemd 的情况下使用适当的 systemctl 命令,例如 "systemctl stop cups.service" 等(检查 "systemctl list-units | grep cups" 和 "systemctl list-unit-files | grep cups" 的输出)。
  3. 将 /var/log/cups/error_log 移动到另一个位置(或删除它),以避免必须搜索巨大的日志文件。以 'root' 用户身份运行 "mv /var/log/cups/error_log /var/log/cups/error_log.old"(或 "rm /var/log/cups/error_log")。
  4. 启动 cupsd。以 'root' 用户身份运行 "rccups start" 或在 systemd 的情况下使用适当的 systemctl 命令,例如 "systemctl start cups.service" 等。
  5. 重试导致问题的操作(即,通常再次尝试打印无法打印的内容)。
  6. 现在 /var/log/cups/error_log 包含许多对故障排除有用的消息。
  7. 保存当前的 /var/log/cups/error_log 以供进一步分析。以 'root' 用户身份运行 "cp /var/log/cups/error_log /tmp/cups.error_log.save"。
  8. 现在可以随意检查 /tmp/cups.error_log.save 中的有趣消息。

仅提供针对单个失败打印作业的 CUPS 调试消息。除非其内容仅属于单个失败打印作业,否则不要提供整个 /var/log/cups/error_log 文件。

当 "LogLevel debug" 时,某些打印机驱动程序可能会用大量的驱动程序内部调试消息污染 /var/log/cups/error_log 文件,这些消息通常对找出打印作业失败的原因没有帮助(这些消息可能仅在 "LogLevel debug2" 时提供,或者在它们没有显示打印作业失败的原因时根本不提供)。在这种情况下,仅提供那些似乎与打印作业失败相关的 CUPS 调试消息。查找“error”或“fail”消息,并在您的打印问题报告中包含“error”或“fail”消息出现之前的几行。尝试想象在“error”或“fail”消息之前的哪些行可能与打印作业失败相关。

有一些示例,CUPS 调试消息无法提供帮助

当打印机设置失败时(即,无法设置打印队列),CUPS 调试消息无法提供帮助,因为没有打印队列可以由 CUPS 处理打印作业(请参阅 Concepts printing)。

如果应用程序在提交给 CUPS 之前在生成打印数据时打印失败,则 CUPS 无法处理打印作业(请参阅 Concepts printing)。

当打印基本上正常工作时(即,您可以获得打印输出),但打印输出在纸张上的大小或位置存在差异,或者存在颜色偏差或视觉伪影(请参阅 SDB:Purchasing a Printer and Compatibility),则 CUPS 调试消息无法提供帮助,因为打印作业没有失败。

当您想通过网络中的远程 CUPS 服务器打印但失败时,需要远程 CUPS 服务器上的 CUPS 调试消息。但是,如果您无法获取它们(例如,因为它是一个公司 CUPS 服务器,您没有访问权限),则来自您提交打印作业的客户端主机上的 CUPS 调试消息通常无法提供帮助。尽管如此,请检查客户端主机上的 CUPS 调试消息,以验证它是否未在客户端主机上失败。此外,请参阅 SDB:Printing via TCP/IP network

不要过度操作

最初,您应该仅提供上述描述的信息。

不要过度操作,不要提供大量未请求的低级调试信息。

特别是,低级调试消息(如 "strace" 输出、没有调试信息的反向跟踪,甚至核心转储)通常对调试打印相关问题没有真正的帮助——除非您是足够的专家,知道对于哪个进程需要哪种特定类型的低级调试消息,以及输出中的哪些行实际上显示了故障的根本原因(请参阅 openSUSE:Bugreport application crashed)。

整个 "dmesg" 输出甚至整个 /var/log/messages 文件也永远不需要找出打印相关问题的根本原因。

另一方面,有一些打印相关的问题,检查 "dmesg" 和 /var/log/messages 以获取可能与打印相关问题相关的有用信息会有所帮助。这些问题尤其是在无法访问本地连接的打印机时(请参阅 SDB:Installing a Printer)。在这种情况下,仅提供那些似乎与打印相关问题相关的消息。例如,如果 USB 打印机无法访问,您可以使用以下命令获取 usb 相关的内核消息:

dmesg | grep -i usb >/tmp/dmesg.usb

然后您可以检查 /tmp/dmesg.usb 并提取那些似乎与 USB 打印机问题相关的消息。

背景信息

从概念上讲,打印相对简单:“只需”将 PostScript 或 PDF 转换为特定于打印机的数据并将其发送到打印机设备(请参阅 Concepts printing)。但当您查看实际的特定案例时,它会变得复杂。

没有将 PostScript 或 PDF 转换为特定于打印机的数据的“唯一”方法。

应用程序创建 PostScript 或 PDF 的方式有很多种,这导致 PostScript 和 PDF 处理工具(Ghostscript 和 Poppler/Xpdf)对其进行解释的方式也很多种,以及许多不同的打印机驱动程序,每个驱动程序都有几个驱动程序特定的选项设置。

在打印文本时,它还取决于安装的字体包,以及特定应用程序使用哪些字体来创建 PostScript 或 PDF。此外,它还取决于用于字体渲染的软件,例如 Ghostscript 的字体渲染与 FreeType 字体渲染(请参阅 https://bugzilla.opensuse.org/show_bug.cgi?id=692356)。

此外,对于彩色打印,它取决于 PostScript 或 PDF 中使用的颜色模型(RGB 或 CMYK)以及打印机使用的颜色模型(例如 CMY、CMYK、CcMmYK、CcMmYy、CcMmYyK)。

所有这些加起来,导致了无数种为特定打印机以特定驱动程序设置在特定环境中创建特定于打印机的数据的方式。

因此,不要假设对您不起作用的东西对其他人也同样不起作用,或者它已经被 openSUSE 的 beta 测试人员检测到。即使它已经是已知问题,也不要假设根本原因“显而易见”,并且存在适用于所有用户在任何环境中的“显而易见的解决方案”。

如果您依赖于 openSUSE 中的特定打印功能,那么您必须测试此特定功能,提供有意义的错误报告,回答问题等等。

请做好准备,您可能需要报告那些并非由 openSUSE 直接引起的错误,而是在匹配的上游项目中报告。在这种情况下,提交给 openSUSE 的错误报告将被关闭为“UPSTREAM”,请参阅 http://en.wikipedia.org/wiki/Upstream_%28software_development%29,其中说明

Responsibility for a bug is said to lie upstream
when it is not caused through the distribution's
porting and integration efforts.

特别是当打印问题取决于打印机型号(例如,驱动程序无法工作或导致特定打印机型号的打印质量差)时,我们(即 openSUSE)通常没有这样的打印机型号来重现它,因此基本上没有什么我们可以做的。相反,如果您直接在上游项目中报告该问题,则您和上游作者之间将进行直接沟通。

通常,我们(即 openSUSE)从各个上游项目中分发各种打印机驱动程序包,但我们不开发打印机驱动程序,因此通常我们无法在特定打印机驱动程序无法工作时做任何事情。特别是,我们通常无法重现打印机驱动程序的问题。

如果某个特定的打印机驱动程序在匹配的上游项目中列出,应该适用于您的特定打印机型号,但它在您使用 openSUSE 版本时无法工作,您应该检查是否已经有更新的版本可用,并尝试更新的版本是否适用于您的特定型号,请参阅 SDB:Installing a Printer 中的“打印机驱动程序包的版本升级”。

也就是说,在您向匹配的上游项目的驱动程序作者报告问题之前,您可能需要将打印机驱动程序 RPM 包升级到 openSUSE “Printing” 项目中的版本,并验证该问题是否也发生在最新的打印机驱动程序版本中。

每个 openSUSE 版本都有一个较长的 beta 测试阶段(又称“里程碑”),感兴趣的用户可以在此阶段进行测试(请参阅 openSUSE:Testing)。

参见

Portal:Printing

SDB:CUPS in a Nutshell

“一个将输入发送到文件进行调试的过滤器”在 SDB:Using Your Own Filters to Print with CUPS

“一个将输入发送到文件进行调试的后端”在 SDB:Using Your Own Backends to Print with CUPS

openSUSE:提交错误报告

openSUSE:错误报告 FAQ

Bug Status WONTFIX

openSUSE:测试

“如何有效地报告错误”在 http://www.chiark.greenend.org.uk/~sgtatham/bugs.html