c# acrobat

c# - acrobat sdk



Imprimiendo un PDF en silencio con Adobe Acrobat (9)

Problema 1

Es posible que pueda trabajar en el registro. En HKEY_CLASSES_ROOT/.pdf/PersistentHandler/(Default) debe encontrar un CLSID que apunte a un valor encontrado en uno de dos lugares. O la carpeta CLSID de la misma clave o (para sistemas de 64 bits) un paso hacia abajo en Wow6432Node/CLSID luego en la clave de ese CLSID.

Dentro de esa clave, puede buscar LocalServer32 y encontrar el valor de cadena predeterminado que apunta a la ruta exe actual.

No estoy al 100% en nada de esto, pero parece plausible (aunque tendrá que verificar en múltiples entornos para confirmar que el hecho localiza el proceso que está buscando).

(Aquí están los documentos sobre las claves de registro involucradas con respecto a los PersistentHandlers )

Problema 2

Probablemente usando la CreateNoWindow de la CreateNoWindow de CreateNoWindow del proceso.

Process p = new Process(); p.StartInfo.FileName = @"C:/Program Files (x86)/Adobe/Reader 10.0/Reader/AcroRd32.exe"; p.StartInfo.Arguments = "/t /"Label.pdf/" /"HP4000/" /"HP LaserJet 4100 Series PCL6/" /"out.pdf/""; p.CreateNoWindow = true; p.Start(); p.WaitForExit();

(Sin embargo, solo una conjetura, pero estoy seguro de que una pequeña prueba probará que funciona / no funciona)

Tengo 2 problemas al intentar imprimir un pdf de forma silenciosa en C # con Adobe Acrobat. Estoy imprimiendo los PDFs usando Process.Start ().

El primer problema es que no puedo iniciar Adobe Acrobat sin especificar la ruta completa al ejecutable. Supongo que no lo agrega a su ruta cuando lo instala. ¿Existe una manera fácil de lanzar la versión más reciente de Acrobat en una máquina sin especificar nombres de ruta completos? Me preocupa que el cliente vaya a hacer una actualización y a romper mi código que inicia esto. También me preocupa que ellos instalen esto en máquinas con diferentes versiones de Windows (las rutas de instalación son diferentes en un entorno de 64 bits frente a 32 bits).

Mi segundo problema es el hecho de que cada vez que inicio Acrobat e imprimo, todavía queda abierta la ventana de Acrobat. Pensé que los parámetros de la línea de comando que estaba usando suprimirían todo esto pero aparentemente no.

Estoy intentando lanzar Adobe Acrobat desde la línea de comandos con la siguiente sintaxis:

C: / Archivos de programa (x86) / Adobe / Reader 10.0 / Reader> AcroRd32.exe / t "Label.pdf" "HP4000" "HP LaserJet 4100 Series PCL6" "out.pdf"

Se imprime bien pero todavía deja la ventana de acróbata arriba ¿Hay alguna otra solución además de salir y matar el proceso programáticamente?


He probado Adobe Reader y Foxit sin suerte. A las versiones actuales de ambos les gusta abrir ventanas y dejar los procesos en ejecución. Terminé usando Sumatra PDF, que es muy discreto. Aquí está el código que utilizo. No queda rastro de ninguna ventana y el proceso sale bien cuando se termina de imprimir.

public static void SumatraPrint(string pdfFile, string printer) { var exePath = Registry.LocalMachine.OpenSubKey( @"SOFTWARE/Microsoft/Windows/CurrentVersion" + @"/App Paths/SumatraPDF.exe").GetValue("").ToString(); var args = $"-print-to /"{printer}/" {pdfFile}"; var process = Process.Start(exePath, args); process.WaitForExit(); }


La respuesta de Nick me pareció buena, así que la traduje a c #. ¡Funciona!

