Print PDF using GhostScript

18,157

Solution 1

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();

                }

        }

Solution 2

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.

Solution 3

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();

            }
Share:
18,157

Related videos on Youtube

Sreejith Nair
Author by

Sreejith Nair

Updated on September 15, 2022

Comments

  • Sreejith Nair
    Sreejith Nair about 1 year

    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 GhostScript. This print as expected but fail to retain the page formatting’s. However, pages are printed as expected when I switch Adobe Acrobat in place of GhostScript. So I presume, I am making some obvious mistake on the GhostScript's command line arguments .

    Background

    Following is the core c# logic, which print a given PDF file with varying style across each pages. The given PDF file has pages;

    1. with inconsistent font style and colour
    2. some of the pages have normal font size where others are printed in extra small
    3. some of the pages has recommended margin but others have very small margin
    4. some of the pages are in colour and the rest in grey.
    5. some of the pages are landscape in style where other are portrait

    In concise, the PDF which I am trying to print is nothing but a consolidation (joining individual pdfs into one large pdf) of numerous small sized pdf document with varying fonts style, size, margins.

    Issue

    Following logic use GhostScript(v9.02) to print PDF file. Though the following logic print any given PDF, it fail to retain the page formatting including header, footer, font size, margin, orientation ( my pdf file has pages those both landscape and portrait).

    Interestingly, if I use acrobat reader to print the same PDF then it will print as expected along with all page level formatting's.

    PDF specimen: First section, Second section

      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();
            }
        }
    
  • Sreejith Nair
    Sreejith Nair almost 10 years
    Thanks for your response. (1) After goggling, my impression was that GsView uses GhostScript to print PDF. I think i need review my understanding. (2) Would you be able to help me or direct me on how to use GhostScript to print PDF without GSView ? (3) When it comes to sample PDF, I can assure you one thing that the document contains NDA's and financial information's and hence I can't share it. Sorry about that. But definitely, I will look for some obsolete/old PDF files(4) You are absolutely right and I was trying with random command line option due lack of knowledge.
  • Sreejith Nair
    Sreejith Nair almost 10 years
    As per your advise, I modified my initial post and my application, which replace use of GSView and now it completely rely on GhostScript. However, the issue continue to hold good. Any helps??
  • KenS
    KenS almost 10 years
    GSView does use Ghostscript, but the command line parameters are not the same. If you can't share a document which causes a problem there is nothing further I can do to help. Perhaps you can create one which you can share. To print a file (under Windows) using Ghostscript you need to use the mswinpr2 device.
  • Sreejith Nair
    Sreejith Nair almost 10 years
    I attached the specimen of the documents. In reality we join these documents (on after the other) before printing. But this joining process is been done by third-party hence I have no control over it. However, these individual documents are good enough to reproduce the issue. Also, as you suggested, I am open to use either GhostScript or GSView with GhostScript to print the documents.
  • KenS
    KenS almost 10 years
    Well app1.pdf is broken, it contains 2 %%EOF and 2 startxref directives (there should only be 1). Ghostscript repairs this while reading the file. The major problem is that both files use fonts, which they do not supply. Whenever this happens you will get font substitution, even with Acrobat. The reason Acrobat behaves differently is that on installation it adds the fonts in your Windows font folder to the ones it can use. You can do this for Ghostscript too by adding -sFONTPATH= and possibly by modifying the fontmap.gs file (which will require you downloading the GS sources)
  • KenS
    KenS almost 10 years
    There are a number of answers already here on SO about adding fonts to GS so I won't go into that. WHat other problems do you see with these files ?