【已解决】与打印机对应的ppd文件存在哪里呢

软件和网站开发以及相关技术探讨
回复
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

【已解决】与打印机对应的ppd文件存在哪里呢

#1

帖子 wxf » 2023-08-22 17:31

我想干涉cups的打印过程,往打印页上加一些水印文字,但不修改原来的文件
看了一些资料,都说要修改cups里的filter,或者重新做一个,或者对原有filter做包装

filter是用来转换文件格式的,把原始文件转成打印机能接受的格式,比如pdf、ps文件,等。
filter是链式进行的,最后一个filter和backend相连,backend把转换后的文件传递给打印机。
最后一个filter记录在打印机的ppd文件里,ppd文件是打印机的配置文件。

可是去哪里找对应的ppd文件呢?

虚拟机里打印机列表如下:
:1
Adobe PDF:5
Fax:4
Microsoft XPS Document Writer:3
NPI65EA6B_(HP_Laser_NS MFP_1005w):2


我在打印对话框里选最后一个进行打印,没有打印出来(因为没有连接到打印机),但是/var/spool/cups/下边出现了临时文件。说明cups链接运作完成了,只差最后一步把文件交给打印机而已。

那么这个“NPI65EA6B_(HP_Laser_NS MFP_1005w)”的ppd文件在哪个放着呢,/etc/cups/ppd/里边是空的(网上资料说ppd文件放在这里),/user/share/cups/里边似乎也没有。找不到ppd文件,我就没法修改其内容,而从指定我自己的filter
上次由 wxf 在 2023-09-06 10:50,总共编辑 2 次。
头像
astolia
论坛版主
帖子: 6453
注册时间: 2008-09-18 13:11

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#2

帖子 astolia » 2023-08-23 10:09

惠普的?嵌入到/usr/lib/cups/driver/hplip里了
cde2000
帖子: 6
注册时间: 2023-08-21 9:31
系统: Debian 11.7

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#3

帖子 cde2000 » 2023-08-23 11:39

dpkg -S ppd | grep -i hp
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#4

帖子 wxf » 2023-08-24 14:16

astolia 写了: 2023-08-23 10:09 惠普的?嵌入到/usr/lib/cups/driver/hplip里了
是有这个文件,linux里现在 是只有cups这一种打印系统吗。我把/usr/lib/cups改名了,点打印,/tmp/splool/cups/里边还是会出现临时文件。这中间到底发生了什么? 我改名后,/usr/lib/cups/filter里边的过滤器都找不到了,那转换过程怎么发生的呢

而且,用wps和leafpad(一个简单的文本编辑器)打印生成的临时文件的格式也不一样:

用wps打印
# ls /var/spool/cups/
c00039 d00039-001 tmp
# file /var/spool/cups/d00039-001
/var/spool/cups/d00039-001: PostScript document text conforming DSC level 3.0, type EPS

清空缓存
# rm /var/spool/cups/*

用leafpad打印
# ls /var/spool/cups/
c00040 d00040-001 tmp
# file /var/spool/cups/d00040-001
/var/spool/cups/d00040-001: PDF document, version 1.5

这又是什么原理?我只知道,wps是qt做的,leadpad是gtk程序。用pldd命令查看这两个程序依赖的动态库,发现wps链接了libcups库,leadpad没有。难道leadpad不用cups来打印吗,还是它直接调用了lp或者lpr之类的可执行程序?
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#5

帖子 wxf » 2023-08-24 14:58

cde2000 写了: 2023-08-23 11:39 dpkg -S ppd | grep -i hp
多谢
头像
astolia
论坛版主
帖子: 6453
注册时间: 2008-09-18 13:11

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#6

帖子 astolia » 2023-08-24 19:35

wxf 写了: 2023-08-24 14:16 linux里现在 是只有cups这一种打印系统吗。
可以这么说
wxf 写了: 2023-08-24 14:16 用pldd命令查看这两个程序依赖的动态库,发现wps链接了libcups库,leadpad没有
你先在leafpad里执行一次打印相关的操作再来看看

wxf 写了: 2023-08-24 14:16 而且,用wps和leafpad(一个简单的文本编辑器)打印生成的临时文件的格式也不一样:
你看到的是交付给cups打印的文件的副本。你随便找个文件,即使是cups不支持的格式也行,用lp来打印,一样会生成一个副本文件。这只是说明了wps是将文档转换成ps文件,而leafpad是转换成pdf来交付给cups进行打印。wps我不清楚,leafpad所用的gtk库是调用cairo库来完成转换的,跟cups没关系。
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#7

