2008-11-07 135 views
23

Desde una aplicación que estoy construyendo necesito imprimir archivos PDF existentes (creados por otra aplicación). ¿Cómo puedo hacer esto en C# y proporcionar un mecanismo para que el usuario pueda seleccionar una impresora diferente u otras propiedades.Imprimir PDF existente (u otros archivos) en C#

Miré el PrintDialog pero no estoy seguro de qué archivo está intentando imprimir, si lo hay, b/c el resultado siempre es una página en blanco. Tal vez me estoy perdiendo algo allí.

¿Debo utilizar "iTextSharp" (como se sugiere en otro lugar)? Eso me parece extraño ya que puedo "enviar el archivo a la impresora". Simplemente no tengo ningún diálogo agradable antes de configurar la impresora, etc. y realmente no quiero escribir un diálogo de impresión desde cero. pero parece que muchos ejemplos que encontré buscando lo hicieron exactamente.

¡Cualquier consejo, ejemplo o código de muestra sería genial!

También si PDF es el problema, los archivos podrían ser creados por la otra aplicación en un formato diff como bitmap o png si eso hace las cosas más fáciles.

+0

¿Hay alguien aquí que sabe cómo imprimir archivos al azar, no sólo los archivos PDF? Tobi – Tobias

+3

@Tobias: los archivos aleatorios están asociados con aplicaciones aleatorias. Incluso .doc se puede asociar con WordPad, Word u OpenOffice. Cada aplicación tendrá su propia representación. Por lo tanto, el único enfoque útil es algo que aprovecha las asociaciones de archivos de Windows para los tipos de archivos involucrados. –

+0

Pregunta relacionada: http://stackoverflow.com/questions/11579624/how-to-print-a-pdf-with-c-sharp – yms

Respuesta

1

Necesitará Acrobat u otra aplicación que pueda imprimir el PDF. A partir de ahí, usted P/Invoke a ShellExecute para imprimir el documento.

+1

¿Puede pasar la selección de impresora y otros parámetros con esa llamada? –

23

Muestra un pequeño cuadro de diálogo con un cuadro combinado que tiene sus elementos establecidos en la colección de cadenas devuelta por PrinterSettings.InstalledPrinters.

Si puede solicitar que se instale GSView en la máquina, puede imprimir el PDF en silencio. Es un poco lento y rotundo, pero al menos no es necesario que aparezca Acrobat.

Aquí hay un código que utilizo para imprimir algunos archivos PDF que regrese de un servicio web de UPS:

private void PrintFormPdfData(byte[] formPdfData) 
    { 
     string tempFile; 

     tempFile = Path.GetTempFileName(); 

     using (FileStream fs = new FileStream(tempFile, FileMode.Create)) 
     { 
      fs.Write(formPdfData, 0, formPdfData.Length); 
      fs.Flush(); 
     } 

     try 
     { 
      string gsArguments; 
      string gsLocation; 
      ProcessStartInfo gsProcessInfo; 
      Process gsProcess; 

      gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile); 
      gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe"; 

      gsProcessInfo = new ProcessStartInfo(); 
      gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden; 
      gsProcessInfo.FileName = gsLocation; 
      gsProcessInfo.Arguments = gsArguments; 

      gsProcess = Process.Start(gsProcessInfo); 
      gsProcess.WaitForExit(); 
     } 
     finally 
     { 
      File.Delete(tempFile); 
     } 
    } 

Como se puede ver, se necesitan los datos de PDF como una matriz de bytes, lo escribe en una archivo temporal e inicia gsprint.exe para imprimir el archivo de forma silenciosa en la impresora indicada ("HP Laserjet 5M"). Puede reemplazar el nombre de la impresora con lo que elija el usuario en su cuadro de diálogo.

Imprimir un PNG o GIF sería mucho más fácil: simplemente extienda la clase PrintDocument y use el diálogo de impresión normal proporcionado por Windows Forms.

¡Buena suerte!

+0

Esto me ayudó mucho. Tengo una aplicación web de intranet que requiere imprimir documentos en una impresora de red sin supervisión. Todos los demás métodos han fallado, ¡pero este funciona! – Aaron

