Драйвер виртуального принтера для Windows - PullRequest
6 голосов
/ 03 февраля 2010

Не могли бы вы помочь мне со следующими вопросами ...

  • Если мне нужен виртуальный принтер, который преобразует поток PostScript в другой формат, должен ли я реализовать виртуальный принтер с нуля или внедрить плагин рендеринга?
  • Плагин рендеринга поддерживает только определенные настройки. Также данные неизменно поступают в спулер, который в этом случае не нужен.
  • Если я внедряю драйвер виртуального принтера, он полностью заменяет драйвер Microsoft PostScript или универсальный драйвер Microsoft?
  • Поскольку мой драйвер виртуальный, имеет ли значение, если я пишу PostScript-совместимый или Universal Driver-совместимый?
  • Есть ли другой способ преобразования печатного документа в пользовательский формат документа, кроме реализации драйвера виртуального принтера? Могу ли я подключиться как монитор порта или что-то? Из того, что я мог понять, я думаю, нет.

Ответы [ 4 ]

7 голосов
/ 21 июля 2011

Вам нужен монитор порта.Вы можете создать виртуальный принтер с помощью драйвера Microsoft Postscript, который находится в WDK.Вам не нужно предоставлять какой-либо код для этой части, просто файл INF и PPD для описания вашего виртуального принтера.После того, как у вас все заработает и будет установлено, пользователи увидят ваш виртуальный принтер при печати из приложения.Этот принтер будет генерировать поток Postscript, как любой стандартный принтер Postscript, который затем будет отправлен на монитор порта принтера.

Теперь добавьте монитор порта для обработки преобразования потока Postscript в любой нужный вам формат.С мониторами портов работать значительно проще, чем с драйверами печати. ​​

РЕДАКТИРОВАТЬ: Энди отмечает в комментариях, что драйверы печати v4 (т.е. Win8) не поддерживают пользовательские мониторы портов.Тем не менее, драйверы v3 по-прежнему будут работать в Win8.

3 голосов
/ 29 августа 2013

Я знаю, что это старо, но эти ответы помогли бы мне пару месяцев назад, когда я начал этот проект. Я потратил много времени на создание монитора порта, но в конце концов нашел гораздо более простой метод (см. Ссылку WritePrinter ниже).

Если мне нужен виртуальный принтер, который преобразует поток PostScript в другой формат, я должен реализовать виртуальный принтер из поцарапать или реализовать плагин рендеринга?

Плагин рендеринга - это то, что вам нужно.

Плагин рендеринга поддерживает только определенные настройки.

Правильно - вам придется решить, достаточно ли это для вас.

Также данные неизменно отправляются в спулер, который не нужен в это дело.

Это не должно быть проблемой.

Если я реализую драйвер виртуального принтера, он полностью заменит Драйвер Microsoft PostScript или универсальный драйвер Microsoft?

Если вы реализуете плагин рендеринга, он не заменяет драйверы PS / Uni. Драйверы PS / Uni фактически используются огромным количеством (возможно, 90%?) Всех «драйверов принтеров». OEM-производители, которые производят принтеры, не хотят писать свои собственные драйверы, поэтому они используют дизайн драйверов PS / Uni - некоторые создают плагины UI, некоторые плагины рендеринга, некоторые оба, некоторые нет.

Поскольку мой драйвер виртуальный, имеет ли значение, если я пишу PostScript совместимый или универсальный драйвер совместимый?

Это зависит от того, в каком формате вы хотите данные. Если вы хотите растровый формат, драйвер Uni лучше, если вы хотите формат PostScript, PS лучше. Если вам нужны данные для каждой нарисованной линии, вывода текста и других операций GDI, то все в порядке.

Любой другой метод преобразования печатного документа в пользовательский документ. формат, кроме реализации виртуального драйвера принтера? Могу ли я зацепить как монитор порта или что-то? Из того, что я мог понять, я думаю, нет.

Большинство людей, которым нужен необработанный доступ к данным PostScript, обычно использующим GhostScript для преобразования в PDF или другой формат, используют для этого монитор портов. Например, виртуальный принтер PDF, поставляемый Adobe с полной версией Acrobat (Writer), использует монитор порта, а также плагин рендеринга и плагин пользовательского интерфейса для драйвера PSCRIPT5.

Проблема с монитором порта заключается в том, что он не работает в контексте пользователя, а не в контексте приложения / процесса, выполняющего печать. Он работает в контексте диспетчера очереди печати и требует много хаков, чтобы выяснить, какой пользователь / сеанс выполняет печать.

Если вы хотите, чтобы растровые данные сохранялись, например, в формате JPG / BMP / PNG, просто создайте плагин рендеринга для универсального драйвера принтера и получите доступ к / сохранить растровые данные внутри IPrintOemUni :: FilterGraphics .

Если вы хотите, чтобы данные PostScript использовались с GhostScript (или другой библиотекой, или вашим собственным кодом) для преобразования в PDF или другие форматы, просто создайте плагин рендеринга для драйвера PSCRIPT5 и получите доступ к данным PS и сохраните их внутри IPrintOemUni2 :: WritePrinter .

В любом случае вам нужен плагин рендеринга. Если вы хотите легко отображать пользовательский интерфейс во время печати и хотите, чтобы ваш код выполнялся в том же контексте, что и пользователь, а не в службе спулера, то убедитесь, что вы установили принтер для печати непосредственно на принтер - обходите спулер. Если вы используете AddPrinter для установки принтера, вы должны использовать флаг PRINTER_ATTRIBUTE_DIRECT .

1 голос
/ 12 февраля 2010

Не уверен, что полностью понимаю. У вас есть приложение, которое производит Postscript, и вы хотите преобразовать это в что-то еще? Если приложение выводит данные «готово к печати», то новый драйвер принтера не поможет, поскольку «очередь / драйвер» - это просто способ передачи данных на принтер, а не то, что создает выходной файл.

Возможно, вам лучше всего взглянуть на что-то вроде: Redmon

Это может взять вывод и запустить новый процесс. Идея состояла бы в том, чтобы он вывел PostScript-файл в файл, а затем запустил какой-то консоль .exe, созданный для него.

Просто мысль.

0 голосов
/ 23 марта 2010

Опять же не уверен, в какую сторону вы это делаете, но ghostscript - это самый простой способ конвертировать вывод PS в любой другой формат.Также довольно просто написать свой собственный формат вывода для ghostscript.

Все это происходит на уровне приложения - не нужно писать драйвер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...