帖子 wxf » 2023-08-25 17:43

在leafpad里执行一次打印相关的操作后,再执行pldd,发现有libcups.so了

在bing里搜索了一阵,有文章说:
“CUPS 始终将实际打印作业文件临时存储在目录 /var/spool/cups/ 中。 打印客户端提交的假脱机文件(在 CUPS 的过滤器转换链启动之前)始终命名为 dNNNNNN-001(以 'd' 开头)”
说明生成临时文件的过程用不到过滤器。(那怎么生成临时文件的呢?)

我自己做了一个ko,hook了 open openat系统调用,发现 /var/spool/cups/ 里边,c开头和d开头的文件都是cupsd创建的,cups调度器。

接下来我打算看看cupsd的代码,看它怎么生成文件的,也许可以改一改它,给临时文件加水印效果,这样也能达到我的目的。
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#8

帖子 wxf » 2023-08-28 22:59

看了一阵cupsd程序的源代码,大致明白了临时文件怎么产生的。它处理IPP客户端的post请求,接收要打印的文件数据,保存成临时文件,就是/var/spool/cups里边哪些d开头的文件,也看到了调用filter的地方,不过还不确定d开头的临时文件是收到后直接就是pdf/ps文件,还是后边执行filter起作用了。毕竟我曾经把/usr/lib/cups改名过,哪些格式的临时文件还是生成了。
我接下来改一改cupsd的代码,编译一下,看看内部机制

(我还hook了cups库里哪些打印文件的函数,cupsPrintFile / cupsPrintFile2 / cupsPrintFiles / cupsPrintFiles2 / cupsStartDocument , 但是preload so之后,没有看到wps和leafpad调用过,也不知道怎么把文件交给cupsd的)
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#9

帖子 wxf » 2023-09-01 15:39

现在能确定cupsd收到的文件就是pdf或者ps,但是在cupsd代码里没法辨识客户端。没有办法获取客户端的端口号或者pid。cupsd不加分别地接收要打印的文件,根本不会记录客户的信息,也不会收到完整的文件名。上边哪些函数里传输文件名后,在其实现里只是截取了不包括/的文件名而已(没有路径)

我的目标是针对特定的客户端传来的文件,才进行额外的处理。这就难办了啊
头像
astolia
论坛版主
帖子: 6453
注册时间: 2008-09-18 13:11

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#10

帖子 astolia » 2023-09-01 19:23

有啥难办的?cups是开源的,直接改写libcups的代码,让目标程序优先加载改动后的库就是了
或者用你喜欢的hook方式,赶在扔给libcups之前修改一下ps/pdf文件
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#11

帖子 wxf » 2023-09-02 22:01

astolia 写了: 2023-09-01 19:23 有啥难办的?cups是开源的,直接改写libcups的代码,让目标程序优先加载改动后的库就是了
或者用你喜欢的hook方式,赶在扔给libcups之前修改一下ps/pdf文件
传输文件是可以的,拦截cupsPrintFiles2之类的函数,赶在传输之前改pdf或者ps文件。

就怕它们不传输文件,直接传输绘图buff里边的内容给cupsd,那么在客户端就没办法改了。这也是一种打印方法。wps或者leafpad,它们打开的文件也不是ps或pdf,那么传输给cupsd是这些格式,肯定是有个buff,把源文件的内容绘制成ps或pdf格式的数据了。我猜想,qt或gtk很有可能是把这些数据传输给cupsd了。要是有一个临时文件,就好办了。

原先在命令行里直接加LD_PRELOAD环境变量 启动程序,没看到哪些函数被调用,也不知道怎么回事。可能我弄错了,没挂上钩子。。

我再试试


还看了一阵qt的源代码,也没看出个头绪来 :Hehe
头像
wxf
帖子: 50
注册时间: 2008-05-28 8:50

Re: 【求助】与打印机对应的ppd文件存在哪里呢

#12

帖子 wxf » 2023-09-06 10:49

我不是回复了吗,怎么那个回复看不见了?我做梦了。。。

研究了几天,还是得改libcups。
服务端没法判断客户端的身份;
gtk没有用libcups里printfile之类的函数,好像是自己构造ipp request和cupsd通信了,这就没法干预了。
qt程序会调用libcups里边的cupsprintfiles2函数传输临时生成的ps文件,但它是用dlsym的方式调用的,没法hook,只能修改库文件才能够干预qt程序的行为。

感谢版主astolia
回复