Как распечатать файл xps

Обновлено: 02.07.2024

Как известно, в WPF поддерживаются два взаимодополняющих типа документов. Потоковые документы обрабатывают гибкое содержимое. Документы XPS хранят готовое для печати содержимое, основанное на фиксированном размере страницы (фактически являясь аналогом PDF). Содержимое "заморожено" на месте и сохраняет свою точную исходную форму.

Как и можно было ожидать, распечатать документ XpsDocument довольно просто. Подобно FlowDocument, класс XpsDocument предоставляет DocumentPaginator. Однако объекту DocumentPaginator для XpsDocument мало что нужно делать, поскольку его содержимое уже скомпоновано на фиксированных, неизменных страницах.

Ниже приведен код, который можно использовать для загрузки файла XPS в память, отображения его в DocumentViewer с последующей отправкой на принтер:

Очевидно, что отображать фиксированный документ в DocumentViewer перед его печатью не обязательно. В коде этот шаг предусмотрен потому, что это наиболее распространенный вариант. Во многих сценариях документ XpsDocument загружается для предварительного просмотра и печатается только после того, как пользователь щелкнет на соответствующей кнопке.

Как и средства просмотра для объектов FlowDocument, объект DocumentViewer также обрабатывает команду ApplicationCommands.Print, а это означает, что документ XPS можно отправлять из DocumentViewer на принтер без какого-либо кода.

Создание документа XPS для предварительного просмотра перед печатью

В WPF доступна вся необходимая поддержка программного создания документов XPS. Создание документа XPS концептуально похоже на печать некоторого содержимого: после построения документа XPS выбран фиксированный размер страницы и компоновка "заморожена". Так зачем же нужен дополнительный шаг? На то есть две причины:

Предварительный просмотр. Сгенерированный документ XPS может быть использован для предварительного просмотра с помощью DocumentViewer. Пользователь затем может решить, стоит ли его печатать.

Асинхронная печать. Класс XpsDocumentWriter включает как метод Write() для синхронной печати, так и метод WriteAsync(), который позволяет отправлять содержимое на принтер асинхронно. Для длительных и сложных операций печати асинхронный вариант предпочтителен. Он позволяет создавать более отзывчивые приложения.

Базовый прием создания документа XPS предусматривает создание объекта XpsDocumentWriter с использованием статического метода XpsDocument.CreateXpsDocumentWriter(), например:

XpsDocumentWriter — усеченный класс, и его функциональность вращается вокруг методов Write() и WriteAsync(), которые записывают содержимое в документ XPS.

Оба эти метода многократно перегружены, позволяя писать разные типы содержимого, включая другой документ XPS, страницу, извлеченную из документа XPS, визуальный элемент (который позволяет записывать любой элемент) и DocumentPaginator. Вновь созданный документ XPS затем отображается в DocumentViewer, который служит для предварительного просмотра печати.

Запись в документ XPS, находящийся в памяти

Класс XpsDocument предполагает, что содержимое XPS записывается в файл. Это немного неудобно в ситуациях, подобных показанной выше, где документ XPS служит временным хранилищем, используемым для предварительного просмотра. Подобные проблемы происходят, когда содержимое XPS должно быть сериализовано в какое-то другое хранилище, например, в поле внутри записи базы данных.

Это ограничение можно обойти и записать содержимое XPS непосредственно в MemoryStream. Однако это потребует немного больше усилий, поскольку сначала понадобится создать пакет для содержимого XPS. Ниже приведен код, выполняющий эту работу:

По завершении использования документа XPS можно закрыть поток для освобождения памяти.

Не используйте подход с хранением в памяти, если приходится работать с большим документом XPS (например, при генерации документа XPS из содержимого базы данных, с неизвестным количеством записей). Вместо этого следует воспользоваться методом вроде Path.GetTempFileName() для получения подходящего временного пути и создать документ XPS в файле.

Печать непосредственно на принтер через XPS

Как уже известно, поддержка печати в WPF построена на пути печати XPS. При использовании класса PrintDialog признаки этой низкоуровневой реальности могут быть и не видны. С другой стороны, если применяется XpsDocumentWriter, то не заметить их невозможно.

До сих пор вся печать запускалась через класс PrintDialog. Поступать так не обязательно. В действительности PrintDialog делегирует реальную работу XpsDocumentWriter. Трюк состоит в создании XpsDocumentWriter, который упаковывает PrintQueue вместо FileStream. Код записи печатного вывода идентичен — в нем используются методы Write() и WriteAsync().

Ниже приведен фрагмент кода, который отображает диалоговое окно Print, получает выбранный принтер и применяет его для создания XpsDocumentWriter, запускающего задание печати:

