I'm looking to create a virtual printer that passes data to my .NET application. I want to then create an installer that installs both the printer and the .NET application. It would we really nice to be able to write it all in C#, but I have a feeling that this will require a printer driver to be written is unmanaged code. Does anyone know of a fairly clean tutorial or example of how to do this?
8 回答
访问http://www.printerplusplus.com。它是开源的.NET 虚拟打印机。它为您提供了一个安装程序和一个 .NET 类,用于编写代码来处理您的“打印机数据”。
使用 Github 项目完全符合您的要求:Microsoft/Windows-driver-samples/print/XPSDrvSmpl
https://github.com/Microsoft/Windows-driver-samples/tree/master/print/XPSDrvSmpl
应用:监听内部端口
流程:从单个安装程序安装打印机和应用程序。当应用程序侦听内部端口时,用户使用您的驱动程序打印一些东西。当发送数据时,应用程序会接收它。这是针对 XPS 的,可以转换为 PDF,但是无论您打印什么,流程都是相似的。如果您需要其他任何东西,请查看 GitHub 上的 Microsoft/Windows-driver-samples/print/ 或其他特定于您需求的资源。
更新:
关于如何让驱动程序工作的很多问题,所以这里是一个简单的例子:
如果您尚未安装 Windows 驱动程序工具包 (WDK),请先下载它。安装时选择在最后一步添加 Visual Studio 的扩展。在您的 Visual Studio 2017 安装中,您需要Desktop development with C++
拥有正确的 SDK。如果您没有它,请参阅下面有关如何添加它的分析器。
https://developer.microsoft.com/en-us/windows/hardware/windows-driver-kit
然后下载.zip
Windows-driver-samples master 的文件:
https://github.com/Microsoft/Windows-driver-samples/archive/master.zip
导航到文件夹<UnzipFolder>\print\XPSDrvSmpl
并XPSDrvSmpl.sln
在 Visual Studio 中打开。
然后按照微软自己在 GitHub 上的指南进行操作。如您所见,它适用于 Visual Studio 2015,但我认为 2017 年的情况相同(尚未测试):
要使用 Windows Driver Kit (WDK) 10 和 Visual Studio 2015 构建驱动程序解决方案,请执行以下步骤。
- 在 Visual Studio 2015 中打开解决方案文件。
- 将所有非二进制文件(通常位于示例的 \install 目录中)添加到 Package 项目:在解决方案资源管理器中,右键单击驱动程序文件 b。选择添加,然后单击现有项目 c。导航到您下载示例的位置,并选择安装目录中的所有文件,或等效的非二进制文件集,例如 INF、INI、GPD、PPD 文件等。 d. 点击添加
- 配置这些文件以添加到驱动程序包中:在解决方案资源管理器中,右键单击解决方案并选择添加 > 新项目。在 Visual C++/Windows Driver/Package 下选择 Driver Install Package。湾。在解决方案资源管理器中,右键单击包项目并选择属性。C。在左窗格中,单击配置属性 > 驱动程序安装 > 包文件。d。在右窗格中,使用省略号按钮 (...) 浏览到需要添加到驱动程序包的文件集。应添加您在步骤 2-c 中添加的所有数据文件,INF 文件除外。此配置是针对每个架构的,因此必须为将要构建的每个架构重复此配置。e. 单击确定。
- 打开 INF 文件并对其进行编辑以匹配生成的输出。一个。打开 INF 文件。湾。在版本部分,添加对目录文件的引用,如下所示:CatalogFile=XpsDrvSmpl.cat。C。在 SourceDisksFiles 部分中,将您正在构建的 DLL 文件的位置更改为 =1。这表明此驱动程序中没有特定于体系结构的目录。如果同时发布多个架构,则需要手动整理驱动程序 INF。
此时,Visual Studio 2015 将能够构建驱动程序包并将文件输出到磁盘。要配置驱动程序签名和部署,请参阅开发、测试和部署驱动程序。
https://github.com/Microsoft/Windows-driver-samples/tree/master/print/XPSDrvSmpl#build-the-sample
I think you will have to do a lot of WinAPI wrapping. Start researching on Windows Driver Development Kit to find the things you have to do.
I also found this commercial Printer Driver Resource Toolkit for .NET...
您可以简单地让您的应用程序像 LPD 类型打印机或监视器端口 9100 一样暴露自己。然后您可以安装任何您喜欢的打印驱动程序,并将其指向您的应用程序。
正在寻找类似问题的答案,并通过维基百科找到此链接 - http://www.colorpilot.com/emfprinterpilot.html(允许创建不同语言的虚拟打印机)
为什么不考虑使用替代方法。就像使用中间现成的打印程序一样,例如那些免费提供的 Print-to-PDF 应用程序。然后,您所需要的就是使用一些 3rd 方库(也具有免费和开源差异)来解码 PDF,而不是绞尽脑汁重新发明轮子。根据您认为合适的格式,您还可以考虑使用其他 Print-to-XXX 应用程序。
我也不认为解释 PDF 方法有什么好处。我不知道你为什么想做你想做的事。也许您正在尝试编写自己的 PDF 打印机。
我认为你真的应该看看 Windows 驱动程序开发的东西。如果您想开发打印机驱动程序,我认为您必须使用 C++ 来完成。
祝你好运。
如果我没记错的话,微软在打印机驱动程序开发中不支持 .NET。我还没有遇到过纯 .NET 打印机驱动程序。你会是一个非常勇敢的人这样做!网站“打印机驱动程序资源工具包”并没有说驱动程序是用 .NET 编写的