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