【问题标题】:How to save as PDF while printing a document on actual printer如何在实际打印机上打印文档时另存为 PDF
【发布时间】:2021-02-14 03:53:22
【问题描述】:
我正在尝试找到一个通用解决方案,说明如何在 Windows 7/10 操作系统上的实际打印机上打印时将文档保存为 PDF。
场景:无论我要打印的是图像还是文件,还是来自第三方应用程序(如 POS 或丝网打印)(如用户按下第三方应用程序上的 pint 按钮,或者如果第三方应用程序支持此热键,则按 CTRL+P),我需要将文档保存为 PDF 格式,该文档正在到达正在打印硬拷贝的实际打印机。我想概括支持各种打印机,无论是点阵打印机还是激光打印机或热敏打印机……
我尝试过的解决方案:
- 虚拟打印机将打印 pdf 然后将 pdf 路由到实际打印机。但是很少有打印机不支持 PDF,例如热敏打印机不支持 PDF,此外,我需要注意纸张设置和页面设置。
我尝试过 Win2PDF / ClawPDF 等虚拟打印机
- 我研究了 Windows 打印体系结构,并尝试保存假脱机文件并监听打印事件并将假脱机文件路由到虚拟打印机以创建 pdf。这部分起作用,因为某些打印机驱动程序会发出 RAW Spool 文件。
PCL 和 Postscript 可以很好地转换为 PDF。
- 使用 PrintMulti 等打印处理器,但问题与第二个相同。
- 我已尝试调查,即使我可以获取某种输入文件,Windows 打印从中创建 Spool 文件,但我无法得到。
- 我尝试了打印机池,但这类似于负载共享。
谁能帮我解决这个问题。我也无法通过谷歌找到任何解决方案,所以在这里发布。实现它看起来很正常,但即使在两周后我也找不到任何解决方案。这是不是很难实现泛化解决方案?
【问题讨论】:
标签:
windows
pdf
printing
print-spooler-api
virtual-printer
【解决方案1】:
考虑使用类似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。