如何逆向工程 CUPS 打印机/打印作业?

Rob*_*mer 6 printing cups pdf ppd

我有 PDF 本地打印 (CUPS) 与 Google 云打印的质量问题。(GCP 更好,使用 CUPS 我得到错误的大小、错误的字符、错误的字体。所以我想知道 CUPS 是做什么的!)

打印机本身可以处理几种格式:application/pdf (? 1.0, ? 1.7)、image/jpeg、image/tiff、image/pwg-raster

几个月来,我以不同的方式将打印机添加到 CUPS,我还使用了“无驱动程序”,CUPS 在本地网络中检测打印机。

在所有情况下,它都会打印有错误的 PDF;不完全是,但使打印对我无用。会发生什么:页面放大了约 30%,从第 2 页或第 3 页开始,字体混淆,字符变成符号,段落以粗体打印,等等......

如果在同一台打印机上通过 Google 云打印打印相同的 PDF,效果会很好。直接将带有 PDF 的 USB 记忆棒送入打印机也同样出色。– 我希望从我的电脑打印也能获得同样好的效果!

我的问题是:

  • 我想知道每台 CUPS 打印机在发送到真正的打印机之前在我的机器上采用什么管道。它检测格式吗?如何?它会再次重新转换为PDF吗?它将使用哪个 PPD?管道正在采取哪些其他决策以及哪些转换?
  • 从通过的打印作业中,我想知道:CUPS 检测到了什么?它做了哪些转换?我在哪里可以获取生成的中间输出?

到目前为止,我发现 CUPS 调试/逆向工程的切入点不是很好(考虑到我的问题)...

her*_*nnk 1

您的问题没有指定您正在使用的操作系统。我的答案是针对 Debian 9.6 和网络连接的 Kyocera FS-1350DN,指定处理 \xe2\x80\x9cPDF 直接打印\xe2\x80\x9d。cups应该没有必要篡改 PDF 文件。

\n\n

要找到答案,您必须启用 cups 调试。不幸的是,cupsctl --debug-logging(作为 root)失败并出现错误消息cupsctl: Forbidden。在文件 /etc/cups/cupsd.conf 中设置LogLevel debug并重新启动 cupsd 后,我发送了一个带有lpr scale.pdf. 该文件包含来自 CAD 程序的线条图形(无灰度)并以 100% 比例打印。

\n\n

/var/log/cups/error_log 中的相关行(总共 300 行)如下:

