2011-07-04 72 views
1

私は、pdfファイル、標準印刷、その他のpdfファイル、その他の標準印刷などを印刷する必要があります。 しかし、私はプリンタに送られたシートは混在しています。同期PDF印刷と標準印刷

私が望む:

PDF 
    PrintPage 
    PDF 
    PrintPage 
    PDF 
    PrintPage 

しかし、私は、(例えば)得た:

PDF 
    PDF 
    PrintPage 
    PrintPage 
    PrintPage 
    PDF 

私は仕事をachiveするには、次のコードを使用しています:

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方法では、次のPDFファイルで、このprintPage関数を呼び出します。

1

ProcessStartInfoは非同期で実行されます。 1つまたは複数のacrobat32 exesを起動してください。それぞれには、印刷機能をロードして実行する時間があります。その間、あなたのPrintDocumentクラスはそれ自身の印刷手順を実行しています...だから、すべてのドキュメントは予期しない順序で表示されています。 Async process start and wait for it to finish

と、この:http://blogs.msdn.com/b/csharpfaq/archive/2004/06/01/146375.aspx

あなたはそれが終了するのを待って、アクロバットを開始する必要があります

はこれを参照してください。次に、PrintDocumentを起動して(それが何であれ)、完了するのを待ちます。リンスとリピート。

PrintDocumentは、イベントハンドラ呼び出しのために非同期であるようですが、それは確かに分かりません。

1

PDFを印刷するために外部プロセスを使用しているので、印刷処理を同期させておくためにそのプロセスが終了するのを待つのに役立ちます。

すなわち、非同期の呼び出し後:

process.Start(); 

順序で実行されているものを維持するためにprocess.WaitForExit();への呼び出しを追加します。

おそらく、PrintDocumentに対して同じ処理を行う必要があります。その場合、OnEndPrintイベントがトリガーされるまでスレッドをブロックするだけでよいはずです。 example

+0

アクロバットリーダーが開いていることがあるため、動作しませんでした。 – Gabriel

+0

acrobatが閉じるのを待つ最大ms秒数を指定することができます。例えば、WaitForExit(5000)は最大5秒間待機します。 –