Windows的虚拟打印机驱动程序

bit*_*nny 6 printing virtual

能帮我解决以下问题吗?

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

Car*_*ory 7

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

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

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


ese*_*elk 5

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


Dou*_*son 1

不确定我是否完全理解。您有一个可以生成 Postscript 的应用程序,并且想将其转换为其他内容?如果应用程序输出“打印就绪”数据,那么新的打印机驱动程序将无济于事,因为“队列/驱动程序”只是将数据获取到打印机的一种方法,而不是创建输出文件的方法。

你可能最好看看类似的东西: Redmon

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

只是一个想法。