Windows的虚拟打印机驱动程序

时间:2010-02-03 08:03:38

标签: virtual printing

你可以帮我解决以下问题......

  • 如果我需要一台将PostScript流转换为其他格式的虚拟打印机,我是否必须从头开始实施虚拟打印机或实现渲染插件?
  • 渲染插件似乎只支持某些自定义。此外,数据总是发送到假脱机程序,在这种情况下不需要。
  • 如果我实现虚拟打印机驱动程序,它是否完全取代了Microsoft PostScript驱动程序或Microsoft通用驱动程序?
  • 由于我的驱动程序是虚拟的,如果我编写符合PostScript标准或符合通用驱动程序的驱动程序是否重要?
  • 除了实现虚拟打印机驱动程序之外,还有将打印文档转换为自定义文档格式的其他方法吗?我可以作为端口监视器挂钩吗?据我所知,我猜不是。

4 个答案:

答案 0 :(得分:7)

您需要的是端口监视器。您可以使用WDK中的Microsoft Postscript驱动程序创建虚拟打印机。您无需为此部件提供任何代码,只需提供INF和PPD文件来描述您的虚拟打印机。一旦您完成了工作和安装,用户将在从应用程序打印时看到您的虚拟打印机。该打印机将像任何标准Postscript打印机一样生成Postscript流,然后将其发送到打印机的端口监视器。

现在添加一个端口监视器来处理将Postscript流转换为您需要的任何格式。端口监视器比打印驱动程序更容易处理。

编辑:Andy在评论中指出v4(即Win8)打印驱动程序不支持自定义端口监视器。但是,v3驱动程序仍然可以在Win8中运行。

答案 1 :(得分:3)

我知道这已经过时了,但几个月前,当我开始这个项目时,这些答案对我有所帮助。我花了很多时间创建一个端口监视器,最后才找到一个更简单的方法(参见下面的WritePrinter链接)。

  

如果我需要一个将PostScript流转换为的虚拟打印机   不同的格式,我是否必须实现虚拟打印机   抓取或实现渲染插件?

渲染插件就是您想要的。

  

渲染插件似乎只支持某些自定义。

正确 - 你必须决定它是否足够你。

  

此外,数据总是发送到不需要的假脱机程序   这种情况。

这应该不是问题。

  

如果我实现虚拟打印机驱动程序,它会完全取代   Microsoft PostScript驱动程序或Microsoft通用驱动程序?

如果您实现了渲染插件,则它不会替换PS / Uni驱动程序。 PS / Uni驱动程序实际上是由大量(可能是90%?)的所有"打印机驱动程序"使用的。制造打印机的OEM不想编写自己的驱动程序,因此他们使用PS / Uni驱动程序设计 - 有些是创建UI插件,有些是渲染插件,有些是两者,有些都没有。

  

由于我的驱动程序是虚拟的,如果我编写PostScript是否重要   是否兼容或符合通用驱动程序?

这取决于你想要数据的格式。如果你想要位图格式,一个Uni驱动程序更好,如果你想要PostScript格式,PS更好。如果你想要绘制每一行的数据,文本输出和其他GDI操作,那么要么是好的。

  

将打印文档转换为自定义文档的任何其他方法   格式除了实现虚拟打印机驱动程序?我可以挂钩吗?   作为端口监视器还是什么?根据我的理解,我猜   不

大多数想要对PostScript数据进行原始访问的人,通常使用GhostScript转换为PDF或其他格式,使用端口监视器来执行此操作。例如,Adobe附带完整版Acrobat(Writer)的虚拟PDF打印机使用端口监视器,以及PSCRIPT5驱动程序的渲染插件和UI插件。

端口监视器的问题在于它不会在用户的上下文中运行 - 而不是在执行打印的应用程序/进程的上下文中运行。它在打印假脱机程序的上下文中运行,并且需要大量的黑客来确定哪个用户/会话正在进行打印。

如果你想要位图数据,例如保存为JPG / BMP / PNG,那么只需为通用打印机驱动程序创建一个渲染插件,然后在IPrintOemUni::FilterGraphics内访问/保存位图数据。 / p>

如果您想要PostScript数据,与GhostScript(或其他库或您自己的代码)一起使用以转换为PDF或其他格式,那么只需为PSCRIPT5驱动程序创建渲染插件并访问/保存PS数据在IPrintOemUni2::WritePrinter内。

在任何一种情况下,您都需要一个渲染插件。如果您希望在打印时轻松显示UI,并希望代码在与用户相同的上下文中运行,而不是假脱机程序服务,那么请确保将打印机设置为直接打印到打印机 - 绕过假脱机程序。如果您使用AddPrinter安装打印机,则可以使用PRINTER_ATTRIBUTE_DIRECT标记。

答案 2 :(得分:1)

不确定我完全理解。你有一个产生Postscript的应用程序,你想将其转换为其他东西?如果应用程序输出'打印就绪'数据,那么新的打印机驱动程序将无法提供帮助,因为'队列/驱动程序'只是将数据提供给打印机而不是创建输出文件的方法。 / p>

您可能最好查看以下内容:Redmon

这可以获取输出并生成一个新进程。我们的想法是你将Postscript输出到一个文件然后你启动一个你创建的控制台.exe。

只是一个想法。

答案 3 :(得分:0)

再次不确定你这样做的方式,但ghostscript是将PS输出转换为任何其他格式的最简单方法。为ghostscript编写自己的输出格式也很容易。

这一切都发生在应用程序级别 - 无需编写驱动程序。