Интересно, что в этом примере все равно используется класс PrintDialog. Однако это делается просто для отображения стандартного диалогового окна Print, в котором пользователь может выбрать принтер. Реальная печать осуществляется через XpsDocumentWriter.

Асинхронная печать

Класс XpsDocumentWriter упрощает асинхронную печать. Фактически предыдущий пример можно преобразовать для использования асинхронной печати, просто заменив вызов метода Write() вызовом WriteAsync().

В Windows все задания печати выполняются асинхронно. Тем не менее, процесс отправки задания на печать происходит синхронно, если применяется метод Write(), и асинхронно — если WriteAsync(). Во многих случаях время на отправку задания на печать является несущественным, и это средство не понадобится. Другое дело, если требуется построить (и разбить на страницы) содержимое, которое должно печататься асинхронно — это зачастую наиболее затратная по времени операция, и если нужна такая возможность, то понадобится писать код, который запускает логику печати в фоновом потоке. Для относительного упрощения работы можно воспользоваться подходом с классом BackgroundWorker.

Сигнатура метода WriteAsync() соответствует сигнатуре метода Write(). Другими словами, WriteAsync() принимает объект разбивки на страницы, визуальный элемент или один из нескольких других типов объектов.

Вдобавок метод WriteAsync() имеет перегрузки, принимающие дополнительный второй параметр с информацией о состоянии. Информация о состоянии может быть представлена любым объектом, который будет использоваться для идентификации задания печати. Этот объект предоставлен посредством объекта WritingCompletedEventArgs при возникновении события WritingCompleted. Это позволяет запускать сразу несколько заданий печати, обрабатывать событие WritingCompleted для каждого из них в одном и том же обработчике и определять, какое именно задание было запущено при каждом возникновении события.

Выполнение асинхронного задания печати можно прервать, вызвав метод CancelAsync().

Класс XpsDocumentWriter также включает небольшой набор событий, которые позволяют реагировать на отправку задания печати, в том числе WritingProgressChanged, WritingCompleted и WritingCancelled. Имейте в виду, что событие WritingCompleted происходит тогда, когда задание печати записывается в очередь печати, но это не значит, что принтер немедленно начинает его печатать.

Можно использовать одну перегрузку AddJob метода для печати XPS-файлов, не открывая PrintDialog или в принципе пользовательский интерфейс .

Вы также можете печатать XPS-файлы с помощью XpsDocumentWriter.Write методов many и XpsDocumentWriter.WriteAsync . Дополнительные сведения см. в разделе Печать XPS-документа.

Пример

Ниже приведены основные шаги по использованию метода с тремя параметрами AddJob(String, String, Boolean) . Подробные сведения см. в примере.

Определите, является ли принтер принтером XPSDrv. Дополнительные сведения о XPSDrv см. в разделе Общие сведения о печати .

Если принтер не является принтером XPSDrv, задайте однопотоковое подразделение потока.

Создайте экземпляр сервера печати и объект очереди печати.

Вызовите метод, указав имя задания, выводимый файл и Boolean флаг, указывающий, является ли принтер принтером XPSDrv.

В приведенном ниже примере показано, как выполнить пакетную печать всех XPS-файлов в каталоге. Хотя приложение предлагает пользователю указать каталог, для метода с тремя параметрами AddJob(String, String, Boolean) не требуется пользовательский интерфейс . Его можно использовать в любом пути кода, где есть имя файла XPS и путь, который можно передать в него.

Изменить значение по умолчанию можно одним из двух способов. Один из способов — просто добавить STAThreadAttribute (то есть " [System.STAThreadAttribute()] ") непосредственно над первой строкой Main метода приложения (обычно это " static void Main(string[] args) "). Однако во многих приложениях требуется, чтобы Main метод имел многопотоковое состояние апартамента, поэтому существует второй метод: помещаете вызов AddJob(String, String, Boolean) в отдельный поток, для которого в качестве состояния апартамента задано STA значение SetApartmentState . В следующем примере используется второй метод.

Соответственно, пример начинается с создания экземпляра Thread объекта и передачи ему метода PrintXPS в качестве ThreadStart параметра. (Метод PrintXPS определяется далее в примере.) Далее для потока задается один контейнер потоков. Остальной код метода Main начинается с нового потока.

Основу этого примера составляет метод static BatchXPSPrinter.PrintXPS. После создания сервера печати и очереди метод запрашивает у пользователя каталог, содержащий XPS-файлы. После проверки существования каталога и наличия * в нем XPS-файлов метод добавляет каждый такой файл в очередь печати. В примере предполагается, что принтер не является XPSDrv, поэтому мы передаем false последний параметр AddJob(String, String, Boolean) метода. По этой причине метод проверит разметку XPS в файле перед попыткой преобразовать его в язык описания страницы принтера. Если проверка завершается ошибкой, выдается исключение. В примере кода будет перехвачено исключение, уведомлять пользователя о нем, а затем переходить к обработке следующего XPS-файла.

