2009-06-19 90 views
5

我們有一個基本上歸檔文件的應用程序,我們給用戶打印這些文件的可能性。它們可以是.txt,.doc,.pdf,.jpg沒有什麼奇特的。 有沒有一種.NET方式將這些文件發送到打印機而不進一步處理它們,即打開它們?.NET:如何打印文件w/o打開它們

我已經嘗試過創建一個進程與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:如何在不打開它們的情況下打開各種文件類型」。或類似的東西。 – 2009-06-19 14:51:58

回答

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 2009-06-19 14:10:30

+0

我認爲您需要一些庫來幫助您實現各種格式的打印代碼...... txt和jpg對.NET Framework本身不會太壞,但至少您需要庫對於PDF和文檔(x?) – jerryjvl 2009-06-19 14:11:47

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是否重要,只是爲了將其記錄在案。 – 2009-06-19 18:21:21

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

我有在其他的答案同意如果不打開它,您將無法打印它。

我認爲你可能能解決這個問題的唯一方法是如果你有一個直接的postscript文件和一個直接連接的postscript兼容打印機。

在這種情況下,您可以將.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