Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there anyway to specify a PrintTo printer when spawning a process?

What I Have

I am currently writing a program which takes a specified file and the performs some action with it. Currently it opens it, and/or attaches it to an email and mails it to specified addresses.

The file can either be of the formats: Excel, Excel Report, Word, or PDF.

What I am currently doing is spawning a process with the path of the file and then starting the process; however I also am trying to fix a bug feature that I added which adds the verb 'PrintTo' to the startup information, depending on a specified setting.

What I Need

The task I am trying to accomplish is that I would like to have the document open and then print itself to a specified printer named within the program itself. Following that up, the file should then close itself automatically.

If there is no way to do this generically, we might be able to come up with a way to do it for each separate file type.

What you Need

Here is the code I'm using:

ProcessStartInfo pStartInfo = new ProcessStartInfo();
pStartInfo.FileName = FilePath;

// Determine wether to just open or print
if (Print)
{
    if (PrinterName != null)
    {
       // TODO: Add default printer.
    }

    pStartInfo.Verb = "PrintTo";
}

// Open the report file unless only set to be emailed.
if ((!Email && !Print) || Print)
{
    Process p = Process.Start(pStartInfo);
}

How I'm doing...

Still stumped... might call it like Microsoft does,'That was by design'.

like image 638
Immanu'el Smith Avatar asked Jul 07 '10 18:07

Immanu'el Smith


2 Answers

The following works for me (tested with *.doc and *.docx files)

the windows printto dialog appears by using the "System.Windows.Forms.PrintDialog" and for the "System.Diagnostics.ProcessStartInfo" I just take the selected printer :)

just replace the FILENAME with the FullName (Path+Name) of your Office file. I think this will also work with other files...

// Send it to the selected printer
using (PrintDialog printDialog1 = new PrintDialog())
{
    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
        System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(**FILENAME**);
        info.Arguments = "\"" + printDialog1.PrinterSettings.PrinterName + "\"";
        info.CreateNoWindow = true;
        info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        info.UseShellExecute = true;
        info.Verb = "PrintTo";
        System.Diagnostics.Process.Start(info);
    }
}
like image 199
dataCore Avatar answered Sep 23 '22 21:09

dataCore


Theoretically, according to an article on MSDN you should be able to change it to be along the lines of (untested):

// Determine wether to just open or print
if (Print)
{
    if (PrinterName != null)
    {
        pStartInfo.Arguments = "\"" + PrinterName + "\"";
    }

    pStartInfo.CreateNoWindow = true;
    pStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    pStartInfo.UseShellExecute = true;
    pStartInfo.WorkingDirectory = sDocPath;

    pStartInfo.Verb = "PrintTo";
}
like image 36
Rowland Shaw Avatar answered Sep 21 '22 21:09

Rowland Shaw