Comment imprimer PDF sur une imprimante réseau par défaut en utilisant GhostScript (gswin32c.exe) commande shell

j'aimerais imprimer un fichier PDF sur l'imprimante réseau de windows via GhostScript.

(Je ne veux pas utiliser Adobe Reader)

j'ai lu gswin32c.exe qui peut faire le travail.

J'ai expérimenté avec de nombreuses commandes et ne pouvais pas trouver la façon de forcer gs à imprimer PDF sur mon lecteur réseau (windows default).

Je n'ai pas besoin de point exact Network printer - la valeur par défaut peut être utilisée. Mais s'il n'y a pas une telle option, je suis heureux de passer aussi le nom de l'imprimante. (J'ai essayé avec param-SDevice= "server_IPprinter_name " mais cela n'a pas fonctionné aussi bien...)

commande fonctionnant sous Windows cmd:

gswin32c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile="spool\Server_NamePrinter_name" "C:test.pdf"

méthode créée sur la base ci-dessus-ne fonctionne pas et thorws exception. (Code d'erreur = 1)

    /// <summary>
    /// Prints the PDF.
    /// </summary>
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:Program Filesgsgs8.71bingswin32c.exe"</param>
    /// <param name="numberOfCopies">The number of copies.</param>
    /// <param name="printerName">Name of the printer. Eg server_nameprinter_name</param>
    /// <param name="pdfFileName">Name of the PDF file.</param>
    /// <returns></returns>
    public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) {
        ProcessStartInfo startInfo  = new ProcessStartInfo();
        startInfo.Arguments         = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile="\spool" + printerName + "" "" + pdfFileName + """;
        startInfo.FileName          = ghostScriptPath; 
        startInfo.UseShellExecute   = false;

        Process process = Process.Start(startInfo);

        return process.ExitCode == 0;
    }

une idée de la façon de le faire fonctionner sous C#?

10
demandé sur Maciej 2010-04-08 16:52:38

3 réponses

j'ai enfin réussi à le faire fonctionner et facile à déboguer.

Mon dernier code de méthode pour les personnes intéressées:

    /// <summary>
    /// Prints the PDF.
    /// </summary>
    /// <param name="ghostScriptPath">The ghost script path. Eg "C:\Program Files\gs\gs8.71\bin\gswin32c.exe"</param>
    /// <param name="numberOfCopies">The number of copies.</param>
    /// <param name="printerName">Name of the printer. Eg \server_name\printer_name</param>
    /// <param name="pdfFileName">Name of the PDF file.</param>
    /// <returns></returns>
    public bool PrintPDF (string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName) {
        ProcessStartInfo startInfo  = new ProcessStartInfo();
        startInfo.Arguments         = " -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=ljet4 -sOutputFile=\"\\spool\" + printerName + "\" \"" + pdfFileName + "\" ";
        startInfo.FileName          = ghostScriptPath; 
        startInfo.UseShellExecute = false;

        startInfo.RedirectStandardError = true;
        startInfo.RedirectStandardOutput = true;

        Process process = Process.Start(startInfo);

        Console.WriteLine( process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd() );

        process.WaitForExit(30000);
        if (process.HasExited == false) process.Kill();


        return process.ExitCode == 0;
    }
13
répondu Maciej 2010-04-08 13:29:51

vous devez tester vos options à partir de la ligne de commande en premier, puis traduire les succès dans votre code.

un fichier PDF inclut habituellement déjà des marges de page. Vous "souvent couper" le contenu de la page peut résulter d'un PDF qui est prévu pour le format de page A4 imprimé sur le format de lettre.

PDF utilise également quelques boîtes internes qui organisent le contenu de la page (et de l'objet) : MediaBox , TrimBox , CropBox , Bleedbox .

il y a plusieurs options à contrôler pour lesquelles" media size "Ghostscript rend une entrée donnée:

-dPDFFitPage  
-dUseTrimBox  
-dUseCropBox 

avec PDFFitPage Ghostscript va rendre à la page actuelle Taille du périphérique (habituellement la taille de la page par défaut).

avec UseTrimBox il utilisera le TrimBox (et il définira en même temps le PageSize à cette valeur).

avec UseCropBox il utilisera le CropBox (et il sera dans le même temps, réglez le PageSize à cette valeur).

par défaut (ne pas donner de paramètre), Ghostscript va rendre en utilisant le MediaBox .

notez que vous pouvez également contrôler la taille globale de votre sortie en utilisant -sPAPERSIZE (sélectionnez parmi toutes les valeurs prédéfinies Ghostscript sait) ou (pour plus de flexibilité) utilisez -dDEVICEWIDTHPOINTS=NNN -dDEVICEHEIGHTPOINTS=NNN pour configurer des tailles de page personnalisées.

3
répondu Kurt Pfeifle 2017-09-26 13:31:45

pas sûr que cela aide quelqu'un, mais pour ajouter les documents d'impression à une file d'attente au lieu d'imprimer immédiatement faire des changements à la section ci-dessus avec

startInfo.Arguments = " -dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=" + Convert.ToString(numberOfCopies) + " -sDEVICE=mswinpr2 -sOutputFile=%printer%" + printerName + " \"" + pdfFullFileName + "\"";

prérequis: configurer le type de travail de votre imprimante pour" maintenir L'impression": dans notre cas, nous avons un Rico Aficio MP 4000 Printer et notre usage est d'exécuter un travail de nuit pour imprimer un tas de fichiers PDF générés par SSRS.

3
répondu Kiran Xyz 2018-02-21 10:22:39