using System.Diagnostics; namespace Whatever { static class pdfPrint { public static void pdfTest(string pdfFileName) { string processFilename = Microsoft.Win32.Registry.LocalMachine .OpenSubKey("Software") .OpenSubKey("Microsoft") .OpenSubKey("Windows") .OpenSubKey("CurrentVersion") .OpenSubKey("App Paths") .OpenSubKey("AcroRd32.exe") .GetValue(String.Empty).ToString(); ProcessStartInfo info = new ProcessStartInfo(); info.Verb = "print"; info.FileName = processFilename; info.Arguments = String.Format("/p /h {0}", pdfFileName); info.CreateNoWindow = true; info.WindowStyle = ProcessWindowStyle.Hidden; //(It won''t be hidden anyway... thanks Adobe!) info.UseShellExecute = false; Process p = Process.Start(info); p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; int counter = 0; while (!p.HasExited) { System.Threading.Thread.Sleep(1000); counter += 1; if (counter == 5) break; } if (!p.HasExited) { p.CloseMainWindow(); p.Kill(); } } }

}


Lo siguiente se prueba en Acrobat Reader 8.1.3 y Acrobat Pro 11.0.06, y se confirma la siguiente funcionalidad:

  1. Localiza el ejecutable predeterminado de Acrobat en el sistema
  2. Envía el archivo a la impresora local.
  3. Cierra Acrobat, independientemente de la versión.

string applicationPath; var printApplicationRegistryPaths = new[] { @"SOFTWARE/Microsoft/Windows/CurrentVersion/App Paths/Acrobat.exe", @"SOFTWARE/Microsoft/Windows/CurrentVersion/App Paths/AcroRD32.exe" }; foreach (var printApplicationRegistryPath in printApplicationRegistryPaths) { using (var regKeyAppRoot = Registry.LocalMachine.OpenSubKey(printApplicationRegistryPath)) { if (regKeyAppRoot == null) { continue; } applicationPath = (string)regKeyAppRoot.GetValue(null); if (!string.IsNullOrEmpty(applicationPath)) { return applicationPath; } } } // Print to Acrobat const string flagNoSplashScreen = "/s"; const string flagOpenMinimized = "/h"; var flagPrintFileToPrinter = string.Format("/t /"{0}/" /"{1}/"", printFileName, printerName); var args = string.Format("{0} {1} {2}", flagNoSplashScreen, flagOpenMinimized, flagPrintFileToPrinter); var startInfo = new ProcessStartInfo { FileName = printApplicationPath, Arguments = args, CreateNoWindow = true, ErrorDialog = false, UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden }; var process = Process.Start(startInfo); // Close Acrobat regardless of version if (process != null) { process.WaitForInputIdle(); process.CloseMainWindow(); }


Si usa Acrobat Reader 4.0, puede hacer cosas como esta: "C: / Archivos de programa / Adobe / Acrobat 4.0 / Reader / Acrord32.exe" / t / s "U: / PDF_MS / SM003067K08.pdf" Planning_H2 BUT si el PDF archivo se ha creado en una versión más reciente de Acrobat y se abre una ventana invisible


Tengo otra solución ... su combinación de otros fragmentos de código de . Cuando llamo a CloseMainWindow y luego a Kill .. adobe se cierra

Dim info As New ProcessStartInfo() info.Verb = "print" info.FileName = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software").OpenSubKey("Microsoft").OpenSubKey("Windows").OpenSubKey("CurrentVersion").OpenSubKey("App Paths").OpenSubKey("AcroRd32.exe").GetValue(String.Empty).ToString() info.Arguments = String.Format("/p /h {0}", "c:/log/test.pdf") info.CreateNoWindow = True info.WindowStyle = ProcessWindowStyle.Hidden info.UseShellExecute = False Dim p As Process = Process.Start(info) p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden Dim counter As Integer = 0 Do Until p.HasExited System.Threading.Thread.Sleep(1000) counter += 1 If counter = 5 Then Exit Do End If Loop If p.HasExited = False Then p.CloseMainWindow() p.Kill() End If


Terminé trabajando en Adobe Acrobat aquí y fui con FoxIt Reader ( lector de pdf gratuito) para hacer mi impresión en pdf. Este es el código que estoy usando para imprimir a través de FoxIt en C #:

Process pdfProcess = new Process(); pdfProcess.StartInfo.FileName = @"C:/Program Files (x86)/Foxit Software/Foxit Reader/Foxit Reader.exe"; pdfProcess.StartInfo.Arguments = string.Format(@"-p {0}", fileNameToSave); pdfProcess.Start();

El código anterior se imprime en la impresora predeterminada, pero hay parámetros de línea de comandos que puede usar para especificar el archivo y la impresora. Puedes usar la siguiente sintaxis:

Foxit Reader.exe -t "nombre de archivo pdf" "nombre de impresora"

Actualizar:

Aparentemente, las versiones anteriores de Acrobat tampoco tienen el problema descrito anteriormente. Si usa una versión mucho más antigua (4.x o algo similar) no presenta este problema.

Algunas impresoras también admiten la impresión en PDF nativa, por lo que es posible enviar los datos en pdf sin formato a la impresora y podría imprimirlos. Consulte https://support.microsoft.com/en-us/kb/322091 para enviar datos sin procesar a la impresora.

Actualización 2

En versiones posteriores de nuestro software terminamos usando un producto pagado:

http://www.pdfprinting.net/


Ya ha intentado algo diferente a Acrobat Reader, por lo que mi consejo es olvidarse de las aplicaciones GUI y usar una herramienta de línea de comandos de terceros como RawFilePrinter.exe

private static void ExecuteRawFilePrinter() { Process process = new Process(); process.StartInfo.FileName = "c://Program Files (x86)//RawFilePrinter//RawFilePrinter.exe"; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.Arguments = string.Format("-p /"c://Users//Me//Desktop//mypdffile.pdf/" /"Canon Printer/""); process.Start(); process.WaitForExit(); if (process.ExitCode == 0) { //ok } else { //error } }

Última versión para descargar: http://effisoft.pl/rawfileprinter