无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: chinaren12
打印 上一主题 下一主题

[求助] 刚刚在论坛看到一个共享打印机的好东西raw print server

  [复制链接]
121#
发表于 2022-9-8 17:15:35 | 只看该作者
chinaren12 发表于 2022-9-8 14:20
所以,能否添加支持HP打印机的代码?老哥。。。。

测试发现问题出在发送的机器这边,
首先在本机选择p1007打印到文件,保存为test1,
然后执行 nc 192.168.1.2 9100 <test1
过几秒钟按ctrl-c结束nc,
打印机就开始工作了,打印出来了,
日志如下
RawPrintServer 1.00 created by Henk Jonas (www.metaviewsoft.de)
PrintServer start
HP LaserJet P1007 on 9100 (9100)
Accept print job for HP LaserJet P1007 from 192.168.1.12
PrintServer stopped.
PrintServer exit

test1.rar

787 Bytes, 下载次数: 2, 下载积分: 无忧币 -2

回复

使用道具 举报

122#
发表于 2022-9-8 17:37:35 | 只看该作者
zhuwg 发表于 2022-9-8 15:39
版主可以试试我修改的版本,在本帖子88楼
不需要手动设置ImagePath了,自动获取,
源代码也在里面,可 ...

谢谢。修改ImagePath倒不是什么大问题。关键是我没有编译环境,有源代码也没用。至于log的位置,完全可以建link解决,也不算大问题。
回复

使用道具 举报

123#
发表于 2022-9-8 17:42:42 | 只看该作者
搜索了一下大概是P1007是比较老的打印机,
不支持比较新的打印格式,只能打GDI格式,
新系统比如win10可能配置网络打印机之后,发出去的格式已经是新格式了,
P1007打印机收到了,但不能识别,
我也测试了先执行nc 192.168.1.2 9100 <sihpP1007.dl
再打印,P1007打印机还是没反应
回复

使用道具 举报

124#
发表于 2022-9-8 17:52:19 | 只看该作者
chinaren12 发表于 2022-9-8 14:20
所以,能否添加支持HP打印机的代码?老哥。。。。

翻了不少资料大概理解了打印机工作过程,
资料说WritePrint会不经过驱动程序直接发送文件给打印机
打个比方吧,有甲乙丙三个人,甲是翻译,乙是快递员,丙是打字员,
我们把PDF文件交给甲,
甲会翻译成GDI格式让乙去送,乙会检查是本地打印机还是远程打印机
然后送到丙那里,丙把GDI文件写纸上。

某些新打印机,我们直接给丙送PDF他也可以写,
但老打印机不识别,这估计就是打印机有准备动作但不打印的原因

支持HP打印机有两种思路
1.自行配置打印到文件,然后使用nc或其他工具把文件送到raw print,
上面实测可以用,就是得手动操作
2.想办法让打印机识别新的格式,
路由器接USB那种,发一个dl文件给打印机,再发真正要打印的东西出去,
我使用nc直接发出去还不行,可能还要改什么东西

点评

为什么在hp的打印机上rawprintserver接收数据如此之慢呢? 我把p1007的打印处理器改成如下图所示,但服务器端接收数据慢得无法形容,1.34m的打印测试页花了5分钟都没接收完成。 [attachimg]507168[/attachimg]  详情 回复 发表于 2022-9-8 18:48
简单点讲就是hp的某些型号的老打印机无法被直接驱动。  详情 回复 发表于 2022-9-8 18:29
回复

使用道具 举报

125#
 楼主| 发表于 2022-9-8 18:29:02 | 只看该作者
zhuwg 发表于 2022-9-8 17:52
翻了不少资料大概理解了打印机工作过程,
资料说WritePrint会不经过驱动程序直接发送文件给打印机
打个 ...

简单点讲就是hp的某些型号的老打印机无法被直接驱动。
回复

使用道具 举报

126#
 楼主| 发表于 2022-9-8 18:33:46 | 只看该作者
felixatvan 发表于 2022-9-7 05:48
刚用Lexmark E250dn在两台Win11机上测试了,使用的是Lexmark Universal Driver.  两边Windows 测试打印都 ...



共享P1007之后运行你所给的命令也无法打印,只能短暂的唤醒打印机,但打印机能生成打印任务。。。只是不打印。

点评

这个测试只涉及了一台机,我想应该和打印接口有关系。类似的情况会发生在共享一台mapped安装的打印机(XP没有此情况)。  发表于 2022-9-9 02:37
回复

使用道具 举报

127#
 楼主| 发表于 2022-9-8 18:48:05 | 只看该作者
zhuwg 发表于 2022-9-8 17:52
翻了不少资料大概理解了打印机工作过程,
资料说WritePrint会不经过驱动程序直接发送文件给打印机
打个 ...

为什么在hp的打印机上rawprintserver接收数据如此之慢呢?

我把p1007的打印处理器改成如下图所示,但服务器端接收数据慢得无法形容,1.34m的打印测试页花了5分钟都没接收完成。


1.PNG (14.48 KB, 下载次数: 84)

1.PNG

点评

是不是因为转成了RAW的缘故。  详情 回复 发表于 2022-9-8 19:36
回复

使用道具 举报

128#
 楼主| 发表于 2022-9-8 18:49:45 | 只看该作者
这是服务器端接收数据的速度。简直就是比蜗牛还慢。。


回复

使用道具 举报

129#
发表于 2022-9-8 19:36:18 | 只看该作者
chinaren12 发表于 2022-9-8 18:48
为什么在hp的打印机上rawprintserver接收数据如此之慢呢?

我把p1007的打印处理器改成如下图所示,但 ...

是不是因为转成了RAW的缘故。

点评

极有可能,hp的m1005,p1007,p1008,p1108等打印机的打印处理器都不是winprint的raw。。。 这可能就是导致rawprintserver不支持的原因。  详情 回复 发表于 2022-9-8 19:55
回复

使用道具 举报

130#
 楼主| 发表于 2022-9-8 19:55:38 | 只看该作者
Climbing 发表于 2022-9-8 19:36
是不是因为转成了RAW的缘故。

极有可能,hp的m1005,p1007,p1008,p1108等打印机的打印处理器都不是winprint的raw。。。

这可能就是导致rawprintserver不支持的原因。

点评

继续修改,参考路由器实现方法, 先发一段数据给打印机,再开始打印 数据已经被我写的程序里面如下 unsigned char data[222443] 这个应该只能用于p1007,请试试  详情 回复 发表于 2022-9-9 10:42
回复

使用道具 举报

131#
发表于 2022-9-8 22:37:27 来自手机 | 只看该作者
2275385864 发表于 2022-9-8 12:31
单位现在不让用共享器,后面用xlpd共享,不过例如lbp2900这种用xlpd没法共享,不知道这个可以不

xlpd共享怎么设置才能成功打印呢,能分享下经验吗

点评

原来如此  详情 回复 发表于 2023-7-25 14:03
回复

使用道具 举报

132#
发表于 2022-9-8 22:50:15 | 只看该作者
DOSforever 发表于 2022-9-4 15:27
路由器没 USB 口怎么办?就算有 USB 口,路由器放在弱电箱里,你接十几米的 USB 线到弱电箱里?你说的解 ...

主路由是主路由,人家叫你另外弄个几十鸡的路由当打印服务器
回复

使用道具 举报

133#
发表于 2022-9-8 23:11:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

134#
发表于 2022-9-9 01:53:38 | 只看该作者
小施 发表于 2022-9-8 22:37
xlpd共享怎么设置才能成功打印呢,能分享下经验吗

这个怎么说呀,连接打印机的电脑安装xlpd软件,然后添加要共享的打印机就行了,其他局域网电脑正常添加打印机,端口要选那个tcp/ip那个,就端口9100的raw还是l啥来着,手头没电脑有点忘了,这玩意大部分打印机是可以的,单位打印机型号不多,不行的只知道lbp2900,hp1020那些1开头的可以,爱普生一体机和兄弟的也都可以,有条件还是用共享服务器,我之前用的是维斯易联的,基本没出过问题,偶尔重启下就行了。
回复

使用道具 举报

135#
发表于 2022-9-9 10:42:09 | 只看该作者
本帖最后由 zhuwg 于 2022-9-9 10:43 编辑
chinaren12 发表于 2022-9-8 19:55
极有可能,hp的m1005,p1007,p1008,p1108等打印机的打印处理器都不是winprint的raw。。。

这可能就 ...

继续修改,参考路由器实现方法,
先发一段数据给打印机,再开始打印
数据已经被我写的程序里面如下
unsigned char data[222443]
这个应该只能用于p1007,请试试,hp1xxx系列估计都要发这个给打印机
来源是https://dl.t2.re/Others/Openwrt% ... 3%E5%8D%B0%E6%9C%BA


