虚拟网络打印机(答者有分,好方案送300----分次)
如何使一台服务器变成一个虚拟网络打印机?
1、该服务器安装两台打印机;
2、网络中的所有用户只用安装该虚拟打印机,打印数据会被自动分流到实际的打印机上;
问题点数:100、回复次数:17Top
1 楼qstn_nsw(答案)回复于 2006-03-18 19:06:03 得分 0
有人会写逻辑打印机的驱动吗?Top
2 楼tfp(tfp)回复于 2006-03-18 19:10:03 得分 5
逻辑打印机?
我会写虚拟的打印机Top
3 楼clasj(★知我☆)回复于 2006-03-18 20:22:16 得分 75
打印机不是可以共享吗?
为什么要这么麻烦?Top
4 楼qstn_nsw(答案)回复于 2006-03-19 20:08:24 得分 0
to tfp
虚拟打印机也可以呀,可以交流一下
to clasj
我想实现所谓的集群打印
所有用户的打印任务发送到一个逻辑(虚拟)的打印机,
由我的程序决定发送到哪一个实际打印机Top
5 楼tfp(tfp)回复于 2006-03-19 21:06:05 得分 0
道理是一样的, 只要把打印的数据得到,就可以做到输出到任意台打印机上去。
Top
6 楼clasj(★知我☆)回复于 2006-03-19 23:01:37 得分 0
如果是这个需求,连虚拟打印机都不需要。。。
可以用Standard TCP/IP Port实现。
在服务器上面执行如下步骤:
点击“添加打印机”,选择“本地打印机”(底下那个CheckBox不要选中),下一步
选择“创建新端口”,类型选择“Standard TCP/IP Port”,下一步
点击弹出窗口的下一步
打印机名或IP地址填入127.0.0.1,下一步(这个地方有点慢)
选择“自定义”,然后点击“配置”,可以看到一些参数,可以适当修改,但是为了配合我后面的步骤,先不要修改
点击“完成”
接下来选择打印驱动,这个地方选择的驱动要跟你实际打印机的驱动一致,为了配合我后面的步骤,选择Apple的Apple LaserWriter 16/600 PS,下一步
下一步
下一步
下一步
选中“共享为”,下一步
下一步
下一步
完成
ok,打印机安装完毕
现在写一个程序运行在服务器上面,通过它来获得打印数据,我写了个简单的测试程序:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, IdTCPServer;
type
TDummy = class
class procedure OnConnect(AThread: TIdPeerThread);
class procedure OnDisconnect(AThread: TIdPeerThread);
class procedure OnExecute(AThread: TIdPeerThread);
end;
class procedure TDummy.OnConnect(AThread: TIdPeerThread);
begin
WriteLn('Begin');
end;
class procedure TDummy.OnDisconnect(AThread: TIdPeerThread);
begin
WriteLn('End');
end;
class procedure TDummy.OnExecute(AThread: TIdPeerThread);
var
Count: Integer;
Stream: TFileStream;
i: Integer;
begin
Stream:=TFileStream.Create('1.ps', fmCreate);
try
repeat
Count:=AThread.Connection.ReadFromStack(false);
if Count=0 then Break;
AThread.Connection.ReadStream(Stream, Count);
for i:=0 to Count div 1024 do
Write('*');
until false;
WriteLn;
finally
Stream.Free;
end;
end;
var
TCPServer: TIdTCPServer;
begin
TCPServer:=TIdTCPServer.Create(nil);
TCPServer.OnConnect:=TDummy.OnConnect;
TCPServer.OnDisconnect:=TDummy.OnDisconnect;
TCPServer.OnExecute:=TDummy.OnExecute;
TCPServer.DefaultPort:=9100;
TCPServer.Active:=true;
ReadLn;
TCPServer.Active:=false;
TCPServer.Free;
end.
ok,将程序运行起来,然后用刚才安装的打印机打印一个文档
程序运行目录下会生成一个1.ps文件,这个文件里面的数据就是你要提交到真实打印机的数据
当然,你获得数据后就可以做很多处理了。。。Top
7 楼qstn_nsw(答案)回复于 2006-03-20 10:47:56 得分 0
首先感谢clasj 和tfp两位兄弟(应该是吧:))
我有个问题是:
如果我连接的实际打印机是不同厂商的不同型号的打印机如何处理;
而我让用户只知道共享的虚拟打印机,这如何实现?Top
8 楼clasj(★知我☆)回复于 2006-03-20 11:32:46 得分 0
1.虚拟打印机尽量选择标准点的驱动,比如打印成ps文档。
然后把ps文件直接用实际打印机打印,不管实际打印机是什么驱动,标准的文档都是可以处理的。
2.你只共享虚拟打印机。Top
9 楼qstn_nsw(答案)回复于 2006-03-20 11:56:33 得分 0
有道理。有道理。
我先试一下。
好心人啊!!!
Top
10 楼qstn_nsw(答案)回复于 2006-03-20 16:38:33 得分 0
谁有标准的postscript打印驱动Top
11 楼zoologist(王朝)回复于 2006-03-20 16:53:38 得分 20
http://www.mabuse.de/vprinter.mhtmlTop
12 楼qstn_nsw(答案)回复于 2006-03-20 17:00:29 得分 0
多谢!Top
13 楼qstn_nsw(答案)回复于 2006-03-20 17:27:16 得分 0
再讨教:
clasj建议使用网络接口,然后在9100端口监听并接受数据,我很赞同,也实现了。
但是能否从PS文件中读取打印的页数和分数?不知兄弟们是否做过。
王朝兄弟给我的资源,我正在试用中……
Top
14 楼clasj(★知我☆)回复于 2006-03-20 19:00:17 得分 0
用Ghostscript解释ps文件。。。
随便一搜就有介绍:
http://zhidao.baidu.com/question/4643601.html
我以前用过一点点,功能很强大,有sdk和文档,不过接口是c语言描述的,不过还算好用。Top
15 楼qstn_nsw(答案)回复于 2006-03-27 15:12:54 得分 0
再请教clasj:
是否当前PostScript打印机驱动是否通用?帮我确认一下;
另外,我要结贴,请关注新的贴子,我将兑现了。Top
16 楼clasj(★知我☆)回复于 2006-03-27 18:00:22 得分 0
我觉得Apple的Apple LaserWriter 16/600 PS就已经非常通用了:)
发新帖后记得给我发个小纸条。。。Top
17 楼qstn_nsw(答案)回复于 2006-03-27 23:04:01 得分 0
谢谢各位!Top




