title: How to print a PDF file from code?
body: <p>I've been developing an application in visual c# which needs to print an existing pdf file at the press of a button.</p>
  
  <p>I've been using the <code>System.Diagnostics.Process</code> method to print but it fails to work as desired in a Windows 8 environment as the "Printto" command doesn't seem to work there. </p>
  
  <p>I would like to use an alternative such as possibly the <code>System.Drawing.Printing.PrintDocument</code> which had an example that works with text files but when I tried with a pdf it was printing random characters instead.</p>
  
  <p>My google searches for such seem to come up empty or I'm not entering the right keywords, but I need a solution which not only prints pdf to target printer but can determine if the printer is ready, offline or out of paper as well as an error catch.  </p>
  
  <p>Please advise as I'm also willing to look at any SDK or third party routes recommendable.</p>
  
  <p>edit: added code snippet I'm currently using:</p>
  
  <pre><code>        string defFile = (Path.Combine(GlobalVars.pdfPath, tkt_no + "_DEF.pdf"));
          string rwPrinter = "";
          if (GlobalVars.useDefaultPrinter == false) 
          { 
              foreach (string strPrinter in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
              {
                  if (strPrinter.StartsWith("ZDesigner"))
                  {
                      rwPrinter = strPrinter;
                      break;
                  }
              }
          }
          if (jobdo.Equals("print"))
          {
              Process process = new Process();
              //process.StartInfo.CreateNoWindow = true;
              process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
              process.StartInfo.FileName = defFile;
              if (rwPrinter.Length &gt; 0)
              {
                  process.StartInfo.Verb = "printto";
                  //process.StartInfo.Verb = (Path.Combine(System.Windows.Forms.Application.StartupPath, "printto.exe"));
                  process.StartInfo.Arguments = "\"" + rwPrinter + "\"";
              }
              else
              {
                  process.StartInfo.Verb = "print";
              }
  
              try
              {
                  process.Start();
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message);
              }
  
              process.WaitForInputIdle();
              //while (process.MainWindowHandle == IntPtr.Zero)
              //{
              //    Thread.Sleep(20);
              //    process.Refresh();
              //}
              Thread.Sleep(7000);
              try
              {
                  process.Kill();
              }
              catch { }
              // close any occurrences of Adobe Reader that may not close through a citrix environment regardless
              foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
              {
                  if (p.ProcessName.Equals("AcroRd32"))
                  {
                      ObjectQuery sq = new ObjectQuery
                          ("Select * from Win32_Process where ProcessID = '" + p.Id + "'");
                      ManagementObjectSearcher searcher = new ManagementObjectSearcher(sq);
                      foreach (ManagementObject oReturn in searcher.Get())
                      {
                          string[] o = new string[2];
                          oReturn.InvokeMethod("GetOwner", (object[])o);
                          if(o[0] != null)
                              if(o[0].Equals(System.Environment.UserName))
                                  p.Kill();
                      }
  
                  }
              }
  
              if (rwPrinter == "") 
              {
                  rwPrinter = "the default printer";
              }
              else
                  MessageBox.Show("Ticket " + tkt_no + " was printed to " + rwPrinter + ".");
          }
  </code></pre>