2009-06-19 29 views
5

Tenemos una aplicación que básicamente archiva archivos y le damos al usuario la posibilidad de imprimir estos archivos. Pueden ser .txt, .doc, .pdf, .jpg nada sofisticado. ¿Existe una forma .NET de enviar estos archivos a la impresora sin manejarlos más, es decir, abrirlos?.NET: Cómo imprimir archivos sin abrirlos

ya he intentado crear un proceso con el StartInfo.Verb = "imprimir"

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

Todavía se abre el archivo, que no quiero. ¿Alguien puede ayudar?

Cualquier ayuda sería apreciada. Tobi

+0

es probable que no quiere que la palabra al azar en su título, ya que implicaría el uso de funciones asociadas con la clase Aleatoria. Lo volvería a formular como ".NET: cómo abrir varios tipos de archivos sin abrirlos". o algo así. –

Respuesta

6

Según tengo entendido, la mayoría de las aplicaciones se abrirán (aunque sea brevemente) cuando imprima. Intenta hacer clic derecho en un documento de MS Word y presionar Imprimir. Verá Word abierto, imprimido y cerrado.

Sin embargo, es posible que desee agregar esto a su código para mantener el proceso oculto y cerrar cuando haya terminado:

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

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

¿Cómo sugiere que Windows logre imprimir un archivo sin enviarlo a una aplicación que sepa cómo manejarlo? No creo que haya una forma de hacerlo, simplemente porque Windows no sabe qué es pdf (o doc, o incluso jpg

Me temo que está atrapado ya sea con lo que tiene, o incluyendo una biblioteca en su aplicación para cada formato que desea imprimir.

+0

Buen punto, gracias. ¿Hay alguna manera de hacer esto realmente oculto? – Tobias

+0

Creo que necesitará algunas bibliotecas para ayudarlo e implementar su propio código de impresión para cada formato ... txt y jpg no serán tan malos con .NET Framework, pero al menos necesitará bibliotecas para PDF y doc (x?) – jerryjvl

1

Aquí es una clase que imprime un documento de Word sin necesidad de abrir la Palabra y mostrando el documento. Mientras normalmente código en C#, hace mucho tiempo aprendí que codificar cualquier automatización de Office con cualquier cosa que no sea VB.NET es francamente tonto (algunas de las características próximas en C# 4.0 pueden cambiar esto).

Esto es solo para Word, pero los documentos de Excel se harían de manera similar. Para los documentos de texto, puede utilizar System.Drawing.Printing cosas con bastante facilidad.

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

Esto no puede mostrar el documento, pero ciertamente lo abre. Tampoco funcionará en un entorno multiproceso, ya que las API de Office están destinadas a la automatización de escritorio (y mucho menos a problemas de licencia). No sé si eso le importa al OP, pero solo para que quede registrado. –

+0

Esa es una buena distinción, John. Mi uso de la palabra "abrir" fue descuidado. –

+0

Esa es una buena distinción pero, en el caso del archivo de Excel, cómo puedo hacer algo igual. – h0cc0i

6

De hecho, es muy, muy fácil.

Use System.Drawing.Printing.PrintDocument.

Siga el ejemplo en ese enlace, o simplemente use el código aquí (que extraje de algo haciendo la automatización de impresión que estoy usando todos los días).

por ejemplo, para imprimir una .jpg (Por cierto, esto no va a abrir cualquier aplicación de edición, sino que lo almacena en la impresora en el fondo)

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

Traducción propia del comentario de Tobias: "Eso se ve bien. De todos modos para jpegs" –

+0

lo siento, accidentalmente cambiado a alemán ... – Tobias

1

Estoy de acuerdo con otras respuestas en que se no puedes imprimirlo sin abrirlo.

La única forma en que creo que podrá evitar esto es si tiene un archivo postscript y una impresora compatible con postscript directamente conectada.

En ese caso, podría simplemente volcar el archivo .ps en el puerto LPT y la impresora lo procesaría correctamente.

0

Algunas impresoras admiten el envío de un archivo a la impresora mediante la línea de comando LPR. Tenemos una copiadora que hace esto. Esto realmente no abre el archivo en la computadora en absoluto. Envía el archivo a la impresora y la impresora lo interpreta e imprime.

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

Lo hacemos con archivos PostScript y PDF con gran éxito. No sé si funciona para otros tipos de archivos; verifique la documentación de la impresora.

Para las versiones recientes de Windows, debe habilitar el "Monitor de puerto LPR". Panel de control> Programas y características> Activar las características de Windows o desactivar> Servicios de impresión y documentos/Monitor de puerto LPR

TechNet LPR Command Line

Cuestiones relacionadas