вторник, 31 марта 2015 г.

Эмулятор принт-сервера

Данный эмулятор (VBS script) предназначен для имитации сетевого принт-сервера и служит для решения проблемы отсутствия драйверов производителя на старый (сетевой, расшаренный) принтер под новые ОС на удаленной машине. В частности - на локальной машине c расшаренным принтером ОС Windows XP x32 и устаревшее железо, на удаленной - ОС Windows 7/8/10 x64 и драйверов под 64 bit не существует, к примеру принтер снят с производства. Также данное решение позволяет вообще не устанавливать драйвера на удаленный принтер в вашей локальной сети и иметь любую целевую ОС, когда печать осуществляется простым копированием нужного документа в PDF-формате или печатью документа любого формата в виртуальный PDF-принтер на сетевую папку машины с работающим эмулятором принт-сервера и локальным 'старым' принтером со 'старой' ОС.


 

Cистемные требования и зависимости:
  1. Windows 9х/NT/XP/Vista/7/8/8.1/10.
  2. Наличие виртуального принтера в PDF-документ на удаленной машине.
  3. Любой принтер на локальной машине.
  4. Расшаренный каталог, скажем 'CanonPrintServ' на локальной машине.
Код VBS-скрипта эмулятора с проверкой по списку печати (добавлен анализ дампа перед новой печатью по дате создания, модификации файла и имени, чтобы он не печатал то, что уже распечатал, если файл по какой-то причине оказался занят и не был удален, пользователи, они всякие бывают):
' Эмулятор принт-сервера
' или решение проблемы отсутствия драйверов на старый (сетевой) принтер под новые ОС, в частности под Windows7 64bit на удаленной машине.

' Системные требования: Win OS (на локальной машине) + виртуальный принтер в PDF (на удаленной), если печать нужна не из PDF.
' Порядок установки и работы с эмулятором:
' 1. Производите копирование каталога 'EmulPrintServ' со всем содержимым на локальный ПК с подключенным принтером на диск 'D' (или другой с коррекцией путей). 
' 2. Каталог 'CanonPrintServ' из каталога 'EmulPrintServ' расшариваете как сетевой.
' 3. Помещаете в автозагрузку и запускаете VBS-скрипт 'print.vbs'.
' 4. На удаленной машине производите подключение каталога 'CanonPrintServ' как сетевого диска (net use \\ip\CanonPrintServ или кому как нравится).
' 5. При необходимости печати документов не PDF формата инсталлируете На удаленной машине виртуальный PDF-принтер.
' 6. На удаленной машине производите печать нужного количества документов (страниц) на виртуальный PDF-принтер в подключенный сетевой диск или просто копируете нужный PDF-документ.
' 7. Скрипт сканирует каталог 'CanonPrintServ' на появление новых PDF-документов, производит их последовательную печать через консоль утилиты 'SumatraPDF.exe' и удаление. Профит :)

' Разработчик: Бадло Сергей Григорьевич
' H-page: http://raxp.radioliga.com


' Месторасположение эмулятора принт-сервера
DirPath = "f:\EmulPrintServ"
' Целевая сетевая папка-сборник файлов для печати
FolderPath = DirPath & "\CanonPrintServ"
' Файл логгирования
Logger = "\print_" & Date & ".log"

