2011-07-04 185 views
1

我需要打印一個pdf文件,標準打印,其他pdf文件,其他標準打印等。 但是,當我發送到打印機的紙張混合。同步pdf打印和標準打印

我的願望:

PDF 
    PrintPage 
    PDF 
    PrintPage 
    PDF 
    PrintPage 

但是,我得到了(例如):

PDF 
    PDF 
    PrintPage 
    PrintPage 
    PrintPage 
    PDF 

我用下面的代碼才達到任務:

while(...) { 
    ProcessStartInfo starter = new ProcessStartInfo("path to acrobt32.exe", "/t mypdf001.pdf"); 
    starter.CreateNoWindow = true; 
    starter.RedirectStandardOutput = true; 
    starter.UseShellExecute = false; 
    Process process = new Process(); 
    process.StartInfo = starter; 
    process.Start(); 


    PrintDocument pd = new PrintDocument(); 
    pd.DocumentName = "Work"; 
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPageHandler); 
    pd.Print(); 
} 

任何幫助將受到歡迎。謝謝。

回答

2

我不能完全理解這個小例子的問題,但我的猜測是pd.Print()方法是異步的。

您想使打印同步。最好的辦法是將代碼包裝在一個函數中,並從pd_PrintPageHandler調用該函數,我假設在頁面打印時調用該函數。

一個簡單的例子來說明我的意思,

function printPage(pdfFilePath) 
{ 
    ProcessStartInfo starter = new ProcessStartInfo("path to acrobt32.exe", pdfFilePath); 
    starter.CreateNoWindow = true; 
    starter.RedirectStandardOutput = true; 
    starter.UseShellExecute = false; 
    Process process = new Process(); 
    process.StartInfo = starter; 
    process.Start(); 


    PrintDocument pd = new PrintDocument(); 
    pd.DocumentName = "Work"; 
    pd.PrintPage += new PrintPageEventHandler(pd_PrintPageHandler); 
    pd.Print(); 

} 

,並在pd_PrintPageHandler方法,調用此函數printPage用下一個PDF文件。

1

ProcessStartInfo以異步方式運行。因此,您可以踢出一個或多個acrobat32 exes,每個acrobat32 exes都需要時間來加載和運行其打印功能。與此同時,您的PrintDocument類正在運行它自己的一套打印程序......因此,所有文檔都以不可預知的順序顯示出來。

看到這個:Async process start and wait for it to finish

這:http://blogs.msdn.com/b/csharpfaq/archive/2004/06/01/146375.aspx

你需要啓動Acrobat,等待它完成。然後啓動你的PrintDocument(不管是什麼)並等待它完成。沖洗並重復。

由於事件處理程序調用,PrintDocument看起來也是異步的,但很難說清楚。

1

由於您使用外部進程打印PDF,因此可能會幫助等待該進程退出以保持打印操作同步。

即調用異步後:

process.Start(); 

添加調用process.WaitForExit();保持對事物的順序運行。

您可能確實需要爲PrintDocument執行相同的操作。在這種情況下,您應該能夠阻止線程,直到OnEndPrint事件被觸發爲止: example

+0

它沒有用,因爲acrobat閱讀器有時保持打開狀態。 – Gabriel

+0

您可以指定等待acrobat關閉的最大ms數,例如:'WaitForExit(5000)'最多等待5秒鐘。 –