Очень давно, когда я только начал работать в компьютерной индустрии, я слышал восхищенные разговоры о "безбумажном офисе" и о том, что очень скоро нам не понадобятся устройства вроде принтеров, как как все документы будут исключительно цифровыми.
Через десятилетия вокруг нас море цифровых материалов, а печать все еще жива и здорова. Возможно, нам все еще нравится бумага за то, какие ощущения мы испытываем, касаясь ее, за то, что наши глаза воспринимают ее не так, как изображение на мониторах, за то, что она недорогая и поддается вторичной переработке (в отличие от вашего планшета на Windows 8). Мы любим ее за то, что с ее помощью можно разжечь костер, из нее можно сделать бумажный самолет, к тому же, она помогает найти применение всем тем мелким деревьям, которые не подходят для коммерческого использования (по крайней мере, в западных штатах). Видимо, это так, потому что бумага – это часть нашей жизни – в конце концов, сколько бы мы ни играли с компьютерами, мы все еще живем в физическом мире с физическими объектами, поэтому имеет смысл то, что мы по-прежнему ценим размещение информации на физическом носителе.
Иногда я задаюсь вопросом, не подпитывает ли идею безбумажного офиса тот факт, что многие приложения недостаточно хорошо реализуют возможности печати, возможно, это наследие былых времен, когда печать была сложной задачей. (А потом появились драйверы принтеров сомнительного качества, сложности с подключением и много других проблем). Но постепенно мир принтеров стал лучше, и для потребителей, и для разработчиков.
Конечно, печать не всегда имеет отношение к бумаге. Я часто использую PDF-"принтер" для создания копий документов только для чтения, которые во многих случаях лучше, чем оригиналы, подходят для передачи их другим людям. Иногда я печатаю на факсе (который отправляет факс), и время от времени я "печатаю" электронные письма или веб-страницы прямо в Microsoft OneNote для хранения. На самом деле, я рекомендую, при работе над возможностями печати в приложении, установить вашим принтером по умолчанию что-нибудь цифровое. При таком подходе вы избежите множества ненужных пробных копий.
Узнайте предысторию. Если вы хотите знать больше о том, как преобразилась работа с печатью, посмотрите материал "Упрощение печати в Windows 8" (http://blogs.msdn.com/b/b8_ru/archive/2012/08/06/simplificando-a-impress-227-o-no-windows-8.aspx) в блоге "Создание Windows 8". Он доставит вам удовольствие от того, что вы узнаете, что в вашей будущей работе с принтерами не будет слишком много драйверов.
Для того, чтобы узнать, как применять в приложениях возможности печати, для начала посмотрим, как все это выглядит для пользователя. Затем посмотрим, как подготовить содержимое к печати и как обработать события, связанные с печатью, полученные от Windows.
Примечание. Приложения для Магазина Windows, написанные на JavaScript, могут использовать метод window.print для печати с настройками по умолчанию. Однако, делать это не рекомендуется, так как этот метод не работает с пользовательским интерфейсом печати и не всегда способен вывести данные наилучшим образом. Приложениям для Магазина Windows следует давать пользователям полный доступ к возможностям Windows 8, как описано здесь.
Процесс печати обычно начинается в приложении, где пользователь видит что-то, что ему нужно напечатать и вызывает соответствующую команду. Например, в Сценарии 2 примера "Печать" (http://code.msdn.microsoft.com/windowsapps/Print-Sample-c544cce6), код которого мы рассмотрим ниже, мы видим большой блок содержимого и кнопку Print (Печать), как показано на рис 12.1. Обратите внимание на то, что подобная кнопка обычно расположена в панели приложения, а не в рабочей области, но это, все же, пример.
Для начала печати пользователь может либо нажать на кнопку Печать, либо открыть панель Чудо-кнопок и выбрать чудо-кнопку Устройства. В любом случае, если приложение зарегистрировано для печати, то есть, прослушивает событие, которое исходит от чудо-кнопки Устройства, и предоставляет подходящее содержимое – пользователь увидит список целей печати, как показано слева, на рис 12.2. Если у приложения нет содержимого, пригодного для печати (то есть, оно не прослушивает событие или не предоставляет содержимого в ответ), пользователь увидит панель, как справа на рис 12.2. Это очень похоже на то, что пользователь видит в панели чудо-кнопки Общий доступ в зависимости от того, предоставляет ли приложение данные для реализации этой функции. Вероятно, вы видели сообщение "Это приложение не поддерживает общий доступ". Что касается печати, здесь тоже возможно появление похожего сообщения, для приложений, которые эту возможность не поддерживают. Не позвольте вашему приложению быть одним из них.
(рис 12.1) Сценарий 2 примера "Печать" показывает типичное приложение, которое имеет какое-то содержимое для печати
(рис 12.2) Панель чудо-кнопки Устройства, когда у приложения есть подводящее для печати содержимое (слева), и когда нет (справа)
С этой точки зрения, система просто принимает любое содержимое, которое предоставляет ей приложение и отображает пользовательский интерфейс, основанный на возможностях драйвера принтера, как показано на рис 12.3. С точки зрения приложения, все это достается ему совершенно без усилий! Приложение так же может указать дополнительные опции для настройки пользовательского интерфейса для печати, такие, как размер бумаги и печать с двух сторон, что показано на рис 12.4, который сделан на основе Сценария 3 примера.
(рис 12.3) Предварительный просмотр перед печатью и параметры принтера, которые отображаются, когда пользователь выберет принтер. Ссылка More Settings (Дополнительные параметры) откроет панель параметров справа.
(рис 12.4) Панель печати отражает параметры настройки, заданные приложением
Независимо от того, где пользователю понадобилось вывести данные на печать, главное – подготовить эти данные к печати. Основная функция, о которой вам нужно знать для выполнения такой подготовки, не относится к WinRT, вместо этого ее можно найти в объекте MSApp: ). Мне нравится, как она определена в документации: "Этот метод используется как мост между HTML и печатью в приложениях для Магазина Windows. Другими словами, это способ, которым разработчик сообщает: "дайте мне что-нибудь для печати". Вы передаете ей HTML-документ, который содержит ваши данные для печати.
Я выделил здесь слово документ, так как то, что вы передаете getHtmlPrintDocumentSource не может быть произвольным элементом DOM. Это должно быть то же самое, на что всегда указывает переменная document, иначе вы получите исключение времени выполнения: "no such interface supported" ("нет такого поддерживаемого интерфейса").
Итак, где же взять такой объект?
Если то, что ваше приложение показывает на экране – это в точности то, что вы хотите вывести на печать, вы можете просто использовать объект ):
MSApp.getHtmlPrintDocumentSource(document);
Конечно, вам не нужно печатать все, что отображается на экране. Вы можете видеть, что то, что отображается на экране, показанное на рис 10.4, и то, что выводится при предварительном просмотре перед печатью, на рис 12.2 и рис 12.3, различается. Здесь вступают в дело медиа-запросы print CSS:
@media print {
/* Стили только для печати */
}
Проще говоря, если есть что-то, чего не должно быть в данных, которые будут отправлены на печать, установить стиль display: none в данном медиа-запросе. Альтернативная стратегия, которую использует рассматриваемый пример, заключается в создании отдельного CSS-файла, такого как css/print.css, и связывание его с вашим HTML-файлом с атрибутом media, установленным в print (смотрите html/scenario1.html):
<link rel="stylesheet" type="text/css" href="/css/print.css" media="print" />
Стили для печати не ограничены управлением видимостью содержимого: вы можете использовать их так, как нужно для организации содержимого в виде, больше подходящем для печати. В некотором смысле, печать похожа на еще одно состояния просмотра, где вы не добавляете содержимое и не меняете его. Вы просто меняете видимость и макет. Существуют некоторые события, которые вы можете использовать для выполнения более специфического форматирования до и после печати, как мы увидим дальше.
Но что, если содержимое, которое вы хотите напечатать, это совсем не ваш объект document? Как создать еще один? Здесь есть несколько возможностей:
document.body.onbeforeprint добавьте дополнительный дочерний элемент к документу и используйте событие document.body.onafterprint для того, чтобы его удалить (структура подобных обработчиков показана в Сценарии 2 примера о печати). Если вы выполняете печать, CSS оставляет видимым лишь эти только что добавленные элементы, видимыми, и это все, что выводится на печать. Это позволяет весьма эффективно управлять всеми выводимыми данными, например, добавлять дополнительные верхние и нижние колонтитулы, которые не видны в приложении. Вы можете предоставить пользователю возможность настройки этих колонтитулов.document.createDocumentFragment для получения фрагмента документа и затем заполните его данными, которые хотите вывести на печать. getHtmlPrintDocumentSource принимает подобные фрагменты.iframe, src которого установлено на документ SVG (один из советов, которые мы упоминали для SVG в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript"), получите данный SVG-документ напрямую, с помощью свойства contentDocument объекта iframe. То, что вы получите, так же может быть напрямую передано в getHtmlPrintDocumentSource и на печать будет выведен лишь SVG. Например:
<!-- В HTML -->
< iframe id="diagram" src="/images/diagram.svg"></iframe>
//В JavaScript
var frame = document.getElementById("diagram");
args.setSource(MSApp.getHtmlPrintDocumentSource(frame.contentDocument));
Последнее показано в Сценарии 4 примера "Печать", где элемент link добавлен к документу с помощью следующего кода (js/scenario4.js):
var alternateLink = document.createElement("link");
alternateLink.setAttribute("id", "alternateContent");
alternateLink.setAttribute("rel", "alternate");
alternateLink.setAttribute("href", "http://go.microsoft.com/fwlink/?LinkId=240076");
alternateLink.setAttribute("media", "print");
document.getElementsByTagName("head")[0].appendChild(alternateLink);
Здесь атрибут rel показывает, что это альтернативное содержимое, атрибут media указывает на то, что он предназначен только для печати, и href указывает на альтарнетивное содержимое (id не обязательно). Обратите внимание на то, что если на целевой странице есть какие-либо медиа-запросы, предназначенные для печати, они будут применены при создании источника данных для печати.
Теперь, когда мы знаем, как получить источник содержимого для печати, очень просто передать это содержимое Windows для печати.
Для начала нужно получить объект ) как показано ниже:
var printManager = Windows.Graphics.Printing.PrintManager.getForCurrentView();
И затем – прослушивать его событие ) (событие WinRT), либо с помощью addEventListener , либо назначив обработчик, как это сделано в примере:
printManager.onprinttaskrequested = onPrintTaskRequested;
Если вы не добавили обработчик для этого события, пользователь увидит сообщение, как в правой части рис 12.1 при активации чудо-кнопки Устройства, если только вы не зарегистрировали приложение для обработки других событий, связанных с устройствами, как, например, ), как мы видели в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".
Если вы хотите инициировать печать с помощью команды приложения, такой, как кнопка Print (Печать) в Сценарии 2 примера, вызовите метод ). Это равносильно нажатию на чудо-кнопку Устройства, когда приложение зарегистрировано для события printtaskrequested.
Событие printtaskrequested вызывается, когда активируется чудо-кнопка Устройства. В ответ, ваш обработчик создает объект PrintTask (http://msdn.microsoft.com/library/windows/apps/windows.graphics.printing.printtask.aspx) с функцией обратного вызова, которая предоставляет, когда будет нужно, содержимое документа. Вот как это работает. Сначала ваш обработчик получает объект PrintTaskRequest (http://msdn.microsoft.com/library/windows/apps/windows.graphics.printing.printtaskrequest.aspx), который имеет три члена:
deadline Дата и время, указывающие на то, сколько времени у вас есть на то, чтобы предоставить запрошенные данные.createPrintTask Создает объект PrintTask с заданным заголовком и функцией, которая предоставляет документ-источник данных по запросу.Структура ), метод setSource которого вы вызываете с тем, что хотите вернуть в MSApp.getHtmlDocumentPrintSource.
Здесь обычно можно выполнить и другие действия по настройке задачи, поэтому давайте взглянем на код из Сценария 3 примера "Печать" (где я для краткости добавил переменную пространства имен):
function onPrintTaskRequested(printEvent) {
var printTask = printEvent.request.createPrintTask("Print Sample", function (args) {
args.setSource(MSApp.getHtmlPrintDocumentSource(document));
// Выбор параметров принтера для показа. Порядок, в котором добавлены параметры
// определяют порядок, в котором они будут отображены в пользовательском интерфейсе
var options = Windows.Graphics.Printing.StandardPrintTaskOptions;
printTask.options.displayedOptions.clear(); printTask.options.displayedOptions.append(options.copies);
printTask.options.displayedOptions.append(options.mediaSize);
printTask.options.displayedOptions.append(options.orientation);
printTask.options.displayedOptions.append(options.duplex);
// Устанавливает значения по умолчанию для параметров принтера
printTask.options.mediaSize =
Windows.Graphics.Printing.PrintMediaSize.northAmericaLegal;
// Регистрирует обработчик для события завершения задачи печати
printTask.oncompleted = onPrintTaskCompleted;
});
}
Обратите внимание на то, что PrintTaskSourceRequestedArgs так же содержит уже знакомый вам метод getDeferral и свойство deadline.
Совет. Если вы пошагово исполняете код в обработчике printtaskrequested, но пропустите время, заданное в deadline, пользовательский интерфейс печати сообщит о том, что нет данных для печати. Это может не быть ошибкой приложения – уберите точки останова и снова запустите программу для того, чтобы это проверить.
Вы можете управлять тем, как выглядит пользовательский интерфейс печати с помощью ). Объект ), несколько из вполне очевидных числовых параметров, это maxCopies, minCopies, и numberOfCopies. Так же вы можете вызвать getPageDescription с номером страницы для получения PrintPageDescription с информацией о физических размерах данной страницы
Кроме того, здесь имеется множество свойств, значения которых берутся из различных перечислений, имеющих отношение к печати:
| Свойство PrintTaskOptions | Windows.Graphics.Printing Enumeration |
|---|---|
binding |
PrintBinding |
collation |
PrintCollation |
colorMode |
PrintColorMode |
duplex |
PrintDuplex |
holePunch |
PrintHolePunch |
mediaSize |
PrintMediaSize |
mediaType |
PrintMediaType |
orientation |
PrintOrientation |
printQuality |
PrintQuality |
staple |
PrintStaple |
) в свою очередь, это вектор строк, которые должны браться из класса ) как показано в коде выше. Каждый из них управляет видимостью параметра в пользовательском интерфейсе печати, если, конечно, принтер поддерживает этот параметр (в противном случае параметр не будет показан). Вот полный список параметров: binding, collation, colorMode, copies, duplex, holePunch, inputBin, mediaSize, mediaType, nUp, orientation, printQuality, и staple.
Обратите особое внимание на свойство mediaSize , для которого доступно 172 различных значения в перечислении PrintMediaSize, которые отражают все размеры форматов бумаги, конвертов и так далее. Когда вы размещаете в Магазине Windows приложение, предназначенное для разных регионов, вам может понадобиться включить mediaSize в displayedOptions и установить его значение во что-то, применяющееся в регионе (как сделано в вышеприведенном коде для бумаги формата legal size). Несмотря на это, размеры носителей обычно доступны в панели More Settings (Дополнительные параметры) пользовательского интерфейса печати, в зависимости от того, что поддерживает выбранный принтер, так что пользователи будут иметь доступ к этим настройкам.
Последнее, что хочется упомянуть в связи с вышеприведенным кодом, это то, что у PrintTask есть событие completed, вместе с previewing, progressing, и submitting. Вы можете использовать их для того, чтобы показывать состояние задач печати в вашем приложении, если вы решите это делать. Больше сведений о самой задаче можно получить из ей свойств, которые обычно содержит заданный вам заголовок задачи печати и уникальный ID. Среди всего этого, однако, вы можете отметить бросающееся в глаза отсутствие метода в PrintTask, с помощью которого можно отменить задание. На самом деле, так и есть. Это потому, что модель печати HTML, которую в настоящее время использую приложения для Магазина Windows, написанные на JavaScript, работает по принципу "все или ничего": как только задание попало в подсистему печати, программными средствами его не остановить. Однако, пользователь может пройти в традиционную панель управления принтером и отменить задание там, или вернуться к старому доброму методу вытаскивания бумаги из принтера, но в настоящее время приложения не могут предоставить подобных функций самостоятельно.
Очень давно, когда я только начал работать в компьютерной индустрии, я слышал восхищенные разговоры о "безбумажном офисе" и о том, что очень скоро нам не понадобятся устройства вроде принтеров, как как все документы будут исключительно цифровыми.
Через десятилетия вокруг нас море цифровых материалов, а печать все еще жива и здорова. Возможно, нам все еще нравится бумага за то, какие ощущения мы испытываем, касаясь ее, за то, что наши глаза воспринимают ее не так, как изображение на мониторах, за то, что она недорогая и поддается вторичной переработке (в отличие от вашего планшета на Windows 8). Мы любим ее за то, что с ее помощью можно разжечь костер, из нее можно сделать бумажный самолет, к тому же, она помогает найти применение всем тем мелким деревьям, которые не подходят для коммерческого использования (по крайней мере, в западных штатах). Видимо, это так, потому что бумага – это часть нашей жизни – в конце концов, сколько бы мы ни играли с компьютерами, мы все еще живем в физическом мире с физическими объектами, поэтому имеет смысл то, что мы по-прежнему ценим размещение информации на физическом носителе.
Иногда я задаюсь вопросом, не подпитывает ли идею безбумажного офиса тот факт, что многие приложения недостаточно хорошо реализуют возможности печати, возможно, это наследие былых времен, когда печать была сложной задачей. (А потом появились драйверы принтеров сомнительного качества, сложности с подключением и много других проблем). Но постепенно мир принтеров стал лучше, и для потребителей, и для разработчиков.
Конечно, печать не всегда имеет отношение к бумаге. Я часто использую PDF-"принтер" для создания копий документов только для чтения, которые во многих случаях лучше, чем оригиналы, подходят для передачи их другим людям. Иногда я печатаю на факсе (который отправляет факс), и время от времени я "печатаю" электронные письма или веб-страницы прямо в Microsoft OneNote для хранения. На самом деле, я рекомендую, при работе над возможностями печати в приложении, установить вашим принтером по умолчанию что-нибудь цифровое. При таком подходе вы избежите множества ненужных пробных копий.
Узнайте предысторию. Если вы хотите знать больше о том, как преобразилась работа с печатью, посмотрите материал "Упрощение печати в Windows 8" (http://blogs.msdn.com/b/b8_ru/archive/2012/08/06/simplificando-a-impress-227-o-no-windows-8.aspx) в блоге "Создание Windows 8". Он доставит вам удовольствие от того, что вы узнаете, что в вашей будущей работе с принтерами не будет слишком много драйверов.
Для того, чтобы узнать, как применять в приложениях возможности печати, для начала посмотрим, как все это выглядит для пользователя. Затем посмотрим, как подготовить содержимое к печати и как обработать события, связанные с печатью, полученные от Windows.
Примечание. Приложения для Магазина Windows, написанные на JavaScript, могут использовать метод window.print для печати с настройками по умолчанию. Однако, делать это не рекомендуется, так как этот метод не работает с пользовательским интерфейсом печати и не всегда способен вывести данные наилучшим образом. Приложениям для Магазина Windows следует давать пользователям полный доступ к возможностям Windows 8, как описано здесь.
Процесс печати обычно начинается в приложении, где пользователь видит что-то, что ему нужно напечатать и вызывает соответствующую команду. Например, в Сценарии 2 примера "Печать" (http://code.msdn.microsoft.com/windowsapps/Print-Sample-c544cce6), код которого мы рассмотрим ниже, мы видим большой блок содержимого и кнопку Print (Печать), как показано на рис 12.1. Обратите внимание на то, что подобная кнопка обычно расположена в панели приложения, а не в рабочей области, но это, все же, пример.
Для начала печати пользователь может либо нажать на кнопку Печать, либо открыть панель Чудо-кнопок и выбрать чудо-кнопку Устройства. В любом случае, если приложение зарегистрировано для печати, то есть, прослушивает событие, которое исходит от чудо-кнопки Устройства, и предоставляет подходящее содержимое – пользователь увидит список целей печати, как показано слева, на рис 12.2. Если у приложения нет содержимого, пригодного для печати (то есть, оно не прослушивает событие или не предоставляет содержимого в ответ), пользователь увидит панель, как справа на рис 12.2. Это очень похоже на то, что пользователь видит в панели чудо-кнопки Общий доступ в зависимости от того, предоставляет ли приложение данные для реализации этой функции. Вероятно, вы видели сообщение "Это приложение не поддерживает общий доступ". Что касается печати, здесь тоже возможно появление похожего сообщения, для приложений, которые эту возможность не поддерживают. Не позвольте вашему приложению быть одним из них.
(рис 12.1) Сценарий 2 примера "Печать" показывает типичное приложение, которое имеет какое-то содержимое для печати
(рис 12.2) Панель чудо-кнопки Устройства, когда у приложения есть подводящее для печати содержимое (слева), и когда нет (справа)
С этой точки зрения, система просто принимает любое содержимое, которое предоставляет ей приложение и отображает пользовательский интерфейс, основанный на возможностях драйвера принтера, как показано на рис 12.3. С точки зрения приложения, все это достается ему совершенно без усилий! Приложение так же может указать дополнительные опции для настройки пользовательского интерфейса для печати, такие, как размер бумаги и печать с двух сторон, что показано на рис 12.4, который сделан на основе Сценария 3 примера.
(рис 12.3) Предварительный просмотр перед печатью и параметры принтера, которые отображаются, когда пользователь выберет принтер. Ссылка More Settings (Дополнительные параметры) откроет панель параметров справа.
(рис 12.4) Панель печати отражает параметры настройки, заданные приложением
Независимо от того, где пользователю понадобилось вывести данные на печать, главное – подготовить эти данные к печати. Основная функция, о которой вам нужно знать для выполнения такой подготовки, не относится к WinRT, вместо этого ее можно найти в объекте MSApp: ). Мне нравится, как она определена в документации: "Этот метод используется как мост между HTML и печатью в приложениях для Магазина Windows. Другими словами, это способ, которым разработчик сообщает: "дайте мне что-нибудь для печати". Вы передаете ей HTML-документ, который содержит ваши данные для печати.
Я выделил здесь слово документ, так как то, что вы передаете getHtmlPrintDocumentSource не может быть произвольным элементом DOM. Это должно быть то же самое, на что всегда указывает переменная document, иначе вы получите исключение времени выполнения: "no such interface supported" ("нет такого поддерживаемого интерфейса").
Итак, где же взять такой объект?
Если то, что ваше приложение показывает на экране – это в точности то, что вы хотите вывести на печать, вы можете просто использовать объект ):
MSApp.getHtmlPrintDocumentSource(document);
Конечно, вам не нужно печатать все, что отображается на экране. Вы можете видеть, что то, что отображается на экране, показанное на рис 10.4, и то, что выводится при предварительном просмотре перед печатью, на рис 12.2 и рис 12.3, различается. Здесь вступают в дело медиа-запросы print CSS:
@media print {
/* Стили только для печати */
}
Проще говоря, если есть что-то, чего не должно быть в данных, которые будут отправлены на печать, установить стиль display: none в данном медиа-запросе. Альтернативная стратегия, которую использует рассматриваемый пример, заключается в создании отдельного CSS-файла, такого как css/print.css, и связывание его с вашим HTML-файлом с атрибутом media, установленным в print (смотрите html/scenario1.html):
<link rel="stylesheet" type="text/css" href="/css/print.css" media="print" />
Стили для печати не ограничены управлением видимостью содержимого: вы можете использовать их так, как нужно для организации содержимого в виде, больше подходящем для печати. В некотором смысле, печать похожа на еще одно состояния просмотра, где вы не добавляете содержимое и не меняете его. Вы просто меняете видимость и макет. Существуют некоторые события, которые вы можете использовать для выполнения более специфического форматирования до и после печати, как мы увидим дальше.
Но что, если содержимое, которое вы хотите напечатать, это совсем не ваш объект document? Как создать еще один? Здесь есть несколько возможностей:
document.body.onbeforeprint добавьте дополнительный дочерний элемент к документу и используйте событие document.body.onafterprint для того, чтобы его удалить (структура подобных обработчиков показана в Сценарии 2 примера о печати). Если вы выполняете печать, CSS оставляет видимым лишь эти только что добавленные элементы, видимыми, и это все, что выводится на печать. Это позволяет весьма эффективно управлять всеми выводимыми данными, например, добавлять дополнительные верхние и нижние колонтитулы, которые не видны в приложении. Вы можете предоставить пользователю возможность настройки этих колонтитулов.document.createDocumentFragment для получения фрагмента документа и затем заполните его данными, которые хотите вывести на печать. getHtmlPrintDocumentSource принимает подобные фрагменты.iframe, src которого установлено на документ SVG (один из советов, которые мы упоминали для SVG в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript"), получите данный SVG-документ напрямую, с помощью свойства contentDocument объекта iframe. То, что вы получите, так же может быть напрямую передано в getHtmlPrintDocumentSource и на печать будет выведен лишь SVG. Например:
<!-- В HTML -->
< iframe id="diagram" src="/images/diagram.svg"></iframe>
//В JavaScript
var frame = document.getElementById("diagram");
args.setSource(MSApp.getHtmlPrintDocumentSource(frame.contentDocument));
Последнее показано в Сценарии 4 примера "Печать", где элемент link добавлен к документу с помощью следующего кода (js/scenario4.js):
var alternateLink = document.createElement("link");
alternateLink.setAttribute("id", "alternateContent");
alternateLink.setAttribute("rel", "alternate");
alternateLink.setAttribute("href", "http://go.microsoft.com/fwlink/?LinkId=240076");
alternateLink.setAttribute("media", "print");
document.getElementsByTagName("head")[0].appendChild(alternateLink);
Здесь атрибут rel показывает, что это альтернативное содержимое, атрибут media указывает на то, что он предназначен только для печати, и href указывает на альтарнетивное содержимое (id не обязательно). Обратите внимание на то, что если на целевой странице есть какие-либо медиа-запросы, предназначенные для печати, они будут применены при создании источника данных для печати.
Теперь, когда мы знаем, как получить источник содержимого для печати, очень просто передать это содержимое Windows для печати.
Для начала нужно получить объект ) как показано ниже:
var printManager = Windows.Graphics.Printing.PrintManager.getForCurrentView();
И затем – прослушивать его событие ) (событие WinRT), либо с помощью addEventListener , либо назначив обработчик, как это сделано в примере:
printManager.onprinttaskrequested = onPrintTaskRequested;
Если вы не добавили обработчик для этого события, пользователь увидит сообщение, как в правой части рис 12.1 при активации чудо-кнопки Устройства, если только вы не зарегистрировали приложение для обработки других событий, связанных с устройствами, как, например, ), как мы видели в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".
Если вы хотите инициировать печать с помощью команды приложения, такой, как кнопка Print (Печать) в Сценарии 2 примера, вызовите метод ). Это равносильно нажатию на чудо-кнопку Устройства, когда приложение зарегистрировано для события printtaskrequested.
Событие printtaskrequested вызывается, когда активируется чудо-кнопка Устройства. В ответ, ваш обработчик создает объект PrintTask (http://msdn.microsoft.com/library/windows/apps/windows.graphics.printing.printtask.aspx) с функцией обратного вызова, которая предоставляет, когда будет нужно, содержимое документа. Вот как это работает. Сначала ваш обработчик получает объект PrintTaskRequest (http://msdn.microsoft.com/library/windows/apps/windows.graphics.printing.printtaskrequest.aspx), который имеет три члена:
deadline Дата и время, указывающие на то, сколько времени у вас есть на то, чтобы предоставить запрошенные данные.createPrintTask Создает объект PrintTask с заданным заголовком и функцией, которая предоставляет документ-источник данных по запросу.Структура ), метод setSource которого вы вызываете с тем, что хотите вернуть в MSApp.getHtmlDocumentPrintSource.
Здесь обычно можно выполнить и другие действия по настройке задачи, поэтому давайте взглянем на код из Сценария 3 примера "Печать" (где я для краткости добавил переменную пространства имен):
function onPrintTaskRequested(printEvent) {
var printTask = printEvent.request.createPrintTask("Print Sample", function (args) {
args.setSource(MSApp.getHtmlPrintDocumentSource(document));
// Выбор параметров принтера для показа. Порядок, в котором добавлены параметры
// определяют порядок, в котором они будут отображены в пользовательском интерфейсе
var options = Windows.Graphics.Printing.StandardPrintTaskOptions;
printTask.options.displayedOptions.clear(); printTask.options.displayedOptions.append(options.copies);
printTask.options.displayedOptions.append(options.mediaSize);
printTask.options.displayedOptions.append(options.orientation);
printTask.options.displayedOptions.append(options.duplex);
// Устанавливает значения по умолчанию для параметров принтера
printTask.options.mediaSize =
Windows.Graphics.Printing.PrintMediaSize.northAmericaLegal;
// Регистрирует обработчик для события завершения задачи печати
printTask.oncompleted = onPrintTaskCompleted;
});
}
Обратите внимание на то, что PrintTaskSourceRequestedArgs так же содержит уже знакомый вам метод getDeferral и свойство deadline.
Совет. Если вы пошагово исполняете код в обработчике printtaskrequested, но пропустите время, заданное в deadline, пользовательский интерфейс печати сообщит о том, что нет данных для печати. Это может не быть ошибкой приложения – уберите точки останова и снова запустите программу для того, чтобы это проверить.
Вы можете управлять тем, как выглядит пользовательский интерфейс печати с помощью ). Объект ), несколько из вполне очевидных числовых параметров, это maxCopies, minCopies, и numberOfCopies. Так же вы можете вызвать getPageDescription с номером страницы для получения PrintPageDescription с информацией о физических размерах данной страницы
Кроме того, здесь имеется множество свойств, значения которых берутся из различных перечислений, имеющих отношение к печати:
| Свойство PrintTaskOptions | Windows.Graphics.Printing Enumeration |
|---|---|
binding |
PrintBinding |
collation |
PrintCollation |
colorMode |
PrintColorMode |
duplex |
PrintDuplex |
holePunch |
PrintHolePunch |
mediaSize |
PrintMediaSize |
mediaType |
PrintMediaType |
orientation |
PrintOrientation |
printQuality |
PrintQuality |
staple |
PrintStaple |
) в свою очередь, это вектор строк, которые должны браться из класса ) как показано в коде выше. Каждый из них управляет видимостью параметра в пользовательском интерфейсе печати, если, конечно, принтер поддерживает этот параметр (в противном случае параметр не будет показан). Вот полный список параметров: binding, collation, colorMode, copies, duplex, holePunch, inputBin, mediaSize, mediaType, nUp, orientation, printQuality, и staple.
Обратите особое внимание на свойство mediaSize , для которого доступно 172 различных значения в перечислении PrintMediaSize, которые отражают все размеры форматов бумаги, конвертов и так далее. Когда вы размещаете в Магазине Windows приложение, предназначенное для разных регионов, вам может понадобиться включить mediaSize в displayedOptions и установить его значение во что-то, применяющееся в регионе (как сделано в вышеприведенном коде для бумаги формата legal size). Несмотря на это, размеры носителей обычно доступны в панели More Settings (Дополнительные параметры) пользовательского интерфейса печати, в зависимости от того, что поддерживает выбранный принтер, так что пользователи будут иметь доступ к этим настройкам.
Последнее, что хочется упомянуть в связи с вышеприведенным кодом, это то, что у PrintTask есть событие completed, вместе с previewing, progressing, и submitting. Вы можете использовать их для того, чтобы показывать состояние задач печати в вашем приложении, если вы решите это делать. Больше сведений о самой задаче можно получить из ей свойств, которые обычно содержит заданный вам заголовок задачи печати и уникальный ID. Среди всего этого, однако, вы можете отметить бросающееся в глаза отсутствие метода в PrintTask, с помощью которого можно отменить задание. На самом деле, так и есть. Это потому, что модель печати HTML, которую в настоящее время использую приложения для Магазина Windows, написанные на JavaScript, работает по принципу "все или ничего": как только задание попало в подсистему печати, программными средствами его не остановить. Однако, пользователь может пройти в традиционную панель управления принтером и отменить задание там, или вернуться к старому доброму методу вытаскивания бумаги из принтера, но в настоящее время приложения не могут предоставить подобных функций самостоятельно.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.