Як друкувати файли xps програмним способом
Для друку файлів Формат XPS (XML Paper Specification) можна використовувати перевантаження методу AddJob не відкриваючи PrintDialog або, в принципі, взагалі призначений для користувача інтерфейс.
Крім того, надрукувати файли Формат XPS (XML Paper Specification) можна за допомогою методів Write і WriteAsync об'єкта XpsDocumentWriter. Для отримання додаткових відомостей про це див. Printing an XPS Document.
Інший спосіб друку Формат XPS (XML Paper Specification) полягає у використанні методів PrintDocument або PrintVisual елемента управління PrintDialog. Див. Розділ Практичний посібник. Виклик діалогового вікна друку.
Нижче наведені основні кроки використання методу AddJob (String, String, Boolean) з трьома параметрами. Наведений нижче приклад містить докладні відомості.
Визначте, чи є принтер принтером XPSDrv. (Додаткові відомості про драйвер XPSDrv см. В розділі Загальні відомості про друк.)
Якщо принтер не є принтером XPSDrv, встановіть підрозділ потоку на однопотокові.
Створіть екземпляр сервера друку і об'єкт черги друку.
Викличте метод, вказавши ім'я завдання, файл для друку і прапор Boolean. вказує, чи є принтер принтером XPSDrv.
У прикладі, який наведений нижче, показано, як виконати пакетну друк всіх файлів XPS каталогу. Хоча додаток пропонує користувачеві вказати каталог, метод з трьома параметрами AddJob (String, String, Boolean) не вимагає для користувача інтерфейс. Метод можна використовувати в будь-якому шляху коду, де присутні ім'я файлу XPS і шлях, який можна йому передати.
Перевантаження методу AddJob (String, String, Boolean) з трьома параметрами для AddJob повинна виконуватися в однопотоковому підрозділі, коли параметр Boolean приймає значення false. яке він повинен приймати при використанні принтера XPSDrv. Однак за замовчуванням стан підрозділу Microsoft .NET є багатопотокових. Це значення за замовчуванням має бути скасовано, оскільки в прикладі передбачається, що використовується принтер НЕ XPSDrv.
Існує два способи, щоб змінити значення за замовчуванням. Одним з них є просте додавання STAThreadAttribute (тобто "[System.STAThreadAttribute ()]") безпосередньо над першим рядком методу Main додатки (зазвичай, "static void Main (string [] args)"). Однак багато додатків вимагають, щоб метод Main мав стан багатопотокового підрозділу, тому існує другий метод: приміщення виклику методу AddJob (String, String, Boolean) в окремий потік, стан підрозділи якого встановлено значення STA. з методом SetApartmentState. У прикладі, який наведений нижче, використовується цей другий метод.
Відповідно, приклад починається зі створення екземпляра об'єкта Thread і передачі його методу PrintXPS як параметра ThreadStart. (Метод PrintXPS визначається пізніше в цьому прикладі). Далі потік встановлюється в однопотокові підрозділ. Новий потік запускає тільки залишився код методу Main.
Суть прикладу міститься в методі staticBatchXPSPrinter.PrintXPS. Після створення сервера друку і черги метод пропонує користувачеві вибрати каталог, що містить файли XPS. Після перевірки існування каталогу і наявності в ньому файлів xps метод додає кожен такий файл в чергу друку. Передбачається, що принтер не підтримує XPSDrv, тому ми передаємо значення false останнім параметром методу AddJob (String, String, Boolean). З цієї причини, метод буде перевіряти розмітку XPS в файлі перед спробою перетворення його в мову опису сторінок принтера. Якщо перевірка завершилася невдало, викликається виняток. Приклад коду отримає виняток, повідомить про нього користувача і перейде до обробки наступного файлу XPS.