打印作业接受和路由软件

时间:2010-07-22 17:22:22

标签: c# windows-services printing wmi wdk

我想创建一个可以接受来自其他计算机的打印作业的软件,然后将这些打印作业路由到连接了打印机的局域网上的PC。

它将如何发生 - > 1-当在计算机“X”上安装名为“虚拟打印机”的软件时,Windows应该认为它是该计算机的打印驱动程序/连接的打印机。 2-然后该PC的管理员转到Windows中的“设备和打印机”并选择“虚拟打印机”,右键单击并查看属性,然后选中“共享此打印机”复选框 3-现在LAN上的其他PC可以看到LAN中的共享打印机呼叫“虚拟打印机”连接到计算机“X” 4-因此,他们可以通过在需要打印时选择“虚拟打印机”将打印作业发送到此“虚拟打印机”。

如何编写此程序(可能是c#)以将其自身显示为Windows的打印机,然后接受传入的打印作业并将其发送到连接了打印机的所需计算机。

我不知道如何编写这个东西,我也不知道,请帮助我一些资源,代码或示例项目或至少与此类似的示例。 感谢

3 个答案:

答案 0 :(得分:2)

有一个商业组件允许您在Windows中创建虚拟打印机。见http://www.colorpilot.com/emfprinterpilot.html

答案 1 :(得分:2)

这可以通过正确的方式结合四种成分来完成:

  • 使用PostScript打印机驱动程序进行打印队列设置,在LAN上共享;
  • Ghostscript(向下滚动以获取gs871w{32,64}.exe)将PostScript转换为图片;
  • RedMon(下载redmon17.zip)作为“打印机端口监视器”;
  • DOS批处理文件(或C#程序,如果你愿意)完全按照自己的意愿行事;

printqueue将使用' Red irector Port Mon itor'(RedMon)将传入的PostScript作业引导至您选择的程序/应用程序/批处理脚本。

剩下要做的就是你的工作:编写一个简单的程序/应用程序/批处理脚本,它可以做三件事:

  1. 将传入的PostScript作为输入,
  2. 调用Ghostscript命令行将输入转换为您选择的%imageformat%
  3. 最后将%imageformat%作为作业发送到您选择的打印机。
  4. 这是一篇描述RedMon的基本需要知识的文档:


    如果你是Ghostscript的新手,你可能会遇到构建一个可以完成你需要的命令行的最大问题。这里有些例子。

    第一个将到达标准输入的数据(stdin,命令末尾的-)转换为单页黑色+白色TIFF G4,分辨率为600dpi,每页都是单独的文件,名为page_001.tifpage_002.tif等:

    gswin32c ^
       -dBATCH ^
       -dNOPAUSE ^
       -dSAFER ^
       -sDEVICE=tiffg4 ^
       -r600x600 ^
       -sOutputFile=c:/path/to/output/page_%03d.tif ^
       -       ### <-- note this '-'!
    

    这是一个Ghostscript命令行,它会生成相同的输出,但这次是一个单页多页TIFF G4:

    gswin32c ^
       -dBATCH ^
       -dNOPAUSE ^
       -dSAFER ^
       -sDEVICE=tiffg4 ^
       -r600x600 ^
       -sOutputFile=c:/path/to/output/multi_page_g4.tif ^
       -       ### <-- note this '-'!
    

    哦,你不想要黑色+白色G4 TIFF,而是彩色TIFF,32位CMYK?好的,为Ghostscript使用不同的输出设备:

    gswin32c ^
       -dBATCH ^
       -dNOPAUSE ^
       -dSAFER ^
       -sDEVICE=tiff32nc^
       -r600x600 ^
       -sOutputFile=c:/path/to/output/multi_page_color.tif ^
       -       ### <-- note this '-'!
    

    你想要JPEG吗?对不起,没有多页JPEG这样的东西。但是单页没有问题:

    set outputname=some-uniq-name && ^
    gswin32c ^
       -dBATCH ^
       -dNOPAUSE ^
       -dSAFER ^
       -sDEVICE=jpeg ^
       -dJPEGQ=95 ^
       -r600x600 ^
       -sOutputFile=c:/path/to/output/%outputname%-page_%03d.jpeg ^
       -       ### <-- note this '-'!
    

答案 2 :(得分:2)

根据您的原始问题回顾我的第一个答案,我不再理解为什么我如此强调“将传入的作业转换为图像” -stage。可能是因为您在一个答案中提到过您想要一个类似于imageprinter的功能。

无论如何,既然您现在明确表示您的主要目标是将所有传入的作业转发到其他计算机(安装了真正的打印机) - 这也可以通过以下方式实现:

  • 带有PostScript驱动程序的打印队列
  • Ghostscript的
  • RedMon作为打印队列的端口监视器
  • DOS批处理脚本

现在差异是双重的:

  1. 现在您没有以将传入的PostScript转换为图像格式的方式设置RedMon / Ghostscript。
  2. 现在你设置RedMon以一种方式运行Ghostscript,通过'remotecomputer'(包括真正的驱动程序)的真实目标队列'sharedprintername'来路由作业。
  3. Ghostscript命令类似于:

      gswin32c.exe ^
       -dNOPAUSE ^
       -dBATCH ^
       -dQUIET ^
       -sDEVICE=mswinpr2 ^
       -dNoCancel ^
       -sOutputFile="%%printer%%\\remotecomputer\sharedprintername" ^
       -        ### <-- note this '-' !