' Создаем объект для запуска приложений
set WshShell = WScript.CreateObject("WScript.Shell")
' Создаем объект FSO для работы с файловой системой
Dim ens
Dim datas
Dim FSO
set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next ' ставим перехватчик ошибок, если не удается удалить файл (да и нечего юзверю на ошибки смотреть)
Do ' крутим в бесконечном цикле

    ' чуть еще подождем, чтобы не грузить процессор
    WScript.Sleep 1000 'кол-во миллисекунд

    ' Открываем файл для дозаписи сеансов печати
    Set f = fso.OpenTextFile(FolderPath & Logger, 8, True)

    ' Сканируем целевую сетевую папку-сборник
    Set Files = FSO.GetFolder(FolderPath).Files
    For Each File In Files ' получаем список файлов с расширением PDF
        If LCase(fso.GetExtensionName(file)) = "pdf" Then
   
            ' Получаем дату создания файла и модификации при появл. в каталоге и системного времени
            strTmp = FormatDateTime(file.DateCreated, 2) & String(1,vbTab) & FormatDateTime(file.DateCreated, 3) & String(1,vbTab) & FormatDateTime(file.datelastmodified, 2) & String(1,vbTab) & FormatDateTime(file.datelastmodified, 3) & String(1,vbTab) & file.Name' & vbCrlf

            ' Открываем файл дампа для сканирования сеансов печати
            Set ts = fso.OpenTextFile(FolderPath & Logger, 1)
            ens = 1
            Do While Not ts.AtEndOfStream
             datas = ts.ReadLine
             If datas = strTmp Then
              ens = 0
             End If
            loop
            ts.Close

            ' проверяем на то, что файл с той же датой создания
            ' и исключения зацикливания печати при сканировании целевой папки-сборника

            If ens = 1 Then
             ' найденный PDF пускаем на печать с ожиданием выполнения печати
             WshShell.Run DirPath & "\SumatraPDF.exe -print-to-default " & chr(34) & FolderPath & "\" & file.Name & chr(34), 1, true

             ' Дозапись сеансов печати
             f.WriteLine(strTmp)
            End If

            ' чуть еще подождем, а вдруг :)
            WScript.Sleep 1000 'кол-во миллисекунд
            ' убиваем найденный файл
            file.delete true

        End If
    Next
    ' закрываем файл для дозаписи сеансов печати
    f.Close

Err.Clear
loop
On Error GoTo 0

ПОРЯДОК УСТАНОВКИ И РАБОТЫ С ЭМУЛЯТОРОМ
  1. Производите копирование каталога 'EmulPrintServ' со всем содержимым на локальный ПК с подключенным принтером на диск 'D' (или любой другой с коррекцией путей).
  2. Каталог 'CanonPrintServ' из каталога 'EmulPrintServ' расшариваете как сетевой.
  3. Помещаете в автозагрузку и запускаете VBS-скрипт 'run.vbs' запуска окна консоли эмулятора в скрытом режиме.
  4. На удаленной машине производите подключение каталога 'CanonPrintServ' как сетевого диска (net use \\ip\CanonPrintServ или кому как нравится).
  5. При необходимости печати документов не PDF-формата инсталлируете На удаленной машине виртуальный PDF-принтер, к примеру doPDF.
  6. На удаленной машине производите печать нужного количества документов (страниц) на виртуальный PDF-принтер в подключенный сетевой диск по-умолчанию или просто копируете нужный PDF-документ.
  7. Эмулятор сканирует каталог 'CanonPrintServ' на появление новых PDF-документов, производит их последовательную печать через консоль бесплатной утилиты 'SumatraPDF.exe' https://kjkpub.s3.amazonaws.com/sumatrapdf/rel/SumatraPDF-3.0.zip и последующее удаление с параллельным логгированием действий в файл 'print.log'. 
  8. Замечательно в PostScript то, что можно использовать даже GhostScript 'gswin32c.exe' )
Скорость печати зависит от размера PDF-файла и буфера принтера, чем больше файл, тем дольше накапливается буфер печати. В принципе, при печати на той же машине все тоже самое, если открыть монитор принтера - это накопление видно воочию, как он первый лист отрисовывает в графику, второй, третий. До пяти листов A4 LBP-1120 печатает c ожиданием секунд пять, один-два листа сразу, десяток и более пропорционально, что и неудивительно.

2 комментария:

  1. Если у вас несколько принтеров и нужно послать документ на печать на конкретный принтер, тоже решаемо. Открываем справку https://github.com/sumatrapdfreader/sumatrapdf/wiki/Command-line-arguments. Имеем полезный аргумент -print-to "printer-name". Обратите внимание, для путей содержащих пробелы кавычки обязательны. Напоминаю, для VBS их запись будем через код символа chr(34).

    ОтветитьУдалить
  2. В ходе эксплуатации программного принт-сервера возникла необходимость его использования под virtualXP в VMWare Workstation и была выявлена особенность: утилита командной строки SumatraPDF в виртуальной ОС крэшится при печати, заменил на Foxit portable с параметром /p. Таким образом команда запуска в скрипте будет следущей:
    "foxit reader.exe /p filename.pdf"

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.