вторник, 1 апреля 2014 г.

Универсальное решение для печати на сетевые принтеры под Windows 7/Vista/2003/2008

Очень часто возникают проблемы при сетевой печати на принтеры, подключенные
например, к компьютеру с Windows XP на компьютере с установленной ОС Window 7,ненаVista,2003,2008

Суть проблемы часто заключается в том, что под эти «современные» системы производители
«устаревших» моделей принтеров не удосуживаются выпускать драйверы.

Вот и у меня сложилась такая ситуация:

Знакомый попросил настроить печать в офисе со свежекупленного ноутбука.

1. Конечно же — ноутбук был с операционной Windows 7
2. Конечно же — Home (см. ниже в чем проблема)
3. Конечно же — она (система) была 64-х разрядной.
4. Конечно же — принтеры в оффисе были не новые: HP1320 и Canon MFxxxx
5. Конечно же — принтеры были подключены и «расшарены» на машинках с WinXP.
6. И никто не будет менять структуру сети ради одного ноутбука
Как же я решил проблему?
Сначала я пошел по неправильному пути:
Скачивал и пытался установить драйверы с официальных сайтов — не тут-то было:
Компания Canon вообще мало для каких моделей поставляет драйверы под 64-х разрядные системы.
Про МФУ вообще молчу.
Для серии MFxxxx рекомендовали костыль — использовать драйверы от серии MF57xx. Попробовал — система 
показывает что драйвер подписан, но отказыватеся устанавливать, ссылаясь на то что он не подписан.
Брр, бред. Установку неподписанных дров на Home разрешит нельзя (нет gpedit.msc). Тьфу.

Компания HP вроде бы и предоставила драйвер PCL5 для модели HP1320 — но — не заработало.
При попытке установки выдавались невразумительные ошибки, гуглёж которых находил 
таких же бедолаг как и я.

Особенно улыбнул один комментарий на форуме (не помню точно где, но по-моему на сайте HP):
«HP1320 — бизнес-модель, поэтому мы не предоставляем поддержки по телефону в выходные дни»

Кстати, мошенники лезут во все щели как тараканы: вы всегда можете «нагуглить» и скачать ЛЮБОЙ
драйвер любого принтера под любую систему. Но результат будет конечно же, не тот, что ожидается.

Также «гуглёж» открыл мне еще один страшный факт: ДО СИХ ПОР в серверных операционках известной
компании ЕСТЬ проблемы с подсистемой печати в терминальном режиме. И даже сторонние 
решения не решают проблем окончательно. 

«Хватит заниматья ерундой» — подумал я и сделал так:

1. Скачал виртуальный Free PDF Printer с сайта www.bullzip.com. Их (PDF-принтеров) вообще много, просто мой выбор пал на него по следующим причинам:
а) данный работает под 64х разрядными системами 
б) бесплатный (в принципе не жалко было бы отдать и ~20 баксов, НО не отдавать же их
за КАЖДЫЙ компьютер с Windows 7 64x!)
в) он нашелся первым :)
2. Установил виртуальный PDF-принтер и настроил его (C:\Program Files\Bullzip\PDF Printer\gui.exe) так, чтобы пользователю не выдавалось никаких диалоговых окон, а в папке \\compxp\printer1\ создавался файл .pdf
3. На компьютере compxp установил Foxit Reader «расшарил» папочку printer1 и поместил в автозагрузку простенький vbs-скрипт:


Copy Source | Copy HTML
  1. 'On Error Resume Next
  2. 'Автоматическая печать PDF-файлов, появляющихся в определенной папке
  3. 'Глобальные переменные
  4. Set gFSO = CreateObject("Scripting.FileSystemObject")
  5. Set gShell = CreateObject("WScript.Shell")
  6. 'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
  7. gWatchFolder = "E:\master\printer\"
  8. 'Основной цикл
  9. While true
  10.  Set lFolder = gFSO.GetFolder(gWatchFolder)
  11.  Set lFiles = lFolder.Files
  12.  For Each lFile In lFiles
  13.   PrintFile(gWatchFolder & lFile.Name)
  14.  Next
  15.  WScript.Sleep(1)
  16. WEnd
  17.  
  18. 'Функция печати конкретного pdf-файла
  19. Sub PrintFile(pFileName)
  20.  'Ждем некоторе время (пока файл до конца запишется) 
  21.  WScript.Sleep(3)
  22.  'msgbox(pFileName)
  23.  'Мы (больше) не боимся пробелов :Р
  24.  s = """E:\master\foxit\Foxit Reader.exe"" /p """ & pFileName & """"
  25.  'msgbox (s)
  26.  Call gShell.Run(s,0,true)
  27.  gFSO.DeleteFile(pFileName)
  28.  If gFSO.FileExists(pFileName) Then
  29.   'Мало ли чего может случиться, лучше пусть у Иван Иваныча перестанет печатать, чем один файл много раз уйдет на принтер
  30.   'msgbox("Не удалось удалить файл " & pFileName & "! Позвоните Василию по т. 123-456)
  31.   WScript.Quit
  32.  'Else
  33.   'Пока не реализовано
  34.   'ToLog("Файл " & lFileName & " удален.")
  35.  End If
  36. End sub


За скрипт прошу не пинать — писался быстро и чтоб заработало.

Вуаля:
Пользователь просто нажимает в программе кнопку «Печать» — и через минуту забирает из принтера документ.
Виртуальных принтеров можно установить несколько и обозвать их произвольно. Главное — при переименовании принтера настройки нужно производить заново.

Дополнительный профит от такого решения:
Для особо параноидальных начальников хитрый админ может наваять целую систему протоколирования
печати со складыванием в архив всего, что распечатали работники.

P.S. Те, кто ненавидит adobe могут сделать связку bullzip->BMP(JPG)->irfan — но возникнут проблемы с ландшафтной ориентацией (надо будет в скрипте определять ориентацию).


за статью спасибо: http://habrahabr.ru/post/112404/