Если вы используете принтер XPSDrv, последнему параметру можно присвоить значение true . В этом случае, поскольку XPS — это язык описания страницы принтера, метод отправит файл на принтер, не проверяя его или не преобразуя в другой язык описания страницы. Если во время разработки не определено, будет ли приложение использовать принтер XPSDrv, можно изменить приложение, чтобы оно читало IsXpsDevice свойство и ветвь в зависимости от того, что он находит.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-3 \ <PseudoXPSPrinter> \депендентфилес

где <PseudoXPSPrinter> — любая очередь печати. После этого компьютер необходимо перезагрузить.

Эта Маскировка позволяет передать в true качестве окончательного параметра, AddJob(String, String, Boolean) не вызывая исключение, но поскольку <PseudoXPSPrinter> не является принтером XPSDrv, выводится только мусор.

Средство записи документов XPS по умолчанию устанавливается в Windows Vista и более поздних версиях Windows. Для Windows XP с пакетом обновления 2 и Windows Server 2003 вы можете загрузить программу.

Как распечатать на XPS Document Writer

Для этого щелкните меню «Файл» документа или файла, который вы хотите распечатать в формате .xps, а затем нажмите «Печать».


На экране вашего компьютера появится диалоговое окно «Печать». Из него выберите Microsoft XPS Document Writer. Здесь я попробовал это с моим файлом Word 2013.


Теперь, чтобы просмотреть документ с помощью XPS Viewer после его печати, нажмите «Настройки», а затем на 2 видимых вкладках выберите вкладку «Документы XPS».


Затем установите флажок « Автоматически открывать документы XPS с помощью средства просмотра XPS» , если он не отмечен, и нажмите кнопку «ОК».


Нажмите «Печать», чтобы распечатать документ или файл.

При запросе введите имя файла и перейдите в папку, где вы хотите сохранить файл .xps. Нажмите Сохранить. Windows сохранит файлы .xps в папке «Документы» по умолчанию.


Если вы хотите прикрепить цифровую подпись к документу XPS, прежде чем отправлять или делиться им, вы можете сделать это. Прикрепление подписи помогает идентифицировать создателя документа XPS и не позволяет никому изменять его.


Кроме того, вы также можете выбрать, кто может просматривать документ и как долго, применяя разрешения перед публикацией документа.

Формат файла XPS является ответом Microsoft на широко известный и универсальный формат PDF. Как и PDF, XPS является многоплатформенным типом документов, который позволяет пользователям обмениваться документами независимо от используемой операционной системы. XPS только набирает обороты после того, как он был представлен на платформах Microsoft Office 2007, Windows Vista и Windows 7. Печать документа XPS довольно проста, если в вашей системе установлен XPS Viewer. Windows Vista и Windows 7 поставляются с уже установленным средством просмотра XPS.


кредит: Сири Стаффорд / Digital Vision / Getty Images

Шаг 1

Загрузите и установите программу просмотра XPS, если она еще не установлена ​​на вашем компьютере. См. Раздел Ресурсы для ссылки, чтобы загрузить его. После загрузки файла дважды щелкните его, чтобы запустить мастер установки. Следуйте инструкциям мастера установки, чтобы установить программу.

Шаг 2

Откройте файл XPS в средстве просмотра XPS. Дважды щелкните файл XPS в сохраненном месте, и он автоматически откроется в средстве просмотра XPS.

Шаг 3

Как распечатать PDF-файлы на плоттер

Как распечатать PDF-файлы на плоттер

Если у вас есть документы в формате .PDF, которые вы хотите распечатать в формате большого плаката, вы можете сделать это, если у вас есть доступ к плоттеру. Плоттер - это широкоформатный принтер, который .

Как распечатать защищенные файлы PDF

Как распечатать защищенные файлы PDF

Файлы Portable Document Format (PDF) отправляются, принимаются и открываются людьми по всему миру каждый день. Формат PDF позволяет любому пользователю компьютера открывать и просматривать документ .

Как обрабатывать файлы xps с помощью средства просмотра xps в Windows 7 или Windows 8

Как обрабатывать файлы xps с помощью средства просмотра xps в Windows 7 или Windows 8

Что такое формат файла XPS? Для чего его используют? Как создать файл XPS? Как использовать XPS Viewer для открытия и работы с файлами XPS?

Читайте также: