1

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();
}

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

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();

}

メソッド内で、次の PDF ファイルでpd_PrintPageHandlerこの関数を呼び出します。printPage

于 2011-07-04T19:17:12.620 に答える
1

ProcessStartInfo は非同期で実行されます。したがって、1 つ以上の acrobat32 exe を開始すると、それぞれが印刷機能をロードして実行するのに時間がかかります。その間、あなたの PrintDocument クラスは独自の一連の印刷手順を実行しています...そのため、すべてのドキュメントが予測できない順序で表示されています。

これを参照してください:非同期プロセスの開始と終了を待ちます

そしてこれ:http://blogs.msdn.com/b/csharpfaq/archive/2004/06/01/146375.aspx

acrobat を開始する必要があります。終了するまで待ちます。次に、PrintDocument (それが何であれ) を開始し、終了するまで待ちます。すすいで繰り返します。

PrintDocument も非同期のように見えます...イベント ハンドラーの呼び出しのためですが、それを確実に判断するのは困難です。

于 2011-07-04T19:25:42.203 に答える
1

外部プロセスを使用して PDF を印刷しているため、印刷操作の同期を維持するために、そのプロセスが終了するのを待つことが役立つ場合があります。

つまり、非同期への呼び出しの後:

process.Start();

の呼び出しを追加しprocess.WaitForExit();て、物事を順番に実行し続けます。

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

于 2011-07-04T19:26:43.263 に答える