hp打印机.png (45.37 KB, 下载次数: 108)

hp打印机.png

RawPrintServer100-p1007.rar

626.8 KB, 下载次数: 52, 下载积分: 无忧币 -2

点评

我的Panasonic KX-MB771 GDI 打印机也成功打印了,多谢!  详情 回复 发表于 2022-9-13 09:56
如果把这些1006,1007,1008,1505,1005都写到这个小工具里面,那你要如何判断对应的打印机是什么型号呢?是根据名字呢? 还是根据USB对应的PID和VID呢?  详情 回复 发表于 2022-9-11 19:05
好的,测试后反馈给你。。  详情 回复 发表于 2022-9-9 15:47
回复

使用道具 举报

136#
 楼主| 发表于 2022-9-9 15:47:44 | 只看该作者
zhuwg 发表于 2022-9-9 10:42
继续修改,参考路由器实现方法,
先发一段数据给打印机,再开始打印
数据已经被我写的程序里面如下

好的,测试后反馈给你。。
回复

使用道具 举报

137#
 楼主| 发表于 2022-9-9 15:48:39 | 只看该作者
今天我已经测试了佳能LBP2900,可以支持打印。

昨天测试了柯美的bizhub 15也可以打印。
回复

使用道具 举报

138#
发表于 2022-9-10 00:11:37 来自手机 | 只看该作者
https://github.com/frogmorecs/RawPrint

点评

我下午看看,这个好像比rawprintserver更全面。  详情 回复 发表于 2022-9-10 12:26
回复

使用道具 举报

139#
 楼主| 发表于 2022-9-10 12:26:10 来自手机 | 只看该作者
本帖最后由 chinaren12 于 2022-9-10 18:45 编辑
小施 发表于 2022-9-10 00:11
https://github.com/frogmorecs/RawPrint

我下午看看,这个好像比rawprintserver更全面。
但是我没看明白这个怎么使用的。

RawPrint
.Net library to send files directly to a Windows printer bypassing the printer driver.
Send PostScript, PCL or other print file types directly to a printer.
Requires .Net 4 runtime on Windows XP to 10 and Server 2003 to 2012.
Usage:
    using RawPrint;    // Create an instance of the Printer    IPrinter printer = new Printer();    // Print the file    printer.PrintRawFile(PrinterName, Filepath, Filename);
Installation:
To install Raw Print, run the following command in the [color=var(--color-accent-fg)]Package Manager Console
PM> Install-Package RawPrint这个似乎不能单独使用呀。。。

回复

使用道具 举报

140#
发表于 2022-9-10 22:32:27 | 只看该作者
本帖最后由 zhuwg 于 2022-9-10 22:36 编辑
chinaren12 发表于 2022-9-10 12:26
我下午看看,这个好像比rawprintserver更全面。
但是我没看明白这个怎么使用的。

这个我在本贴25楼已经发过了,
Send PostScript, PCL or other print file types directly to a printer.
大概功能和我104楼提供那个print测试差不多,
直接发送PS或者PCL格式给打印机,问题是p1007只认RAW格式,其他打印机支持这些格式可以直接打

点评

老哥,你那个带1007代码的还是无法让hp p1007打印。我感觉是不是数据接收的问题呢?我从这边生成的1.2m的数据,到了rawprintserver接收到270k就没了。 很奇怪。。。  详情 回复 发表于 2022-9-11 11:06
我感觉那个不像一个完整的程序,应该是一部分。  详情 回复 发表于 2022-9-11 10:39
回复

使用道具 举报

141#
 楼主| 发表于 2022-9-11 10:39:54 | 只看该作者
zhuwg 发表于 2022-9-10 22:32
这个我在本贴25楼已经发过了,
Send PostScript, PCL or other print file types directly to a printer ...

我感觉那个不像一个完整的程序,应该是一部分。
回复

使用道具 举报

142#
 楼主| 发表于 2022-9-11 11:06:21 | 只看该作者
本帖最后由 chinaren12 于 2022-9-11 11:18 编辑
zhuwg 发表于 2022-9-10 22:32
这个我在本贴25楼已经发过了,
Send PostScript, PCL or other print file types directly to a printer ...

P1007可以打印了。打印测试页也可以,可以直接打印文档。
接近完美了。你可以把另外的HP打印机型号加进去了。
回复

