Stampa PDF con GhostScript

Ho bisogno del vostro supporto per il seguente problema, dal momento che mi sta trascinando per un po ‘. Abbiamo una piccola utility c# , che stampa dato PDF usando GhostScript . Questa stampa come previsto, ma non riesce a mantenere la formattazione della pagina. Tuttavia, le pagine vengono stampate come previsto quando cambio Adobe Acrobat al posto di GhostScript . Quindi presumo, sto facendo un errore evidente sugli argomenti della riga di comando di GhostScript.

sfondo

Di seguito è riportata la logica core c #, che stampa un determinato file PDF con uno stile diverso su ciascuna pagina. Il file PDF fornito ha pagine;

  1. con stile e colore del carattere incoerenti
  2. alcune pagine hanno una dimensione del carattere normale, mentre altre sono stampate in caratteri molto piccoli
  3. alcune pagine hanno margini consigliati ma altri hanno margini molto piccoli
  4. alcune pagine sono a colors e il resto in grigio.
  5. alcune delle pagine sono in stile paesaggio in cui altri sono ritratti

In sintesi, il PDF che sto cercando di stampare non è altro che un consolidamento (unendo i singoli pdf in un unico grande pdf) di numerosi documenti pdf di piccole dimensioni con vari tipi di carattere, dimensioni, margini.

Problema

La logica seguente utilizza GhostScript(v9.02) per stampare file PDF. Anche se la seguente logica stampa un dato PDF, non riesce a mantenere la formattazione della pagina tra cui intestazione, piè di pagina, dimensione del carattere, margine, orientamento (il mio file pdf ha pagine sia orizzontali che verticali).

È interessante notare che, se utilizzo il lettore Acrobat per stampare lo stesso PDF, verrà stampato come previsto insieme a tutte le formattazioni a livello di pagina.

Esempio PDF: prima sezione , seconda sezione

  void PrintDocument() { var psInfo = new ProcessStartInfo(); psInfo.Arguments = String.Format( " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"", GetDefaultPrinter(), @"C:\PDFOutput\test.pdf"); psInfo.FileName = @"C:\Program Files\gs\gs9.10\bin\gswin64c.exe"; psInfo.UseShellExecute = false; using (var process= Process.Start(psInfo)) { process.WaitForExit(); } } 

Penso che tu abbia già fatto questa domanda, ed è anche abbastanza chiaro dal tuo esempio di codice che stai usando GSView , non Ghostscript .

Ora, mentre GSView usa Ghostscript per fare il lavoro pesante, è una preoccupazione che tu non sia in grado di distinguere tra queste due applicazioni.

Non hai ancora fornito un file PDF di esempio da guardare, né una riga di comando, anche se ora sei almeno riuscito a citare la versione di Ghostscript. Devi anche dare una riga di comando (no non sono preparato per assemblarlo leggendo il tuo codice) e dovresti provare questo dalla riga di comando, non all’interno della tua applicazione, per dimostrare che non è la tua applicazione che fa il errore.

Si dovrebbe prendere in considerazione l’aggiornamento di Ghostscript alla versione corrente.

Si noti che una rapida lettura del codice indica che si sta specificando un numero di opzioni della riga di comando (ad esempio -dPDFSETTINGS) che sono appropriate solo per la conversione di un file in PDF, non per altri scopi (come la stampa).

Quindi, come ho detto prima, fornire un file campione per riprodurre il problema e una riga di comando (preferibilmente una riga di comando Ghostscript ) che causa il problema. Sapere quale stampante stai usando sarebbe probabilmente anche utile, anche se è altamente improbabile che io abbia un duplicato su cui testare.

Risposta: AGGIORNAMENTO 16/12/2013

Sono riuscito a sistemarlo e volevo racchiudere la soluzione di lavoro se aiuta gli altri. Un ringraziamento speciale a “KenS” poiché ha trascorso molto tempo a guidarmi.

Per riassumere, ho finalmente deciso di utilizzare GSView insieme a GhostScript per stampare PDF per aggirare Adobe. La logica di base è riportata di seguito;

  //PrintParamter is a custom data structure to capture file related info private void PrintDocument(PrintParamter fs, string printerName = null) { if (!File.Exists(fs.FullyQualifiedName)) return; var filename = fs.FullyQualifiedName ?? string.Empty; printerName = printerName ?? GetDefaultPrinter(); //get your printer here var processArgs = string.Format("-dAutoRotatePages=/All -dNOPAUSE -dBATCH -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dEmbedAllFonts=true -dSubsetFonts=true -dPDFSETTINGS=/prepress -dNOPLATFONTS -sFONTPATH=\"C:\\Program Files\\gs\\gs9.10\\fonts\" -noquery -dNumCopies=1 -all -colour -printer \"{0}\" \"{1}\"", printerName, filename); try { var gsProcessInfo = new ProcessStartInfo { WindowStyle = ProcessWindowStyle.Hidden, FileName = gsViewEXEInstallationLocation, Arguments = processArgs }; using (var gsProcess = Process.Start(gsProcessInfo)) { gsProcess.WaitForExit(); } } 

Potresti usare GSPRINT .

Sono riuscito a farlo funzionare solo copiando gsprint.exe / gswin64c.exe / gsdll64.dll in una directory e avviarlo da lì.

codice di esempio :

  // This uses gsprint (mind the paths) private const string gsPrintExecutable = @"C:\gs\gsprint.exe"; private const string gsExecutable = @"C:\gs\gswin64c.exe"; string pdfPath = @"C:\myShinyPDF.PDF" string printerName = "MY PRINTER"; string processArgs = string.Format("-ghostscript \"{0}\" -copies=1 -all -printer \"{1}\" \"{2}\"", gsExecutable, printerName, pdfPath ); var gsProcessInfo = new ProcessStartInfo { WindowStyle = ProcessWindowStyle.Hidden, FileName = gsPrintExecutable , Arguments = processArgs }; using (var gsProcess = Process.Start(gsProcessInfo)) { gsProcess.WaitForExit(); }