2017-05-22 47 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(開放源代碼端口監視器)的副本,並創建自己的工具來完成相同的工作。