2009-06-19 16 views
5

基本的にファイルをアーカイブするアプリケーションがあり、ユーザーにこれらのファイルを印刷する可能性があります。彼らは.txt、.doc、.pdf、.jpgなんて想像もできません。 これらのファイルをさらに処理せずにプリンタに送信する.NETの方法はありますか?.NET:開かれたファイルを印刷する方法

私はすでに、それはまだ私はしたくないファイルを開くStartInfo.Verb =「印刷」でプロセスを作成

Process p = new Process(); 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.CreateNoWindow = true; 
p.StartInfo.FileName = fileName; 
p.StartInfo.Verb = "print" 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden 

p.Start(); 

を試してみました。助けてもらえますか?

ご協力いただければ幸いです。 Tobi

+0

それは使用を暗示するようあなたはおそらく、あなたのタイトル内の単語をランダムにしたくありませんRandomクラスに関連付けられた関数。私はそれを ".NET:さまざまなファイルタイプを開くことなく開く方法"のように言います。またはそのようなものです。 –

答えて

6

私が理解しているところは、印刷するとほとんどのアプリが(たとえ短くても)開くということです。 MS Word文書を右クリックして印刷を打ちます。 Wordを開いて、印刷して閉じることができます。

しかし、あなたは隠されたプロセスを維持するために、終了時に閉じるようにあなたのコードにこれを追加することがあります:

p.Start(); 
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
if (p.HasExited == false) 
{ 
    p.WaitForExit(10000); 
} 

p.EnableRaisingEvents = true; 
p.CloseMainWindow(); 
p.Close(); 
2

Windowsはファイルの処理方法を知っているアプリケーションにファイルを送信しないでファイルを印刷することをどのように管理することをお勧めしますか?

Windowsはpdfが何であるか(またはdoc、さらにはjpg)がわからないため、これを行う方法はないと思います。

私はあなたが持っているものに悩まされているか、印刷したいフォーマットごとにアプリケーションにライブラリを含めるのが怖いです。

+0

良い点、ありがとう。これは本当に隠されている方法はありますか? – Tobias

+0

私は、各フォーマットのために独自の印刷コードを実装するのに役立つライブラリが必要だと思っています... txtとjpgは.NET Framework自体に悪くはありませんが、少なくともライブラリが必要になりますPDFとdoc(x?) – jerryjvl

1

ここでWordを開き、ドキュメントを表示せずにWord文書を印刷したクラスです。私は通常C#でコードを作成していますが、私はずっと前に、VB.NET以外のものでOfficeオートメーションをコーディングすることはまったく愚かであることを学びました(C#4.0の今後の機能の一部はこれを変えるかもしれません)。

これはWordのみですが、Excelドキュメントも同様の方法で処理されます。テキストドキュメントの場合、System.Drawing.Printingのものをかなり簡単に使うことができます。

Imports System.IO 
Imports System.Windows.Forms 
Imports System.Drawing 

Namespace rp.OfficeHelpers 

    Public Enum PrintStatus 
     Success 
     FileNotFound 
     FailedToOpenDocument 
     FailedToPrintDocument 
    End Enum 

    Public Class Word 

     Public Shared Function PrintDocument(DocumentName As String,_ 
           PrinterName As String) As PrintStatus 
      Dim wordApp As Microsoft.Office.Interop.Word.Application = _ 
          new Microsoft.Office.Interop.Word.Application() 
      Dim wordDoc As Microsoft.Office.Interop.Word.Document 
      Dim copies As Object = 1 
      Dim CurrentPrinter As String = wordApp.ActivePrinter 

      If (Not File.Exists(DocumentName)) 
       Return PrintStatus.FileNotFound  
      End If 

      wordApp.Visible = false 

      wordApp.ActivePrinter = PrinterName 

      ' Document name must be provided as an object, not a string. 
      Try 
       wordDoc = wordApp.Documents.Open(CType(DocumentName, Object)) 
      Catch WordError as System.Exception 
       Return PrintStatus.FailedToOpenDocument 
      End Try 

      Try 
       wordDoc.PrintOut(Copies := copies, Background:= false) 
      Catch WordError as System.Exception 
       Return PrintStatus.FailedToPrintDocument 
      End Try 

      wordApp.ActivePrinter = CurrentPrinter 

      wordApp.Quit(SaveChanges := false) 

      Return PrintStatus.Success   
     End Function 

    End Class 

End Namespace 
+0

これはドキュメントを表示していないかもしれませんが、確かにそれを開きます。また、Office APIはデスクトップオートメーション(ライセンス問題はもちろん)のため、マルチスレッド環境では動作しません。それがOPには重要かどうかは分かりませんが、それを記録に残すだけです。 –

+0

それは良い区別です、ジョン。私の「開かれた」という言葉の使用はお粗末でした。 –

+0

それは良い区別ですが、Excelファイルの場合、どのように私はそれのような何かを行うことができます。 – h0cc0i

6

実際には非常に簡単です。

System.Drawing.Printing.PrintDocumentを使用してください。

このリンクの例に従うか、ここでコードを使用します(これは私が毎日使っている印刷オートメーションを実行するものから抜粋したものです)。

たとえば、.jpgのをオフに印刷する(ちなみに、これは任意の編集アプリケーションを開くことができません。それは、バックグラウンドでプリンタにスプール)

public void SetupPrintHandler() 
{ 
    PrintDocument printDoc = new PrintDocument(); 
    printDoc.PrintPage += new PrintPageEventHandler(OnPrintPage); 

    printDoc.Print(); 
} 

private void OnPrintPage(object sender, PrintPageEventArgs args) 
{ 
    using (Image image = Image.FromFile(@"C:\file.jpg")) 
    { 
     Graphics g = args.Graphics; 
     g.DrawImage(image, 0, 0); 
    } 
} 
+0

Jedenfallsfürjpegs。 – Tobias

+5

TobiasのコメントのBabelfish翻訳:「それはどうでもいいようにjpegのために」 –

+0

申し訳ありませんが、誤ってドイツ語に切り替えました... – Tobias

1

を私はその中に他の回答に同意する必要がありますそれを開かずに印刷することはできません。

これを回避できる唯一の方法は、まっすぐなポストスクリプトファイルと、直接添付のポストスクリプト互換プリンタがある場合です。

この場合、.psファイルをLPTポートにダンプするだけで、プリンタが正しく処理します。

0

一部のプリンタは、コマンドラインLPRを使用してプリンタにファイルを送信することをサポートしています。私たちにはこれを行うコピー機があります。これは本当にコンピュータ上のファイルをまったく開きません。ファイルをプリンタに送信すると、プリンタはそれを解釈して印刷します。

LPR -S <Server Name> -P <Printer Name> -o l "C:\Temp\Sample.PDF" 

私たちはPostScriptとPDFファイルを使ってそれを成功させます。他のファイルタイプでも動作するかどうかはわかりません。プリンタのマニュアルを確認してください。

最近のバージョンのWindowsでは、「LPRポートモニタ」を有効にする必要があります。 コントロールパネル]> [プログラムと機能]> [Windowsの機能の有効化または無効> 印刷とドキュメントサービス/ LPRポートモニタ

TechNet LPR Command Line

関連する問題