Мне нужно указать драйверу принтера, чтобы он запустил подачу страницы.
я печатаю прямо на принтер, используя:
набор вызовов API.
Во многом источником вдохновения послужил KB138594 - HOWTO: отправка необработанных данных на принтер с помощью Win32 API < / а>. В этой статье базы знаний важно отметить, что они (и мой скопированный код) запускают документ в режиме RAW
:
// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "RAW";
StartDocPrinter(hPrinter, 1, docInfo);
Примечание. Режим
RAW
(в отличие от режимаTEXT
) означает, что мы отправляем необработанные байты в драйвер принтера. Мы обещаем говорить на том языке, который он понимает.
Затем мы можем использовать WritePrinter
, чтобы написать все, что захотим:
WritePrinter(hPrinter, "Hello, world!"); //note, extra parameters removed for clarity
WritePrinter(hPrinter, 0x0c); //form-feed
Проблема здесь в символе подачи страницы 0x0c
. Поскольку мы открыли принтер в RAW
режиме, мы обещаем, что отправим байты драйвера принтера, которые он сможет обработать. Драйверы большинства принтеров принимают 0x0C
, что означает, что вы хотите выполнить подачу страницы.
Проблема в том, что другие принтеры (принтер PDF, принтеры Microsoft XPS) ожидают, что задания на печать в формате RAW будут выполняться на их собственном языке принтера. Если вы используете вышеуказанное для печати на принтере XPS или PDF: ничего не происходит (т.е. нет диалогового окна сохранения, ничего не печатается).
я попросил решение на этот вопрос некоторое время назад, и был получен ответ, что вам необходимо изменить режим документа с RAW
:
docInfo.pDatatype = "RAW";
to TEXT
:
docInfo.pDataType = "TEXT";
Вероятно, это связано с тем, что вы отправляете данные в формате «RAW» непосредственно на принтер, а RAW может быть любым PDL. Но драйвер XPS, вероятно, понимает только XPS и, вероятно, просто проигнорирует ваш PDL "unknown: Hello, world! 0xFF". Драйвер XPS, вероятно, будет принимать данные XPS только тогда, когда вы пишете прямо в него.
Если вы хотите отобразить текст в драйвере XPS, вам следует использовать GDI. Если в качестве типа данных вы укажете «ТЕКСТ», вы можете отправить драйвер в виде обычного текста. Процессор печати, подключенный к драйверу, затем «преобразует» для вас открытый текст, передав задание драйверу через GDI.
Чтобы это сработало, я изменил свой код, чтобы объявить документ печати как TEXT
:
// Fill in the structure with info about this "document."
docInfo.pDocName = "My Document";
docInfo.pOutputFile = NULL;
docInfo.pDatatype = "TEXT";
StartDocPrinter(hPrinter, 1, docInfo);
WritePrinter(hPrinter, "Hello, world!");
WritePrinter(hPrinter, 0x0c); //form-feed
Затем появляется диалоговое окно Сохранить как для принтеров XPS и PDF, и оно правильно сохраняется. И я думал, что все исправлено.
За исключением нескольких месяцев, когда я попытался напечатать на ‹quote> реальном ‹/quote> принтере: подачи формы не происходит - предположительно потому, что я больше не печатаю в режиме «сырые команды принтера».
Итак, что мне нужно, так это способ создания фида в стиле Windows. Мне нужен вызов API, который сообщит драйверу принтера, что я хочу, чтобы принтер выполнял подачу страницы.
Мой вопрос: как указать принтеру, что нужно подавать форму во время печати?
Справочная информация о типах данных
Процессор печати сообщает диспетчеру очереди печати изменить задание в соответствии с типом данных документа. Он работает вместе с драйвером принтера для отправки заданий печати из буфера с жесткого диска на принтер.
Поставщики программного обеспечения иногда разрабатывают собственные процессоры печати для поддержки пользовательских типов данных. Обычно процессор печати не требует каких-либо настроек или вмешательства со стороны администраторов.
Типы данных
Процесс печати Windows обычно поддерживает пять типов данных. Два наиболее часто используемых типа данных, расширенный метафайл (EMF) и готовность к печати (RAW), по-разному влияют на производительность как на клиентском компьютере, так и на компьютере-сервере печати.
RAW
- это тип данных по умолчанию для клиентов, отличных от программ для Windows. Тип данных RAW указывает диспетчеру очереди печати вообще не изменять задание печати перед печатью. При использовании этого типа данных весь процесс подготовки задания на печать выполняется на клиентском компьютере.
EMF
, или расширенный метафайл, является типом данных по умолчанию для большинства программ на базе Windows. С помощью EMF напечатанный документ преобразуется в формат метафайла, который более портативен, чем файлы RAW, и обычно может быть распечатан на любом принтере. Файлы EMF обычно меньше файлов RAW, содержащих то же задание на печать. Что касается производительности, то только первая часть задания на печать изменяется или отображается на клиентском компьютере, но большая часть воздействия приходится на компьютер сервера печати, который также помогает приложению на клиентском компьютере быстрее возвращать управление пользователю.
В следующей таблице (взято из MSDN) показаны пять различных типов данных. поддерживается процессором печати Windows по умолчанию:
Тип данных: RAW
Указания к диспетчеру очереди печати: распечатать документ без изменений.
Использование: это тип данных для все клиенты не на винде.
Тип данных: RAW [FF appended]
Указания к диспетчеру очереди: добавьте символ подачи страницы (0x0C), но не вносите никаких других изменений. (Принтер PCL пропускает последнюю страницу документа, если нет завершающей подачи формы.)
Использование: требуется для некоторых приложений. Windows не назначает его, но его можно установить по умолчанию в диалоговом окне «Обработчик печати».
Тип данных: RAW [FF auto]
Указания к диспетчеру очереди: проверьте наличие завершающего канала формы и добавьте его, если его еще нет, но не вносите никаких других изменений.
Использование: требуется для некоторых приложений. Windows не назначает его, но его можно установить по умолчанию в диалоговом окне «Обработчик печати».
Тип данных: NT EMF 1.00x
Указания к диспетчеру очереди. Считайте документ расширенным метафайлом (EMF), а не данными RAW, которые выводит драйвер принтера.
Использование: документы EMF создаются Windows.
Тип данных: TEXT
Указания к диспетчеру очереди. Обработайте все задание как текст ANSI и добавьте спецификации печати, используя заводские настройки устройства печати. Использование: это полезно, когда задание печати представляет собой простой текст, а целевое печатающее устройство не может интерпретировать простой текст.
Вы можете увидеть процессоры печати, доступные для принтера, и типы данных, которые поддерживает каждый процессор, через свойства принтера на панели управления: