能帮我解决以下问题吗?
你需要的是一个端口监视器.您可以使用WDK中的Microsoft Postscript驱动程序创建虚拟打印机.您无需为此部件提供任何代码,只需提供INF和PPD文件来描述您的虚拟打印机.一旦您完成了工作和安装,用户将在从应用程序打印时看到您的虚拟打印机.该打印机将像任何标准Postscript打印机一样生成Postscript流,然后将其发送到打印机的端口监视器.
现在添加一个端口监视器来处理将Postscript流转换为您需要的任何格式.端口监视器比打印驱动程序更容易处理.
编辑:Andy在评论中指出v4(即Win8)打印驱动程序不支持自定义端口监视器.但是,v3驱动程序仍然可以在Win8中运行.
我知道这已经过时了,但是几个月前,当我开始这个项目时,这些答案会对我有所帮助。我花了很多时间创建一个端口监视器,最后才找到一个更简单的方法(参见下面的 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) 提供的 Virtual PDF Printer,使用端口监视器,以及渲染插件和 UI 插件,用于 PSCRIPT5 驱动程序。
端口监视器的问题在于它不在用户的上下文中运行——而不是在执行打印的应用程序/进程的上下文中运行。它在打印后台处理程序的上下文中运行,并且需要大量的技巧来确定哪个用户/会话正在执行打印。
如果您想要位图数据,例如保存为 JPG/BMP/PNG,那么只需为通用打印机驱动程序创建一个渲染插件并在IPrintOemUni::FilterGraphics 中访问/保存位图数据。
如果您希望 PostScript 数据与 GhostScript(或其他库,或您自己的代码)一起使用以转换为 PDF 或其他格式,那么只需为 PSCRIPT5 驱动程序创建一个渲染插件并在 IPrintOemUni2 中访问/保存 PS 数据: :写打印机。
无论哪种情况,您都需要一个渲染插件。如果您想在打印时轻松显示 UI,并希望您的代码在与用户相同的上下文中运行,而不是在后台处理程序服务中运行,那么请确保您将打印机设置为直接打印到打印机——绕过后台处理程序。如果您使用AddPrinter安装您的打印机,您将使用PRINTER_ATTRIBUTE_DIRECT标志。