Что нового

Как отправить PDF-файлы на печать

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем доброго времени суток.
Подскажите как надежно отправить определенные файлы PDF из указанного каталога на печать с возможностью обработки ошибок, удалось/не удалось

Сделал простой автоматизацией через Adobe reader 11 и ShellExecute...
В принципе работает, но не надежно, ShellExecute не всегда открывает файл итд...

Код:
; Подключаем необходимые библиотеки
	#include <Array.au3>
	#include <File.au3>

	AutoItSetOption('WinTitleMatchMode',-2)
	$KatRep='d:\rep'

; Считываем файлы в массив согласно шаблону
	$aFiles=_FileListToArray($KatRep,'Реестр - Д*')

For $i=1 To $aFiles[0]
	$ReesrName=$aFiles[$i]
	PDFtoDefaultPrinter($ReesrName) 	; Печать Реестра
Next



; Печать PDF-файла на принтер по умолчанию
Func PDFtoDefaultPrinter($PDFName)
	$PDFName=StringLower($PDFName) 		; Переводим в нижний регистр
	ShellExecute($PDFName,'',$KatRep)	; Открыть PDF-файл Adobe reader 11

	WinWaitActive($PDFName) ; Дожидаемся активности окна
	Sleep(300)
	Send('^p')				; Вызываем меню печати CTRL+P

	WinWaitActive('печать')	; Дожидаемся активности окна
	ControlClick('Печать','','[CLASS:Button; INSTANCE:47]')	; жмем кнопку "Печать"

; Ждем закрытия окна, чтобы завершить функцию
	WinWaitActive('выполнение')	; Дожидаемся активности окна
	While 1
		If Not WinExists ('выполнение') Then ExitLoop ; Проверяет, существует ли указанное окно.
	WEnd

	WinClose($PDFName)
	MsgBox(0,'','Выполнено '&$PDFName,5)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
с официального форума
Код:
$oShell = ObjCreate("Shell.Application")
$sFullPath = @DesktopDir
$sFile = "Proof.pdf"
 
If FileExists($sFullPath) Then
   $oFolder = $oShell.Namespace($sFullPath)
   $oItem = $oFolder.ParseName($sFile)
EndIf
 
$oItem.InvokeVerbEx("Print")
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner, для меня очень важен порядок печати PDF-файлов, так как это единый отчет, и он должен быть распечатан последовательно.
Делаю так:
Код:
Global $KatRep='d:\rep'
   $oShell = ObjCreate("Shell.Application")
 PDFtoDefaultPrinter('Документ - Д232001.pdf')
 PDFtoDefaultPrinter('Документ - Д232002.pdf')
 PDFtoDefaultPrinter('Документ - Д232003.pdf')
 PDFtoDefaultPrinter('Документ - Д232004.pdf')


; Печать PDF-файла на принтер по умолчанию
Func PDFtoDefaultPrinter($PDFName)
   $oFolder = $oShell.Namespace($KatRep)
   $oItem = $oFolder.ParseName($PDFName)
   $oItem.InvokeVerbEx("Print")
EndFunc


Или так:
Код:
$strPath = "D:\rep"
 $objShell = ObjCreate("Shell.Application")

 PDFtoDefaultPrinter('Документ - Д232001.pdf')
 PDFtoDefaultPrinter('Документ - Д232002.pdf')
 PDFtoDefaultPrinter('Документ - Д232003.pdf')
 PDFtoDefaultPrinter('Документ - Д232004.pdf')


Func PDFtoDefaultPrinter($strFile)

 $objFolder = $objShell.NameSpace($strPath)
 $objShell.ShellExecute ($strFile, "", $strPath, "print", 0)
EndFunc

В результате, отправленные файлы выстраиваются в список заданий случайным образом, что для меня не допустимо, например так:
Документ - Д232001.pdf'
Документ - Д232004.pdf'
Документ - Д232002.pdf'
Документ - Д232003.pdf'

Как это можно исправить?
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Может ЭТО поможет?
Сперва склеить в один файл, потом отправить на печать.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
edyapd склеивать не вариант, там 240 файлов, печати на 6 коробок
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Тогда остаётся разбираться только с этим. И отправлять следующий документ после того, как будет напечатан предыдущий.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
И отправлять следующий документ после того, как будет напечатан предыдущий.

В этом и проблема, КАК? Все должно печататься в автоматическом режиме. Программа должна выждать пока задание полностью не загрузится, и только потом обработать следующее
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
edyapd за ссылочку конечно спасибо :smile:
Но перевести все это в код AUTOIT не 5 минутное дело.
Мне бы больше помогло уже адаптированное решение
 
Верх