在实际打印机上打印文档时如何保存为PDF

问题描述

我试图找到一种通用的解决方案,该解决方案是在Windows 7/10 OS上的实际打印机上打印时,如何将文档另存为PDF。 方案:无论我要打印图像还是文件,还是从第三方应用程序(例如POS或屏幕打印)进行打印(例如用户按第三方应用程序上的品脱按钮,或者如果第三方应用程序支持此热键,请按CTRL + P),我需要将该文档另存为PDF,并将此文档保存到正在打印纸质副本的实际打印机中。我想概括地支持所有类型的打印机,无论是点阵打印机,激光打印机还是热敏打印机等等。

我尝试过的解决方案:

  1. 虚拟打印机,它将打印pdf,然后将pdf路由到实际打印机。但是很少有打印机不支持PDF,例如热敏打印机不支持PDF,此外,为此,我需要注意纸张设置和页面设置。 我已经尝试过像Win2PDF / ClawPDF这样的虚拟打印机
  2. 我研究了Windows Printing体系结构,并尝试保存假脱机文件并侦听打印事件,并将假脱机文件路由到虚拟打印机以创建pdf。由于某些打印机驱动程序会发出RAW假脱机文件,因此这部分起作用。 PCL和Postscript可以很好地转换为PDF。
  3. 使用诸如PrintMulti之类的打印处理器,但与第二个一样。
  4. 即使从Windows Printing可以从中创建假脱机文件的某种输入文件,我也试图进行调查,但是我无法获取
  5. 我尝试了打印机池化,但这就像是负载共享之类的东西。

有人可以帮我吗?我也无法在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