\n\n
\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] Request file type is application/pdf.\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] 3 filters for job:\nD [11/Dec/2018:17:50:02 +0100] [Job 319] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)\nD [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops (application/vnd.cups-pdf to application/vnd.cups-postscript, cost 100)\nD [11/Dec/2018:17:50:02 +0100] [Job 319] - (application/vnd.cups-postscript to printer/fs1350, cost 0)\n\xe2\x8b\xae\nI [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftopdf (PID 16570)\nI [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter /usr/lib/cups/filter/pdftops (PID 16571)\nI [11/Dec/2018:17:50:02 +0100] [Job 319] Started backend /usr/lib/cups/backend/socket (PID 16572)\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] pdftops - copying to temp print file \\"/tmp/040bb5c158ce7\\"\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16570 (/usr/lib/cups/filter/pdftopdf) exited with no errors.\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] 319 h scale.pdf 1 \\\'finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\\\'\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] Running command line for gs: gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c \\\'save pop\\\' -f /tmp/040bb5c158ce7\nD [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter gs (PID 16577)\nD [11/Dec/2018:17:50:02 +0100] [Job 319] Started post-processing (PID 16578)\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] Started filter pstops (PID 16579)\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %!PS-Adobe-3.0\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%BoundingBox: 0 0 595 842\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%HiResBoundingBox: 0 0 595.00 842.00\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%Creator: GPL Ghostscript 920 (ps2write)\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%LanguageLevel: 2\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%CreationDate: D:20181211175002+01\\\'00\\\'\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%Pages: 1\nD [11/Dec/2018:17:50:02 +0100] [Job 319] %%EndComments\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16577 (gs) exited with no errors.\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16578 (Post-processing) exited with no errors.\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16579 (pstops) exited with no errors.\n\xe2\x8b\xae\nD [11/Dec/2018:17:50:02 +0100] [Job 319] PID 16571 (/usr/lib/cups/filter/pdftops) exited with no errors.\n\xe2\x8b\xae\n
Run Code Online (Sandbox Code Playgroud)\n\n

包含的行- (application/vnd.cups-postscript to printer/fs1350, cost 0)告诉您cups正在使用后处理器(也称为打印机驱动程序)/etc/cups/ppd/fs1350.ppd。使用 - 命令可以获得同一进程的另一个视图ps。输出摘录

\n\n
while true ; do date +\'%N\'>> log; ps axSfu | fgrep -v grep | egrep \'^lp[[:space:]]|/usr/sbin/cupsd\' >> log ; done\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是

\n\n
\xe2\x8b\xae\nroot     15796  0.1  0.1 171440  8536 ?        Ssl  17:49   0:00 /usr/sbin/cupsd -l\nlp       16571  0.0  0.0  77632  5728 ?        S    17:50   0:00  \\_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\nlp       16577  0.0  0.2 129760 20836 ?        R    17:50   0:00  |   \\_ gs -q -dNOPAUSE -dBATCH -dSAFER -dNOMEDIAATTRS -sDEVICE=ps2write -sOUTPUTFILE=%stdout -dLanguageLevel=3 -r1200 -dCompressPages=false -dCompressFonts=false -dNoT3CCITT -dNOINTERPOLATE -c save pop -f /tmp/040bb5c158ce7\nlp       16578  0.0  0.0  77632   924 ?        S    17:50   0:00  |   \\_ fs1350 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\nlp       16579  0.0  0.0  75424  5288 ?        S    17:50   0:00  |   \\_ fs1350 319 h scale.pdf 1 finishings=3 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\nlp       16572  0.0  0.0  79792  5900 ?        S    17:50   0:00  \\_ socket://fs1350.xxxx.xxxx.xxx 319 h scale.pdf 1 finishings=3 number-up=1 job-uuid=urn:uuid:045216b6-e2e0-34ee-50af-36c3bdbdc04f job-originating-host-name=192.168.0.2 date-time-at-creation= date-time-at-processing= time-at-creation=1544547002 time-at-processing=1544547002 document-name-supplied=scale.pdf\n\xe2\x8b\xae\n
Run Code Online (Sandbox Code Playgroud)\n\n

告诉我们cups调用预过滤器(pdftops,PID 16571,此处名为 fs1350)和后端(PID 16572,此处名为 socket://fs1350.xxxx.xxxx.xxx)。预过滤器调用gs. 由于整个处理时间不到 0.2 秒,因此将输出收集到文件中是有意义的。只是date +\'%N\'为了了解时间安排。

\n\n

证据表明不需要的缩放(我在评论中写到)是因为evince\xe2\x86\x92Print\xe2\x86\x92Print Setup\xe2\x86\x92Scale\xe2\x86\x92100%被. 因此,请务必仔细检查您的打印客户。evince\xe2\x86\x92Print\xe2\x86\x92Page Handling\xe2\x86\x92Fit to Printable Area

\n\n

唉,这还不是故事的全部。为了绕过cups并使用打印机的\xe2\x80\x9cPDF直接打印\xe2\x80\x9d功能,我直接发送了文件:nc fs1350.xxxx.xxxx.xxx 9100 < scale.pdf. 经过 10 多分钟的处理时间后,打印机将纸张发出。

\n\n

使用 netcat 进行原始打印

\n\n

使用 netcat 进行原始打印,数字反映尺寸(以毫米为单位)。

\n\n

使用 lpr\xe2\x86\x92cups 打印输出

\n\n

使用 lpr\xe2\x86\x92cups 打印输出

\n\n

以 1200 dpi 渲染的文件的位图图像

\n\n

文件的位图图像 (1200 dpi)

\n\n

无论打印机设置 \xe2\x80\x9cOverride A4/LT\xe2\x80\x9d,原始打印的缩放比例均为 97.7%,而 lpr\xe2\x86\x92cups 打印的缩放比例则正常。原始打印的网点增大较小,而 lpr\xe2\x86\x92cups 打印的网点增大则有点微薄。

\n\n

在原始打印之前缩小绘图的页面尺寸会放大比例。

\n