Драйвер виртуального принтера для Windows
Не могли бы вы помочь мне со следующими вопросами...
- Если мне нужен виртуальный принтер, который преобразует поток PostScript в другой формат, должен ли я реализовать виртуальный принтер с нуля или внедрить плагин рендеринга?
- Кажется, плагин рендеринга поддерживает только определенные настройки. Также данные неизменно отправляются в спулер, который в этом случае не нужен.
- Если я реализую драйвер виртуального принтера, он полностью заменит драйвер Microsoft PostScript или универсальный драйвер Microsoft?
- Поскольку мой драйвер виртуальный, имеет ли значение, если я пишу PostScript-совместимый или Universal Driver-совместимый?
- Любой другой метод для преобразования печатного документа в пользовательский формат документа, кроме реализации драйвера виртуального принтера? Могу ли я подключиться как монитор порта или что-то? Из того, что я мог понять, я думаю, нет.
4 ответа
Вам нужен монитор порта. Вы можете создать виртуальный принтер с помощью драйвера Microsoft Postscript, который находится в WDK. Вам не нужно предоставлять какой-либо код для этой части, просто файл INF и PPD для описания вашего виртуального принтера. После того, как у вас все заработает и будет установлено, пользователи увидят ваш виртуальный принтер при печати из приложения. Этот принтер будет генерировать поток Postscript, как любой стандартный принтер Postscript, который затем будет отправлен на монитор порта принтера.
Теперь добавьте монитор порта, чтобы обработать преобразование потока Postscript в любой нужный вам формат. С мониторами портов работать значительно проще, чем с драйверами печати.
РЕДАКТИРОВАТЬ: Энди указывает в комментариях, что драйверы печати v4 (то есть, Win8) не поддерживают мониторы пользовательских портов. Тем не менее, драйверы v3 все еще будут работать в Win8.
Я знаю, что это старо, но эти ответы помогли бы мне пару месяцев назад, когда я начал этот проект. Я потратил много времени на создание монитора порта, но в конце концов нашел гораздо более простой метод (см. Ссылку WritePrinter ниже).
Если мне нужен виртуальный принтер, который преобразует поток PostScript в другой формат, должен ли я реализовать виртуальный принтер с нуля или внедрить плагин рендеринга?
Плагин рендеринга - это то, что вы хотите.
Кажется, плагин рендеринга поддерживает только определенные настройки.
Правильно - вам придется решить, достаточно ли это для вас.
Также данные неизменно отправляются в спулер, который в этом случае не нужен.
Это не должно быть проблемой.
Если я реализую драйвер виртуального принтера, он полностью заменит драйвер Microsoft PostScript или универсальный драйвер Microsoft?
Если вы реализуете плагин рендеринга, он не заменяет драйверы PS/Uni. Драйверы PS/Uni фактически используются огромным количеством (возможно, 90%?) Всех "драйверов принтеров". OEM-производители, которые делают принтеры, не хотят писать свои собственные драйверы, поэтому они используют дизайн драйверов PS/Uni - некоторые создают плагины пользовательского интерфейса, некоторые плагины рендеринга, некоторые оба, некоторые нет.
Поскольку мой драйвер виртуальный, имеет ли значение, если я пишу PostScript-совместимый или Universal Driver-совместимый?
Это зависит от того, в каком формате вы хотите данные. Если вы хотите растровый формат, драйвер Uni лучше, если вы хотите формат PostScript, PS лучше. Если вам нужны данные для каждой нарисованной линии, вывода текста и других операций GDI, то все в порядке.
Любой другой метод для преобразования печатного документа в пользовательский формат документа, кроме реализации драйвера виртуального принтера? Могу ли я подключиться как монитор порта или что-то? Из того, что я мог понять, я думаю, нет.
Большинство людей, которым нужен необработанный доступ к данным PostScript, обычно использующим GhostScript для преобразования в PDF или другой формат, используют для этого монитор портов. Например, Virtual PDF Printer, поставляемый Adobe с полной версией Acrobat (Writer), использует монитор порта, а также плагин рендеринга и плагин пользовательского интерфейса для драйвера PSCRIPT5.
Проблема с монитором порта заключается в том, что он не работает в контексте пользователя, а не в контексте приложения / процесса, выполняющего печать. Он работает в контексте диспетчера очереди печати и требует много хаков, чтобы выяснить, какой пользователь / сеанс выполняет печать.
Если вы хотите, чтобы растровые данные сохранялись, например, в формате JPG/BMP/PNG, просто создайте плагин рендеринга для универсального драйвера принтера и получите доступ к / сохранить растровые данные в IPrintOemUni:: FilterGraphics.
Если вы хотите, чтобы данные PostScript использовались с GhostScript (или другой библиотекой, или вашим собственным кодом) для преобразования в PDF или другие форматы, просто создайте плагин рендеринга для драйвера PSCRIPT5 и получите доступ к / сохраните данные PS внутри IPrintOemUni2:: WritePrinter.
В любом случае вам нужен плагин рендеринга. Если вы хотите легко отображать пользовательский интерфейс во время печати и хотите, чтобы ваш код выполнялся в том же контексте, что и пользователь, а не в службе спулера, убедитесь, что вы установили принтер для печати непосредственно на принтер - обходите спулер. Если вы используете AddPrinter для установки принтера, вы должны использовать флаг PRINTER_ATTRIBUTE_DIRECT.
Не уверен, что я полностью понимаю. У вас есть приложение, которое производит Postscript, и вы хотите преобразовать это в что-то еще? Если приложение выводит данные "готово к печати", то новый драйвер принтера не поможет, поскольку "очередь / драйвер" - это просто способ передачи данных на принтер, а не то, что создает выходной файл.
Вы могли бы быть лучше, чтобы посмотреть на что-то вроде: Redmon
Это может взять вывод и породить новый процесс. Идея состоит в том, что он выводит Postscript в файл, а затем запускает консольный.exe, который вы создаете для него.
Просто мысль.
Опять же, не уверен, каким образом вы это делаете, но ghostscript - это самый простой способ конвертировать вывод PS в любой другой формат. Также довольно легко написать свой собственный формат вывода для ghostscript.
Все это происходит на уровне приложения - не нужно писать драйвер.