printer - Imprimir PDF existente(u otros archivos) en C#
printdocument c# ticket (6)
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?
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 usar "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!
Además, 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.
Aunque esto es VB, puedes 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
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 necesidad de otras aplicaciones. 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.
Estoy haciendo lo mismo para mi proyecto y funcionó para mí
A ver si te 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 puedes jugar con diferentes opciones de windows
PRINT para obtener la salida deseada ... Enlace de referencia
Necesitará Acrobat u otra aplicación que pueda imprimir el PDF. Desde allí, P / Invocar a ShellExecute para imprimir el documento.
También puede usar PDFsharp: es una biblioteca de código abierto para crear y manipular archivos PDF. http://www.pdfsharp.net/
Muestre 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 exigir que GSView esté instalado 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 uso para imprimir algunos PDF que obtengo 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 puede ver, toma los datos PDF como una matriz de bytes, los escribe en un archivo temporal y ejecuta gsprint.exe para imprimir el archivo de forma silenciosa en la impresora nombrada ("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 provisto por Windows Forms.
¡Buena suerte!