2

Aunque esto es VB, puede traducirlo fácilmente. Por cierto, Adobe no aparece, solo imprime el pdf y luego desaparece.

''' <summary> 
''' Start Adobe Process to print document 
''' </summary> 
''' <param name="p"></param> 
''' <remarks></remarks> 
Private Function printDoc(ByVal p As PrintObj) As PrintObj 
    Dim myProcess As New Process() 
    Dim myProcessStartInfo As New ProcessStartInfo(adobePath) 
    Dim errMsg As String = String.Empty 
    Dim outFile As String = String.Empty 
    myProcessStartInfo.UseShellExecute = False 
    myProcessStartInfo.RedirectStandardOutput = True 
    myProcessStartInfo.RedirectStandardError = True 

    Try 

     If canIprintFile(p.sourceFolder & p.sourceFileName) Then 
      isAdobeRunning(p)'Make sure Adobe is not running; wait till it's done 
      Try 
       myProcessStartInfo.Arguments = " /t " & """" & p.sourceFolder & p.sourceFileName & """" & " " & """" & p.destination & """" 
       myProcess.StartInfo = myProcessStartInfo 
       myProcess.Start() 
       myProcess.CloseMainWindow() 
       isAdobeRunning(p) 
       myProcess.Dispose() 
      Catch ex As Exception 
      End Try 
      p.result = "OK" 
     Else 
      p.result = "The file that the Document Printer is tryng to print is missing." 
      sendMailNotification("The file that the Document Printer is tryng to print" & vbCrLf & _ 
      "is missing. The file in question is: " & vbCrLf & _ 
      p.sourceFolder & p.sourceFileName, p) 
     End If 
    Catch ex As Exception 
     p.result = ex.Message 
     sendMailNotification(ex.Message, p) 
    Finally 
     myProcess.Dispose() 
    End Try 
    Return p 
End Function 
+0

Sumatra PDF también tiene args de línea de comando de impresión silenciosa si gsview no es lo tuyo. http://blog.kowalczyk.info/software/sumatrapdf/manual.html – jimueller

+0

@jimueller Sumatra PDF funciona muy bien. Muchas gracias :) – embarus

+0

Tal vez Adobe imprimió Silenty al mismo tiempo, pero ya no existe. ¡Downvoting debido a esto! – HK1

1

También puede usar PDFsharp - es una biblioteca de código abierto para crear y manipular archivos PDF. http://www.pdfsharp.net/

+6

Tenga en cuenta que PDFSharp usa Adobe Reader para imprimir. La impresión silenciosa con Adobe Reader no está respaldada por Adobe y es un poco hacky. Los autores incluso lo notan en la fuente. http://pdfsharp.codeplex.com/SourceControl/changeset/view/51421#707803 – jimueller

0

que estoy haciendo lo mismo para mi proyecto y ha funcionado para mí

ver si puede ayudar ...

Process p = new Process(); 
p.EnableRaisingEvents = true; //Important line of code 
p.StartInfo = new ProcessStartInfo() 
{ 
    CreateNoWindow = true, 
    Verb = "print", 
    FileName = file, 
    Arguments = "/d:"+printDialog1.PrinterSettings.PrinterName 
}; 
try 
{ 
    p.Start(); 
} 
catch 
{ 
    /* your fallback code */ 
} 

También puede jugar con diferentes opciones de ventanas

Comando IMPRIMIR para obtener la salida deseada ...Reference link

2

Después de mucha investigación y búsqueda en Google sobre esta tarea, Microsoft ha lanzado una gran KB para imprimir un pdf sin ninguna otra aplicación necesaria. No es necesario llamar a Adobe o a Ghostprint. Puede imprimir sin guardar un archivo en el disco hace que la vida sea muy fácil.

http://support2.microsoft.com/?kbid=322091

+0

Funciona en * algunas * impresoras. La impresora necesita poder procesar archivos PDF. Si no es así, el archivo PDF se imprime como si fuera un archivo de texto. –

Cuestiones relacionadas