2016-05-30 3 views
2

ハードドライブから複数のPDFファイルを印刷する必要があります。私は、プリンタにファイルを送信する方法のこの美しいsolutionを見つけました。このソリューションの問題点は、複数のファイルを印刷する場合は、各ファイルが完了するまで待つ必要があることです。1つのプロセスコールでプリンタに複数のファイルを送信する方法

コマンドシェルでは、複数のファイル名で同じコマンドを使用することができます。print /D:printerName file1.pdf file2.pdf と1つの呼び出しですべてが出力されます。残念ながら、単純にProcessStartInfoにすべてのファイル名を入れて

string filenames = @"file1.pdf file2.pdf file3.pdf" 
ProcessStartInfo info = new ProcessStartInfo(); 
info.Verb = "print"; 
info.FileName = filenames; 

を仕事でもない、それは私が常にエラーを取得Process

info.Arguments = filename; 

Argumentsとしてファイル名を入れていていません:ファイルを見つけることができません!

1回のプロセスコールで多数のファイルを印刷するにはどうすればよいですか?ここで

は、私は今、それを使用する方法の例です:

public void printWithPrinter(string filename, string printerName) 
{ 

    var procInfo = new ProcessStartInfo();  
    // the file name is a string of multiple filenames separated by space 
    procInfo.FileName = filename; 
    procInfo.Verb = "printto"; 
    procInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    procInfo.CreateNoWindow = true; 

    // select the printer 
    procInfo.Arguments = "\"" + printerName + "\""; 
    // doesn't work 
    //procInfo.Arguments = "\"" + printerName + "\"" + " " + filename; 

    Process p = new Process(); 
    p.StartInfo = procInfo; 

    p.Start(); 

    p.WaitForInputIdle(); 
    //Thread.Sleep(3000;) 
    if (!p.CloseMainWindow()) p.Kill(); 
} 
+0

メソッドは(パラメータとして与えられた)一つのファイルを印刷するようにしてください。このメソッドをN回呼び出します。 'Arguments'はうまくいくはずです。あまりにも多くのファイルを渡しているかもしれませんが、最大値を持っています(32699)(https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.arguments(v = vs.110 ).aspx)Win7 +(以前のバージョンでは2080)の文字。 – Sinatr

+0

私はこれをすでにやっていましたが、プロセスが完了するまで毎回待たなければならず、2〜3秒かかりました。私は200ファイルを印刷する必要があります。それは少なくとも10または20のステップにそれを壊すことはいいです。私は今まで2つのファイルでそれを試してみてください。余りにも過ぎてはいけません。 –

+0

'ProcessStartInfo'は常にファイル名を要求します。私がファイル名を割り当てずに 'Arguments'プロパティー –

答えて

2

後は動作するはずです:

public void PrintFiles(string printerName, params string[] fileNames) 
{ 
    var files = String.Join(" ", fileNames); 
    var command = String.Format("/C print /D:{0} {1}", printerName, files); 
    var process = new Process(); 
    var startInfo = new ProcessStartInfo 
    { 
     WindowStyle = ProcessWindowStyle.Hidden, 
     FileName = "cmd.exe", 
     Arguments = command 
    }; 

    process.StartInfo = startInfo; 
    process.Start(); 
} 

//CALL 
PrintFiles("YourPrinterName", "file1.pdf", "file2.pdf", "file3.pdf"); 
+0

呼び出しを行うにはメソッドヘッドを 'PrintFiles(string printerName、params string [] fileNames)'に変更し、 ';'新しい 'ProcessStartInfo();を削除する必要があります。 ' ファイルが見つからないというエラーは表示されませんが、印刷されません。 –

+1

@MongZhu:引用問題もあるのかどうかを見てください。http://stackoverflow.com/questions/12891383/correct-quoting-for-cmd-exe-for-multiple-arguments – Tewr

+0

@Abbasあなたのソリューションは実際に動作します。ファイルが空でなく、ファイル名にスペースがない場合。私は空のページをテストプリントすることでインクを節約しようとしましたが、プリンタはよりスマートで、空のページはプリントしません。 (私のせい) @ Tewrもそうだ。私はこれを制御下に置こうとしています。 –

0

それは必ずしも簡単な解決策はないのですが、あなたは最初にPDFをマージして、アクロバットに、次に送信することができます。

たとえば、あなたの最初の方法にPdfMerge

例のオーバーロードを使用します。

public void printWithPrinter(string[] fileNames, string printerName) 
    { 
     var fileStreams = fileNames 
      .Select(fileName => (Stream)File.OpenRead(fileName)).ToList(); 
     var bundleFileName = Path.GetTempPath(); 
     try 
     { 

      try 
      { 
       var bundleBytes = new PdfMerge.PdfMerge().MergeFiles(fileStreams); 
       using (var bundleStream = File.OpenWrite(bundleFileName)) 
       { 
        bundleStream.Write(bundleBytes, 0, bundleBytes.Length); 
       } 
      } 
      finally 
      { 
        fileStreams.ForEach(s => s.Dispose()); 
      } 

      printWithPrinter(bundleFileName, printerName); 
     } 
     finally 
     { 
      if (File.Exists(bundleFileName)) 
       File.Delete(bundleFileName); 
     } 
    } 
+0

でしか使用しないとエラーになりますが、これは少しオーバーヘッドです。しかし、動作する可能性があります。しかし、私の主な質問は、プロセス呼び出しに複数のファイル名を渡す方法です。私の質問を言い換えるといいかもしれません... –

関連する問題