Print PDF using GhostScript

前端 未结 4 1591
一个人的身影
一个人的身影 2021-02-06 16:21

I am in need of your support on the following issue since its pulling me for a while. We have a small c# utility, which print given PDF using Gho

相关标签:
4条回答
  • 2021-02-06 16:33

    I think you asked this question before, and its also quite clear from your code sample that you are using GSView, not Ghostscript.

    Now, while GSView does use Ghostscript to do the heavy lifting, its a concern that you are unable to differentiate between these two applications.

    You still haven't provided an example PDF file to look at, nor a command line, though you have now at least managed to quote the Ghostscript version. You need to also give a command line (no I'm not prepared to assemble it from reading your code) and you should try this from the command line, not inside your own application, in order to show that its not your application making the error.

    You should consider upgrading Ghostscript to the current version.

    Note that a quick perusal of your code indicates that you are specifying a number of command line options (eg -dPDFSETTINGS) which are only appropriate for converting a file into PDF, not for any other purpose (such as printing).

    So as I said before, provide a specimen file to reproduce the problem, and a command line (preferably a Ghostscript command line) which causes the problem. Knowing which printer you are using would probably be useful too, although its highly unlikely I will have a duplicate to test on.

    0 讨论(0)
  • 2021-02-06 16:33

    Answer - UPDATE 16/12/2013

    I was managed to get it fixed and wanted to enclose the working solution if it help others. Special thanks to 'KenS' since he spent lot of time to guide me.

    To summarize, I finally decided to use GSView along with GhostScript to print PDF to bypass Adobe. The core logic is given below;

     //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();
    
                    }
    
            }
    
    0 讨论(0)
  • 2021-02-06 16:48

    Try the following command within Process.Start():

    gswin32c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dNOPROMPT -dNoCancel -dPDFFitPage -sOutputFile="%printer%\\[printer_servername]\[printername]" "[filepath_to_pdf]"
    

    It should look like this in C#:

    string strCmdText = "gswin32c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dNOPROMPT -dNoCancel -dPDFFitPage -sOutputFile=\"%printer%\\\\[printer_servername]\\[printername]\" \"[filepath_to_pdf]\"";
    System.Diagnostics.Process.Start("CMD.exe", strCmdText);
    

    This will place the specified PDF file into the print queue.

    Note- your gswin32c.exe must be in the same directory as your C# program. I haven't tested this code.

    0 讨论(0)
  • 2021-02-06 16:50

    You could use GSPRINT.

    I've managed to make it work by only copying gsprint.exe/gswin64c.exe/gsdll64.dll in a directory and launch it from there.

    sample code :

        // 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();
    
                }
    
    0 讨论(0)
提交回复
热议问题