2009-06-19 6 views
5

Mamy aplikację, która zasadniczo archiwizuje pliki, a my dajemy użytkownikowi możliwość wydrukowania tych plików. Mogą być .txt, .doc, .pdf, .jpg nic nadzwyczajnego. Czy istnieje sposób .NET wysyłania tych plików do drukarki bez dalszej obróbki, np. Otwierania ich?.NET: Jak drukować pliki bez ich otwierania

Próbowałem już proces tworzenia z StartInfo.Verb = „print”

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

Nadal otwiera plik, którego nie chcę. Czy ktoś może pomóc?

Każda pomoc zostanie doceniona. Tobi

+0

Prawdopodobnie nie chcesz słowo losową w tytule gdyż oznaczałoby konieczność korzystania funkcje związane z klasą losową. Zmodyfikuję go w następujący sposób: ".NET: Jak otwierać różne typy plików bez ich otwierania." czy coś takiego. –

Odpowiedz

6

Rozumiem, że większość aplikacji zostanie otwarta (nawet krótko) podczas drukowania. Spróbuj kliknąć prawym przyciskiem myszy dokument MS Word i naciśnij przycisk Drukuj. Zobaczysz komunikat Otwórz, wydrukuj i zamknij.

Jednak warto dodać do tego kodu, aby utrzymać proces ukryty i zamknąć po zakończeniu:

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

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

Jak sugerujesz systemowi Windows wydrukowanie pliku bez wysyłania go do aplikacji, która wie, jak sobie z nim radzić?

Nie sądzę, że istnieje sposób, aby to zrobić, po prostu dlatego, że system Windows nie wie, co to jest pdf (lub doc, a nawet jpg).

Obawiam się, że utknąłeś z tym, co masz, lub dołączasz bibliotekę do swojej aplikacji dla każdego formatu, który chcesz wydrukować.

+0

Dobra uwaga, dzięki. Czy istnieje sposób, aby to naprawdę ukryć? – Tobias

+0

Myślę, że będziesz potrzebował kilku bibliotek, które pomogą ci w implementacji własnego kodu drukowania dla każdego formatu ... txt i jpg nie będą zbyt złe dla samego .NET Framework, ale przynajmniej będziesz potrzebował bibliotek dla plików PDF i dokumentów (x?) – jerryjvl

1

Oto klasa, która drukuje dokument programu Word bez otwierania programu Word i pokazując dokument. Chociaż zwykle koduję w C#, dawno temu nauczyłem się, że kodowanie dowolnej automatyki Office za pomocą czegokolwiek innego niż VB.NET jest wręcz niemądre (niektóre z nadchodzących funkcji w C# 4.0 mogą to zmienić).

Jest to tylko dla programu Word, ale dokumenty Excela byłyby wykonane w podobny sposób. W przypadku dokumentów tekstowych można dość łatwo użyć elementów 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

To nie może _show_ dokumentu, ale z pewnością go otwiera. Nie będzie także działać w środowisku wielowątkowym, ponieważ interfejsy API Office są przeznaczone do automatyzacji komputerów (nie mówiąc już o problemach z licencjonowaniem). Nie wiem, czy ma to znaczenie dla PO, ale tylko po to, aby uzyskać to w rejestrze. –

+0

To dobre wyróżnienie, John. Moje użycie słowa "otwarty" było zaniedbane. –

+0

To dobre wyróżnienie, ale w przypadku pliku Excela mogę zrobić coś takiego. – h0cc0i

6

To naprawdę bardzo, bardzo łatwe.

Użyj System.Drawing.Printing.PrintDocument.

Podążaj za przykładem w tym linku, lub po prostu użyj tego kodu tutaj (który wyciągnąłem z czegoś, co robię zautomatyzowaną automatykę używam każdego dnia).

na przykład, aby wydrukować w formacie .jpg (BTW, to nie będzie otwierać dowolną aplikację do edycji, to szpule do drukarki w tle)

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

Das sieht gut aus. Jedenfalls für jpegs. – Tobias

+5

Tłumaczenie Babelfish komentarza Tobiasza: "To wygląda dobrze, w każdym razie dla jpegów" –

+0

przepraszam, przypadkowo przełączyłem na niemiecki ... – Tobias

1

Muszę zgodzić się z innymi, że w odpowiedzi nie można go wydrukować bez jego otwarcia.

Jedynym sposobem, jak sądzę, że możesz sobie z tym poradzić, jest sytuacja, gdy masz prosty plik postscriptowy i bezpośrednio dołączoną drukarkę zgodną z Postscriptami.

W takim przypadku wystarczy, że zrzucisz plik .ps do portu LPT, a drukarka przetworzy go poprawnie.

0

Niektóre drukarki obsługują wysyłanie plików do drukarki za pomocą wiersza polecenia LPR. Mamy kopiarkę, która to robi. To naprawdę nie otwiera pliku na komputerze. Wysyła plik do drukarki, a drukarka je interpretuje i drukuje.

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

Robimy to z plikami PostScript i PDF z dużym sukcesem. Nie wiem, czy działa dla innych typów plików; sprawdź dokumentację drukarki.

W przypadku najnowszych wersji systemu Windows należy włączyć "Monitor portu LPR". Panel sterowania> Programy i funkcje> Włącz funkcje systemu Windows lub wyłączyć> Print Document Services i/LPR Port monitora

TechNet LPR Command Line