2017-05-22 43 views
0

下面的代码段发送的PostScript内容(保存在pBuf缓冲液中)到CutePDF打印机PDF:PDF打印机生成仅当输出文件名没有设置

if (OpenPrinter(printerName, &hPrinter, NULL)) 
{ 
    DOC_INFO_1 di1; 
    di1.pDatatype = L"RAW"; 
    di1.pDocName = L"Raw print document"; 
    di1.pOutputFile = NULL; 
    StartDocPrinter(hPrinter, 1, (LPBYTE)&di1); 
    StartPagePrinter(hPrinter); 
    DWORD dwWritten = 0; 
    WritePrinter(hPrinter, pBuf, dwBufSize, &dwWritten); 
    EndPagePrinter(hPrinter); 
    EndDocPrinter(hPrinter); 
} 

该代码的执行过程中,会出现一个对话框在那里我指定输出文件的名称(例如D:/out.pdf),然后生成pdf文件。到现在为止还挺好。这些问题开始的时候我试图通过改变片段的4号线,以避免文件名识别步骤:

di1.pOutputFile = L"D:/out.pdf"; 

这样的代码并不显示其执行(如预期)中的对话框,但结果D:/out.pdf ISN是pdf文件,它是发送到打印机的PostScript文件的副本(pBuf缓冲区的内容的副本)。 PDF Writer的行为方式相同。为什么PDF打印机以这种方式行事,我如何才能实现所需的行为(生成PDF文件而无需在UI中指定其名称)?

回答

1

Windows打印系统的行为方式是这样的,因为,要直言不讳,这就是它应该如何表现。如果您在该位置指定文件名,则打印系统会将输出发送到该文件。如果你没有指定文件名,那么它将继续进行正常处理。

通常情况下,您会将打印机驱动程序输出发送到端口,而对于PDF打印机,自定义端口监视器将拾取输出(本例中为PostScript)并进一步处理。对于PDF打印机,他们将PostScript发送到将PostScript转换为PDF的过程(几乎总是使用Ghostscript,尽管Adobe打印到PDF工具的工作方式相同)。

如果您想要改变PDF过程的输出(即将其写入不同的文件),那么您需要改变端口监视器工作的方式,而不是打印子系统的工作方式,这就是您的代码目前正在执行。通过设置一个文件名,你只需简单地将进程短路,不要调用端口监视器,这就是为什么“保存文件”对话框没有出现,为什么输出是PostScript。

可能有一种方法可以指定为您正在使用的特定PDF打印机记录的输出文件。如果不是,那么对于开源产品(如果内置GS,则应该使用GPL许可证),则可以请求产品的源代码副本并进行修改以适合自己。

或者,您可以选择Ghostscript和RedMon(开放源代码端口监视器)的副本,并创建自己的工具来完成相同的工作。