Что нового

Автоматическая печать PDF-файлов, появляющихся в определенной папке

The_Immortal

Новичок
Сообщения
84
Репутация
4
Всех приветствую!

Необходимо организовать автоматическую распечатку pdf-файлов, помещаемых в определенную папку, в тихом режиме (с последующем удалением файла). На просторах рунета нашел такое простенькое решение:

Код:
;Папка, в которой скрипт ждет PDF-файлы (к этой папке (папкам) д.б. дан доступ по сети)
$gWatchFolder = "o:\pdfPrint\"

;Основной цикл
While true
   Local $search = FileFindFirstFile($gWatchFolder & "*.pdf")
   If @error Or ($search = -1) Then ContinueLoop
   Local $file = FileFindNextFile($search) 
   PrintFile($gWatchFolder & $file)	  
   Sleep(1000)
WEnd

;Функция печати конкретного pdf-файла
Func PrintFile($pFileName)
   
   $pNewFileName = StringReplace( $pFileName, ".pdf", "_.pdf")
   
   ;Ищем Фоксит ридер
   If FileExists("c:\Program Files\Foxit Software\Foxit Reader\FoxitReader.exe") Then
	  $s = """c:\Program Files\Foxit Software\Foxit Reader\FoxitReader.exe"" /p """ & $pNewFileName & """"
   ElseIf FileExists("c:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe") Then
	  $s = """c:\Program Files (x86)\Foxit Software\Foxit Reader\FoxitReader.exe"" /p """ & $pNewFileName & """"
   Else
	  MsgBox(4096, "Не установлена программа FoxitReader!", "FoxitReader.exe does NOT exists")
	  Exit
   EndIf

   ;Попытаемся переимновать файл, чтобы определить, дозаписан ли он до конца.
   If FileMove($pFileName, $pNewFileName) Then
	  
	  ;запускаем печать pdf через Фоксит Ридер и ждём, когда процесс завершится
	  Local $PID = Run($s)
	  ProcessWaitClose($PID)
	  
	  ;удаляем файл, чтобы он повторно не печатался
	  If Not FileDelete($pNewFileName) Then
		 msgbox(1,"","Не удалось удалить файл " & $pNewFileName & " ! Зовите системного администратора!")
		 Exit
	  EndIf
	  
   EndIf
   
EndFunc


Все бы хорошо, но при таком подходе каждый раз при появлении pdf-файла в целевой папке открывается FoxitReader и пока ты его не закроешь файл из папки не удалится, т.е. условие "тихого режима" не выполняется. Я сделал в конце так:
Код:
;запускаем печать pdf через Фоксит Ридер, даем 5 секунд на ожидание и завершаем процесс
	  Local $PID = Run($s)
	  Sleep(5000)
	  ProcessClose($PID)

Конечно, время 5 секунд спорно (ибо бывают тяжелые файлы), но без задержки не знаю как обойтись.

Но проблема в том, что даже так процесс автоматически не убивается.
С чем это может быть связано?

Спасибо!
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
У меня Foxit Reader версии 6.0.2 с этим скриптом работает нормально. Окно ридера не появляется, процесс сам завершается. Проверял на встроенном в Win7 псевдо-принтере "Microsoft XPS Document Writer".
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Попробуйте функцию
Код:
WinClose()
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
[?]
Но проблема в том, что даже так процесс автоматически не убивается.
Наврал... С ProcessClose Фоксит конечно же убивается. У меня было просто несколько разных копий скрипта запущено, вот я и запутался.

InnI, [?]
Окно ридера не появляется, процесс сам завершается.
Вы использовали изначальный скрипт (с ProcessWaitClose) ?

У меня окно FoxitReader'а в любом случае появляется (версия 7.2.2, последняя). Попробую более старую версию...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
The_Immortal
версия 7.2.2, последняя
Скачал последнюю 7.2.5. Действительно, окно появляется и самостоятельно закрываться не хочет. Закрыть-то его легко, только вот как определить завершение печати - непонятно.

Попробую более старую версию
Если вам не принципиально чем печатать, попробуйте Sumatra PDF с параметрами -exit-on-print -print-to-default <путь_к_файлу.pdf>
Код:
If FileExists("C:\Downloads\SumatraPDF.exe") Then
      $s = """C:\Downloads\SumatraPDF.exe"" -exit-on-print -print-to-default """ & $pNewFileName & """"
Печатает раза в два дольше по сравнению с FoxitReader'ом. Зато есть портабельная (не требующая установки) версия.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
Ребят, а не подскажите, в каком направлении копать, чтобы оформить такое же только для doc, docx, xls, xlsx, jpg, png, bmp файлов? Или это посредством AutoIt не реализовать?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
The_Immortal
чтобы оформить такое же
Цель данного скрипта в том, чтобы запустить программу с параметрами печати в командной строке и передать ей путь к файлу. Вот и ищите программы, которые могут распечатать нужный вам тип файла из командной строки.
 
Автор
T

The_Immortal

Новичок
Сообщения
84
Репутация
4
InnI, [?]
Цель данного скрипта в том, чтобы запустить программу с параметрами печати в командной строке и передать ей путь к файлу.
Понятно.
Я нашел универсальную программу для этого дела - 2Printer. Да вот только бесплатная версия имеет свои недостатки... А вот аналогов, увы, такому нету (ну или я не нашел).
А так, doc/docx можно распечатывать вот так:
Код:
WINWORD.EXE "c:\1.doc" /q /n /mFilePrintDefault /mFileExit
xls/xlsx - через VBS-скрипт (можно найти на просторах рунета)
А вот касательно картинок ничего не обнаружил... Пока искал, то наткнулся на 2Printer, который печатает всё подряд (pdf, офисные файлы, картинки).

P.S. Оставил это на всякий случай.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
The_Immortal
касательно картинок ничего не обнаружил
Даже Paint это умеет
Код:
C:\Windows\System32\mspaint.exe /p <путь_к_файлу>
А ещё есть такие "монстры", как IrfanView и XnView.
Но, как-то это всё совсем не по теме...
 
Верх