使用道具 举报

143#
 楼主| 发表于 2022-9-11 19:05:42 | 只看该作者
zhuwg 发表于 2022-9-9 10:42
继续修改,参考路由器实现方法,
先发一段数据给打印机,再开始打印
数据已经被我写的程序里面如下

如果把这些1006,1007,1008,1505,1005都写到这个小工具里面,那你要如何判断对应的打印机是什么型号呢?是根据名字呢?
还是根据USB对应的PID和VID呢?
回复

使用道具 举报

144#
发表于 2022-9-11 19:43:39 | 只看该作者
谢谢分享,有机会测试一下
回复

使用道具 举报

145#
发表于 2022-9-11 20:33:42 | 只看该作者
本帖最后由 zhuwg 于 2022-9-11 20:43 编辑
chinaren12 发表于 2022-9-11 11:06
P1007可以打印了。打印测试页也可以,可以直接打印文档。
接近完美了。你可以把另外的HP打印机型号加进 ...

感谢大神耐心测试,真是好消息
我测试发给p1007打印机一个任务,任务没自动消失,
但打印机也没反应,我就取消了打印任务,
不知道是不是p1007反应比较慢,还是我发送端配置有问题,
我的配置如下,请大神指点

端口9100.png (26.46 KB, 下载次数: 110)

端口9100.png

p1007.png (45.17 KB, 下载次数: 106)

p1007.png

处理器.png (21.18 KB, 下载次数: 109)

处理器.png

高级.png (102.15 KB, 下载次数: 93)

高级.png

点评

我这边是把打印机名字改为了p1007,刚开始第一次测试也没打出来,后面我排查了一下问题,是我两边的打印处理器设置不一样,后面我改了就可以了,我明天把两边的设置截图给你看。和你这个没有区别的,要说不同难道是i  详情 回复 发表于 2022-9-11 21:18
回复

使用道具 举报

146#
发表于 2022-9-11 20:54:01 | 只看该作者
chinaren12 发表于 2022-9-11 19:05
如果把这些1006,1007,1008,1505,1005都写到这个小工具里面,那你要如何判断对应的打印机是什么型号呢 ...

一般来说,大部分人不会改打印机的名字,
判断名字基本上可行
最严谨的方法肯定判断USB对应的PID和VID,
设备就靠PID和VID来识别和安装驱动的,
还有个最简单粗暴的方法,就是让用户选择,

也就是增加一个hp参数,属于余下打印机的多加个-hp1000让rawprint识别
hp1000
hp1005
hp1018
hp1020
hpP1005
hpP1006
hpP1007
hpP1008
hpP1505

点评

我觉得还是用打印机名字吧!毕竟通过pid和vid可能会加大难度和工作量。  详情 回复 发表于 2022-9-11 21:15
回复

使用道具 举报

147#
 楼主| 发表于 2022-9-11 21:15:13 来自手机 | 只看该作者
zhuwg 发表于 2022-9-11 20:54
一般来说,大部分人不会改打印机的名字,
判断名字基本上可行
最严谨的方法肯定判断USB对应的PID和VID ...

我觉得还是用打印机名字吧!毕竟通过pid和vid可能会加大难度和工作量。
回复

使用道具 举报

148#
 楼主| 发表于 2022-9-11 21:18:29 来自手机 | 只看该作者
zhuwg 发表于 2022-9-11 20:33
感谢大神耐心测试,真是好消息
我测试发给p1007打印机一个任务,任务没自动消失,
但打印机也没反应, ...

我这边是把打印机名字改为了p1007,刚开始第一次测试也没打出来,后面我排查了一下问题,是我两边的打印处理器设置不一样,后面我改了就可以了,我明天把两边的设置截图给你看。和你这个没有区别的,要说不同难道是ip地址不同?
回复

使用道具 举报

149#
发表于 2022-9-11 22:36:25 | 只看该作者
本帖最后由 zhuwg 于 2022-9-11 22:37 编辑
chinaren12 发表于 2022-9-11 21:15
我觉得还是用打印机名字吧!毕竟通过pid和vid可能会加大难度和工作量。

