问题描述
我试图找到一种通用的解决方案,该解决方案是在Windows 7/10 OS上的实际打印机上打印时,如何将文档另存为PDF。 方案:无论我要打印图像还是文件,还是从第三方应用程序(例如POS或屏幕打印)进行打印(例如用户按第三方应用程序上的品脱按钮,或者如果第三方应用程序支持此热键,请按CTRL + P),我需要将该文档另存为PDF,并将此文档保存到正在打印纸质副本的实际打印机中。我想概括地支持所有类型的打印机,无论是点阵打印机,激光打印机还是热敏打印机等等。
我尝试过的解决方案:
- 虚拟打印机,它将打印pdf,然后将pdf路由到实际打印机。但是很少有打印机不支持PDF,例如热敏打印机不支持PDF,此外,为此,我需要注意纸张设置和页面设置。 我已经尝试过像Win2PDF / ClawPDF这样的虚拟打印机
- 我研究了Windows Printing体系结构,并尝试保存假脱机文件并侦听打印事件,并将假脱机文件路由到虚拟打印机以创建pdf。由于某些打印机驱动程序会发出RAW假脱机文件,因此这部分起作用。 PCL和Postscript可以很好地转换为PDF。
- 使用诸如PrintMulti之类的打印处理器,但与第二个一样。
- 即使从Windows Printing可以从中创建假脱机文件的某种输入文件,我也试图进行调查,但是我无法获取。
- 我尝试了打印机池化,但这就像是负载共享之类的东西。
有人可以帮我吗?我也无法在Google上找到任何解决方案,因此请在此处发布。这看起来是正常的事情,但是即使在两周后,我也无法找到任何解决方案。这很难实现广义解决方案吗?
解决方法
请考虑使用一种类似ePrint虚拟打印机的方法,该方法的工作原理是从打印作业中捕获Windows EMF文件并将其转换为PDF,同时还能够将EMF发送到物理打印机并进行打印。该应用程序本身允许在虚拟打印机中创建打印任务,可以将其配置为保存为PDF并批量打印到其他打印机。
另一方面,ePrint基于LEADTOOLS虚拟打印机SDK,如果您想编写自己的方法,这可能对您有用。
例如,挂钩到虚拟打印机以将捕获的EMF保存为PDF的事件的代码:
// Write the EMF as file to disk as PDF.
static void VirtualPrinter_EmfEvent( object sender,EmfEventArgs e )
{
string pdfPath = Path.Combine(
@"c:\Output\PDF\",Path.GetFileNameWithoutExtension( Path.GetRandomFileName() )
) + ".pdf";
Directory.CreateDirectory( Path.GetDirectoryName( pdfPath ) );
// Create an instance of the LEADTOOLS DocumentWriter
DocumentWriter docWriter = new DocumentWriter();
docWriter.BeginDocument( pdfPath,DocumentFormat.Pdf );
DocumentEmfPage page = new DocumentEmfPage() {
EmfHandle = new Metafile( e.Stream ) )
.GetHenhmetafile()
};
docWriter.AddPage( page );
docWriter.EndDocument();
}
如果您对更多详细信息感兴趣,可以查看这篇文章here。