使用 Windows Spooler API 以编程方式打印 PDF 文件
Posted
技术标签:
【中文标题】使用 Windows Spooler API 以编程方式打印 PDF 文件【英文标题】:Programatically print PDF file using Windows Spooler API 【发布时间】:2018-01-25 09:50:09 【问题描述】:是否可以使用 windows Spooler API 打印 PDF 文件。我尝试了下面的代码,但它不起作用......
int print_handle = 0;
OpenPrinter(pPrinterName, &print_handle, NULL);
if (print_handle == 0)
return 0;
docinfo1.pDocName = (LPTSTR)("My PDF");
docinfo1.pOutputFile = NULL;
docinfo1.pDatatype = (LPTSTR)("RAW");
temp = StartDocPrinter(print_handle, 1, &docinfo1);
temp = StartPagePrinter(print_handle);
temp = WritePrinter(print_handle, (LPBYTE)filebuff, filelen, &bytes_written);
EndPagePrinter(print_handle);
EndDocPrinter(print_handle);
WritePrinter 函数返回 SUCCESS 并且没有打印任何内容。使用此 API 打印 TXT 和 PRN 文件正在工作。
【问题讨论】:
由于 Nick Westgate 在他的回答中解释的原因,这行不通。 【参考方案1】:Windows 没有打印 PDF 文件的内置功能。
您必须使用外部应用程序或库,例如Ghostscript.
我应该注意,因为您的代码使用“RAW”数据类型(如official sample),它会将写入的作业数据直接发送到打印机。 ASCII 数据之所以有效,是因为几乎所有打印机都可以接收和打印 ASCII。如果打印机将 PDF 理解为 PDL(页面描述语言 - 其他示例是 PCL 或 PostScript),它将打印您的 PDF。但是对于所有其他打印机,PDF 需要转换为打印机可以理解的 PDL。
【讨论】:
在首次使用时定义 PDL 会改善您的答案。 我至少可以使用这个 API 打印 DOC 文件或 IMG 文件吗?或者为此,我还需要使用一些外部库对其进行转换... 您使用的 Windows 打印 API 非常低级,对 PDF 和 DOC 等应用程序级文件一无所知。请阅读此overview of Windows printing。只有 MS Word(以及一些其他应用程序和库)知道如何打印 DOC 文件。可以打印图像,但需要更高级别的 API。即使这样,您也可能需要一个库来存储 BMP 以外的任何内容。谷歌搜索“windows print image C++”,或者尽可能使用 .NET,因为那样会更容易。 您可以使用 Ghostscript 将 PDF 转换为图像。然后你可以打印这些图像以上是关于使用 Windows Spooler API 以编程方式打印 PDF 文件的主要内容,如果未能解决你的问题,请参考以下文章
Windows Print Spooler新漏洞尚无补丁可用,360产品率先免疫
print spooler服务经常被自动关闭,导致打印不起来