我随便找了一段代码,实测可以正常获取pid和gid,
但有个问题,如果安装了超过一台打印机看怎么识别
  1. // usb.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"

  4. #include <windows.h>
  5. #include <cstdio>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <atlstr.h>
  10. #include <strmif.h>
  11. #include <setupapi.h>
  12. #include <initguid.h>
  13. #pragma comment(lib,"setupapi.lib")
  14. #pragma comment(lib,"strmiids.lib")
  15. using namespace std;

  16. DEFINE_GUID(CLSID_SystemDeviceEnum, 0x62be5d10, 0x60eb, 0x11d0, 0xbd, 0x3b, 0x00, 0xa0, 0xc9, 0x11, 0xce, 0x86);
  17. DEFINE_GUID(GUID_DEVINTERFACE_HID, 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30);

  18. //存放设备的PID VID DEVID信息;
  19. typedef struct _DevInfo
  20. {
  21.         int nPID;
  22.         int nVID;
  23.         int nDevId;
  24. }DevInfo, * pDevInfo;

  25. std::vector<DevInfo> vecDevInfo;
  26. //获取所有设备的PID_VID Begin


  27. HRESULT EnumAllDevices()
  28. {        
  29.         int nRet = -1;
  30.         // 初始化当前线程上的COM库
  31.         CoInitialize(NULL);
  32.         ICreateDevEnum* pDevEnum = NULL;
  33.         // 创建与指定的类标识符关联的类的单个未初始化对象。
  34.         HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, // 用于创建对象的数据和代码关联的类标识符
  35.                 NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (LPVOID*)&pDevEnum);
  36.         if (SUCCEEDED(hr))
  37.         {
  38.                 IEnumMoniker* pEnumMon = NULL;
  39.                 hr = pDevEnum->CreateClassEnumerator(GUID_DEVINTERFACE_HID, &pEnumMon, 0);
  40.                 if (hr == S_OK)
  41.                 {
  42.                         pEnumMon->Reset();
  43.                         ULONG cFetched = 0;
  44.                         IMoniker* pMoniker = NULL;
  45.                         while (hr = pEnumMon->Next(1, &pMoniker, &cFetched), hr == S_OK)
  46.                         {
  47.                                 IPropertyBag* pProBag = NULL;
  48.                                 hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (LPVOID*)&pProBag);
  49.                                 if (SUCCEEDED(hr))
  50.                                 {
  51.                                         OLECHAR* pName = NULL;
  52.                                         hr = pMoniker->GetDisplayName(NULL, NULL, &pName);
  53.                                         if (SUCCEEDED(hr))
  54.                                         {
  55.                                                 CString szTemp;
  56.                                                 BSTR bsTemp = SysAllocString(pName); // 分配内存
  57.                                                 szTemp = bsTemp;
  58.                                                 SysFreeString(bsTemp);
  59.                                                 pName = NULL;
  60.                                                 //解析字符串
  61.                                                 szTemp.Delete(0, szTemp.Find(_T("#")) + 1);
  62.                                                 szTemp.Delete(szTemp.Find(_T("#")), 1000);
  63.                                                 szTemp.Delete(17, 1000);
  64.                                                 //获取PID VID
  65.                                                 int VID = 0, PID = 0;
  66.                                                 szTemp.MakeUpper();
  67.                                                 sscanf(szTemp.Mid(13, 4), _T("%X"), &PID);
  68.                                                 sscanf(szTemp.Mid(4, 4), _T("%X"), &VID);
  69.                                                 DevInfo stDevinfo;
  70.                                                 stDevinfo.nPID = PID;
  71.                                                 stDevinfo.nVID = VID;
  72.                                                 //设备ID号,从0开始
  73.                                                 vecDevInfo.push_back(stDevinfo);
  74.                                                 nRet = 0;
  75.                                         }
  76.                                         pProBag->Release();
  77.                                 }
  78.                                 pMoniker->Release();
  79.                         }
  80.                         pEnumMon->Release();
  81.                 }
  82.         }
  83.         CoUninitialize();
  84.         return nRet;
  85. }

  86. int _tmain(int argc, _TCHAR* argv[])
  87. {
  88.         EnumAllDevices();
  89.         for (int i = 0; i < (int)vecDevInfo.size(); i++)
  90.         {
  91.                 std::cout << "VID: " << vecDevInfo[i].nVID << "    PID: " << vecDevInfo[i].nPID << std::endl;
  92.         }
  93.         system("pause");

  94.         return 0;
  95. }

复制代码


vid.png (65.81 KB, 下载次数: 104)

vid.png
回复

使用道具 举报

150#
发表于 2022-9-11 23:16:09 | 只看该作者
感谢分享,这个还是很不错的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 16:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表