Windows的虚拟打印机驱动程序

6

您能帮我解答以下问题吗...

  • 如果我需要一个虚拟打印机将PostScript流转换为另一种格式,我是需要从头实现一个虚拟打印机还是实现渲染插件呢?
  • 渲染插件似乎仅支持某些自定义选项。此外,数据总是传输到不需要的 spooler。
  • 如果我实现了一个虚拟打印机驱动程序,它是否完全替换 Microsoft PostScript 驱动程序或 Microsoft Universal 驱动程序?
  • 由于我的驱动程序是虚拟的,我编写 PostScript 兼容还是通用驱动兼容是否有所影响?
  • 除了实现虚拟打印机驱动程序以外,还有其他方法将打印文档转换为自定义文档格式吗?我能否作为端口监视器或其他方式挂钩?据我所知,似乎不行。
4个回答

8
您需要的是端口监视器。您可以使用 WDK 中找到的 Microsoft Postscript 驱动程序创建虚拟打印机。对于这部分,您不需要提供任何代码,只需提供一个 INF 和 PPD 文件来描述您的虚拟打印机。安装并启用后,用户将在应用程序打印时看到您的虚拟打印机。该打印机将像任何标准 Postscript 打印机一样生成一系列 Postscript 流,然后将其发送到打印机的端口监视器中。
现在添加一个端口监视器来处理将 Postscript 流转换为您需要的任何格式。与打印驱动程序相比,端口监视器要容易得多。
编辑:Andy 在评论中指出,v4(即 Win8)打印驱动程序不支持自定义端口监视器。但是,v3 驱动程序仍然适用于 Win8。

1
作为对此建议的更新,V4打印机驱动程序不支持自定义端口监视器,因此如果您想要某些具有未来性的东西,则此建议可能不可行。尽管如此,V3驱动程序仍将在Win 8中工作。 - Andy
@Carey Gregory:好的,谢谢。我可能需要仔细阅读你上面的描述,看看我如何实现它。你知道有哪些好的资源可以找到一些例子吗? - Mark Redman
1
我一直在网上搜寻有关端口监视器、localmon以及创建自定义打印驱动程序的设置信息,以便在我的独立应用程序中获取PostScript文件并使用它。是否有人知道一个明确的示例来解释如何设置所有这些内容?这个主题似乎相当难以捉摸。我需要在商业应用程序中使用它,所以像Redmon等示例对我这个过程没有什么帮助。 - Mark Redman
1
@MarkRedman - 我已经从事打印驱动程序和端口监视器工作超过15年了,我可以告诉你,你目前发现的就是它。Windows打印子系统的文档糟糕透顶,而且往往是完全错误的,好的示例几乎不存在。好消息是现在比以前好多了。大部分情况下,在WDK中找到的示例就是你必须开始使用的,除非你外包。 - Carey Gregory
@Carey Gregory - 感谢您的回复,我看到了您的其他答案和评论,不幸地怀疑如此。雇用或购买商业和可定制的产品可能是我要走的路..但还没有探索过OSX选项 <发抖> - Mark Redman
显示剩余4条评论

5

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

如果我需要一个虚拟打印机,将PostScript流转换为不同的格式,我需要从头开始实现虚拟打印机还是实现渲染插件?

你需要实现渲染插件。

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

没错 - 你需要决定它是否足够适合你的需求。

此外,数据总是传输到不需要的打印池中。

这应该不是问题。

如果我实现虚拟打印机驱动程序,它会完全替换Microsoft PostScript驱动程序或Microsoft Universal驱动程序吗?

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

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

这取决于您想要什么格式的数据。如果您想要位图格式,则通用驱动程序更好;如果您想要PostScript格式,则PS更好。如果您想要每行绘制、文本输出和其他GDI操作的数据,则任何一个都可以。

除了实现虚拟打印机驱动程序之外,还有其他将打印文档转换为自定义文档格式的方法吗?我能作为端口监视器或其他东西进行挂钩吗?根据我所理解的,我猜想不行。

大多数需要原始访问PostScript数据的人,通常使用端口监视器来实现此目的,例如Adobe在完整版Acrobat(Writer)中提供的虚拟PDF打印机使用了端口监视器,还使用了渲染插件和UI插件以及PSCRIPT5驱动程序。
端口监视器的问题在于它不在用户的上下文环境中运行 - 不在执行打印操作的应用程序/进程的上下文环境中。它在打印池程序的上下文环境中运行,并需要进行许多黑客攻击才能确定哪个用户/会话正在执行打印操作。
如果您需要位图数据,以保存为JPG/BMP/PNG格式,那么只需为通用打印机驱动程序创建一个渲染插件并在IPrintOemUni::FilterGraphics中访问/保存位图数据即可。
如果你想要PostScript数据,与GhostScript(或其他库或自己的代码)一起使用,将其转换为PDF或其他格式,则只需为PSCRIPT5驱动程序创建渲染插件并在IPrintOemUni2 :: WritePrinter中访问/保存PS数据即可。
无论哪种情况,您都需要一个渲染插件。 如果您想在打印时轻松显示UI,并希望您的代码在用户上下文中而不是汇流排服务中运行,请确保将打印机设置为直接打印到打印机 - 绕过汇流排。 如果您使用AddPrinter安装打印机,则应使用PRINTER_ATTRIBUTE_DIRECT标志。

我正在处理一个类似的问题。IPrintOemUni2::WritePrinter能让我以xps格式获取数据吗?基本上是一个.xps文件。 - tunafish24

1

不太确定我完全理解。你有一个能产生Postscript的应用程序,而你想将其转换成其他格式?如果应用程序输出的是“打印就绪”数据,那么新的打印机驱动程序是无法帮助的,因为“队列/驱动程序”只是将数据发送到打印机的一种方式,而不是创建输出文件的东西。

你最好看一下这个:Redmon

它可以接收输出并生成一个新的进程。思路是让它将Postscript输出到一个文件,然后启动你自己创建的一些控制台.exe程序来处理它。

只是一个想法。


0

再次不确定您是如何进行此操作的,但Ghostscript是将PS输出转换为任何其他格式的最简单方法。编写自己的Ghostscript输出格式也相当容易。

所有这些都发生在应用程序级别 - 无需编写驱动程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接