6
votes

I'm trying to print a PDF file using Process object. And up to certain extent I could print it successfully. But now I want to set printer properties.. like no of copies, Paper size etc. But I don't see any property to set these values. I'm using following code to print PDFs

string fileName = "";
string arguments = "";
string verbToUse = "";
int i = 0;
ProcessStartInfo startInfo = new ProcessStartInfo();
OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "pdf files (*.pdf)|*.pdf|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    if ((fileName = openFileDialog1.FileName) != null)
    {
        startInfo = new ProcessStartInfo(fileName);

        if (File.Exists(fileName))
        {
            i = 0;
            foreach (String verb in startInfo.Verbs)
            {
                // Display the possible verbs.
                MessageBox.Show(i.ToString() + ". " + verb);
                i++;
            }
        }
    }

    //Console.WriteLine("Select the index of the verb.");
    string index = "2";
    if (Convert.ToInt32(index) < i)
        verbToUse = startInfo.Verbs[Convert.ToInt32(index)];
    else
        return;

    startInfo.Verb = verbToUse;
    if (verbToUse.ToLower().IndexOf("printto") >= 0)
    {
        //Printer Name
        arguments = @"\\hydfsvt02\HPLaserJ";
        startInfo.Arguments = arguments;
    }

    Process newProcess = new Process();
    newProcess.StartInfo = startInfo;

    try
    {
        newProcess.Start();

        MessageBox.Show(newProcess.ProcessName + " for file " + fileName + " started successfully with verb " + startInfo.Verb);
    }
    catch (System.ComponentModel.Win32Exception ex)
    {
        MessageBox.Show(" Win32Exception caught!");
        MessageBox.Show(" Win32 error = " + ex.Message);
    }
    catch (System.InvalidOperationException)
    {
        MessageBox.Show("File " + fileName + " started with verb " + verbToUse);
    }
}
2

2 Answers

1
votes

I have written an application that does batch printing of PDF files.

It's not possible to specify the printer settings that you want to use. It's not even possible if you use the COM interface with the Adobe Standard/Pro versions.

Your options are to either:

  1. Buy a license to a third-party PDF renderer that you can use to convert the PDF to Bitmaps and use the PrintDocument to control the PrinterSettings
  2. Use something like GhostScript to convert the PDF files to BMP files and then use the PrintDocument class to print the BMP files. You can then control the PrinterSettings.
0
votes
private void startPrintingButton_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    if (DialogResult.OK == ofd.ShowDialog(this))
    {
        PrintDocument pdoc = new PrintDocument();

        pdoc.DefaultPageSettings.PrinterSettings.PrinterName = "ZDesigner GK420d";
        pdoc.DefaultPageSettings.Landscape = true;
        pdoc.DefaultPageSettings.PaperSize.Height = 140;
        pdoc.DefaultPageSettings.PaperSize.Width = 104;

        Print(pdoc.PrinterSettings.PrinterName, ofd.FileName);
    }
}

private void Print(string printerName, string fileName)
{
    try
    {
        ProcessStartInfo gsProcessInfo;
        Process gsProcess;

        gsProcessInfo = new ProcessStartInfo();
        gsProcessInfo.Verb = "PrintTo";
        gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
        gsProcessInfo.FileName = fileName;
        gsProcessInfo.Arguments = "\"" + printerName + "\"";
        gsProcess = Process.Start(gsProcessInfo);
        if (gsProcess.HasExited == false)
        {
            gsProcess.Kill();
        }
        gsProcess.EnableRaisingEvents = true;

        gsProcess.Close();
    }
    catch (Exception)
    {
    }
}

This code will print PDF files as well as adjust the printing settings.