答案 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编写自己的输出格式也很容易。
这一切都发生在应用程序级别 - 无需编写驱动程序。