Бортовой журнал Ктулху

Автоматическая печать из папки

Навеяно вот этой статьей.

Возникла необходимость печатать из-под линукса на вин-принтере Canon MF3228. Драйверов, соответственно, нет. Гуглеж выдавал очень много бесполезных результатов.

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

На компьютере должен быть установлен Foxit Reader.

Файл со скриптом можно поместить в любое удобное место. Скрипт добавляется в автозапуск Windows, запускается и висит все время в памяти. 

В специально указанной папке постоянно проверяется наличие файлов, в этом случае *.pdf. Как только файл там появляется, скрипт отправляет его в печать на принтер, установленный по умолчанию.

Первый документ печатался без проблем, иногда и второй. Но обычно после первого скрипт зависал или работал некорректно (с VB дел не имел и желания особого нет).

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

 

Так как я с VB дел не имел, пришлось подступиться к проблеме с другой стороны, т.е. гору тащить к Магомету, а именно: с помощью планировщика бороться с глюками, вызываемыми работой скрипта.

 

Скрипт запускается и висит в памяти.

 

Выдержка из статьи: "

 'On Error Resume Next
'Автоматическая печать PDF-файлов, появляющихся в определенной папке
'Глобальные переменные
Set gFSO = CreateObject("Scripting.FileSystemObject")
Set gShell = CreateObject("WScript.Shell")
'Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
gWatchFolder = "D:\share_print\"
'Основной цикл
While true
 Set lFolder = gFSO.GetFolder(gWatchFolder)
 Set lFiles = lFolder.Files
 For Each lFile In lFiles
  PrintFile(gWatchFolder & lFile.Name)
 Next
 WScript.Sleep(1)
WEnd
 
'Функция печати конкретного pdf-файла
Sub PrintFile(pFileName)
 'Ждем некоторе время (пока файл до конца запишется) 
 WScript.Sleep(3)
 'msgbox(pFileName)
 'Мы (больше) не боимся пробелов :Р
 s = """C:\Program Files\Foxit Software\Foxit Reader\Foxit Reader.exe"" /p """ & pFileName & """"
 'msgbox (s)
 Call gShell.Run(s,0,true)
 gFSO.DeleteFile(pFileName)
 If gFSO.FileExists(pFileName) Then
  'Мало ли чего может случиться, лучше пусть у Иван Иваныча перестанет печатать, чем один файл много раз уйдет на принтер
  'msgbox("Не удалось удалить файл " & pFileName & "! Позвоните Василию по т. 123-456)
  WScript.Quit
 'Else
  'Пока не реализовано
  'ToLog("Файл " & lFileName & " удален.")
 End If
End sub

 

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

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

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

"

Как видно, ничего особо сложного нет, но не было бы так сложно, если бы было так просто. Скрипт периодически вызывает ошибку Foxit Reader`а, разбираться с которой очень не хочется, поэтому было принято решение на скрипт влиять извне. Планировщик http://www.xstarter.com/rus/ очень сильно в этом помог.

Для начала на компьютере должны быть установлены такие программы: Foxit Reader и Xstarter, VB-скрипт, который сканирует папку на наличие файлов (скрипт во вложении - print.vbs.zip).

Первая показывает PDF, вторая запускает задания по расписанию и борется с последствиями работы скрипта.

Для корректной работы всего этого комбайна необходимо быть залогиненным в какую-либо учетную запись и должен быть установлен принтер по умолчанию, на который будет отправляться печать или xstarter должен быть запущен в качестве системной службы.

В главном окне видим дерево задач. Останавливаем все лишние, создаем новое задание.

Устанавливаем в календаре время и периодичность запуска.

Во вкладке "действия" видим очередное дерево со списком всевозможных действий.

В данном случае необходимо прибивать фоксит, который периодически зависает.

 

Вложения:
ФайлОписаниеРазмер файла:
Скачать этот файл (print.vbs.zip)print.vbs.zip 0.8 Кб