URI:
   DIR Return Create A Forum - Home
       ---------------------------------------------------------
       social facebook
  HTML https://socialfacebook.createaforum.com
       ---------------------------------------------------------
       *****************************************************
   DIR Return to: Social Facebook
       *****************************************************
       #Post#: 85--------------------------------------------------
       How to: Programmatically Print XPS Files
       By: eyeconic Date: April 5, 2018, 9:48 am
       ---------------------------------------------------------
       You can use one overload of the AddJob method to print XML Paper
       Specification (XPS) files without opening a PrintDialog or, in
       principle, any user interface (UI) at all.
       You can also print XML Paper Specification (XPS) files using the
       many Write and WriteAsync methods of the XpsDocumentWriter. For
       more about this, Printing an XPS Document.
       Another way of printing XML Paper Specification (XPS) is to use
       the PrintDocument or PrintVisual methods of the PrintDialog
       control. See Invoke a Print Dialog.
       Example
       The main steps to using the three-parameter AddJob(String,
       String, Boolean) method are as follows. The example below gives
       details.
       1.Determine if the printer is an XPSDrv printer. (See Printing
       Overview for more about XPSDrv.)
       2.If the printer is not an XPSDrv printer, set the thread's
       apartment to single thread.
       3.Instantiate a print server and print queue object.
       4.Call the method, specifying a job name, the file to be
       printed, and a Boolean flag indicating whether or not the
       printer is an XPSDrv printer.
       
       The example below shows how to batch print all XPS files in a
       directory. Although the application prompts the user to specify
       the directory, the three-parameter AddJob(String, String,
       Boolean) method does not require a user interface (UI). It can
       be used in any code path where you have an XPS file name and
       path that you can pass to it.
       The three-parameter AddJob(String, String, Boolean) overload of
       AddJob must run in a single thread apartment whenever the
       Boolean parameter is false, which it must be when a non-XPSDrv
       printer is being used. However, the default apartment state for
       Microsoft .NET is multiple thread. This default must be reversed
       since the example assumes a non-XPSDrv printer.
       There are two ways to change the default. One way is to simply
       add the STAThreadAttribute (that is,
       "[System.STAThreadAttribute()]") just above the first line of
       the application's Main method (usually "static void
       Main(string[] args)"). However, many applications require
       that the Main method have a multi-threaded apartment state, so
       there is a second method: put the call to AddJob(String, String,
       Boolean) in a separate thread whose apartment state is set to
       STA with SetApartmentState. The example below uses this second
       technique.
       Accordingly, the example begins by instantiating a Thread object
       and passing it a PrintXPS method as the ThreadStart parameter.
       (The PrintXPS method is defined later in the example.) Next the
       thread is set to a single thread apartment. The only remaining
       code of the Main method starts the new thread.
       The meat of the example is in the staticBatchXPSPrinter.PrintXPS
       method. After creating a print server and queue, the method
       prompts the user for a directory containing XPS files. After
       validating the existence of the directory and the presence of
       *.xps files in it, the method adds each such file to the print
       queue. The example assumes that the printer is non-XPSDrv, so we
       are passing false to the last parameter of AddJob(String,
       String, Boolean) method. For this reason, the method will
       validate the XPS markup in the file before it attempts to
       convert it to the printer's page description language. If the
       validation fails, an exception is thrown. The example code will
       catch the exception, notify the user about it, and then go on to
       process the next XPS file.
       C# Copy
       class Program
       {
       [System.MTAThreadAttribute()] // Added for clarity, but this
       line is redundant because MTA is the default.
       static void Main(string[] args)
       {
       // Create the secondary thread and pass the printing
       method for
       // the constructor's ThreadStart delegate parameter. The
       BatchXPSPrinter
       // class is defined below.
       Thread printingThread = new
       Thread(BatchXPSPrinter.PrintXPS);
       // Set the thread that will use PrintQueue.AddJob to
       single threading.
       printingThread.SetApartmentState(ApartmentState.STA);
       // Start the printing thread. The method passed to the
       Thread
       // constructor will execute.
       printingThread.Start();
       
       }//end Main
       }//end Program class
       public class BatchXPSPrinter
       {
       public static void PrintXPS()
       {
       // Create print server and print queue.
       LocalPrintServer localPrintServer = new
       LocalPrintServer();
       PrintQueue defaultPrintQueue =
       LocalPrintServer.GetDefaultPrintQueue();
       
       // Prompt user to identify the directory, and then
       create the directory object.
       Console.Write("Enter the directory containing the XPS
       files: ");
       String directoryPath = Console.ReadLine();
       DirectoryInfo dir = new DirectoryInfo(directoryPath);
       // If the user mistyped, end the thread and return to
       the Main thread.
       if (!dir.Exists)
       {
       Console.WriteLine("There is no such directory.");
       }
       else
       {
       // If there are no XPS files in the directory, end
       the thread
       // and return to the Main thread.
       if (dir.GetFiles("*.xps").Length == 0)
       {
       Console.WriteLine("There are no XPS files in the
       directory.");
       }
       else
       {
       Console.WriteLine("\nJobs will now be added to
       the print queue.");
       Console.WriteLine("If the queue is not paused
       and the printer is working, jobs will begin printing.");
       
       // Batch process all XPS files in the directory.
       foreach (FileInfo f in dir.GetFiles("*.xps"))
       {
       String nextFile = directoryPath + "\\" +
       f.Name;
       Console.WriteLine("Adding {0} to queue.",
       nextFile);
       try
       {
       // Print the Xps file while providing
       XPS validation and progress notifications.
       PrintSystemJobInfo xpsPrintJob =
       defaultPrintQueue.AddJob(f.Name, nextFile, false);
       }
       catch (PrintJobException e)
       {
       Console.WriteLine("\n\t{0} could not be
       added to the print queue.", f.Name);
       if (e.InnerException.Message == "File
       contains corrupted data.")
       {
       Console.WriteLine("\tIt is not a
       valid XPS file. Use the isXPS Conformance Tool to debug it.");
       }
       Console.WriteLine("\tContinuing with
       next XPS file.\n");
       }
       }// end for each XPS file
       
       }//end if there are no XPS files in the directory
       }//end if the directory does not exist
       Console.WriteLine("Press Enter to end program.");
       Console.ReadLine();
       }// end PrintXPS method
       }// end BatchXPSPrinter class
       If you are using an XPSDrv printer, then you can set the final
       parameter to true. In that case, since XPS is the printer's page
       description language, the method will send the file to the
       printer without validating it or converting it to another page
       description language. If you are uncertain at design time
       whether the application will be using an XPSDrv printer, you can
       modify the application to have it read the IsXpsDevice property
       and branch according to what it finds.
       Since there will initially be few XPSDrv printers available
       immediately after the release of Windows Vista and Microsoft
       .NET Framework, you may need to disguise a non-XPSDrv printer as
       an XPSDrv printer. To do so, add Pipelineconfig.xml to the list
       of files in the following registry key of the computer running
       your application:
       HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Enviro
       nments\Windows
       NT x86\Drivers\Version-3\<PseudoXPSPrinter>\DependentFiles
       where <PseudoXPSPrinter> is any print queue. The machine must
       then be rebooted.
       This disguise will enable you to pass true as the final
       parameter of AddJob(String, String, Boolean) without causing an
       exception, but since <PseudoXPSPrinter> is not really an XPSDrv
       printer, only garbage will print.
       Note For simplicity, the example above uses the presence of an
       *.xps extension as its test that a file is XPS. However, XPS
       files do not have to have this extension. The isXPS.exe (isXPS
       Conformance Tool) is one way of testing a file for XPS validity.
  HTML https://www.youtube.com/watch?v=XIGJzS4ru4g
       <script>
       (function() {
       var cx = '017846004531943245215:ntog6z4xfuc';
       var gcse = document.createElement('script');
       gcse.type = 'text/javascript';
       gcse.async = true;
       gcse.src = '
  HTML https://cse.google.com/cse.js?cx='
       + cx;
       var s = document.getElementsByTagName('script')[0];
       s.parentNode.insertBefore(gcse, s);
       })();
       </script>
       <gcse:search></gcse:search>
       *****************************************************