- Сообщения
- 3,561
- Репутация
- 629
- Версия AutoIt
- 3.3.12.0
- Версия
- 0.1
Для отправки на печать используется FoxitReader.exe. Для преобразования файлов - pdftk.exe - бесплатная утилита, которая склеивает файлы pdf, извлекает нужные страницы и т.д.
Сайт pdftk
Для работы требуются: pdftk.exe и libiconv2.dll. Качаем с сайта PDFtk Free, устанавливаем и извлекаем из папки установки нужные файлы. Потом программу можно удалить.
В итоге мы получаем приложение, для работы которого нужны всего три файла:
pdftk.exe
libiconv2.dl
FoxitReader.exe
Примеры использования
Код
Утилита написана для моих рабочих нужд. Возможно, кому-то пригодится принцип формирования и печати pdf
Готовый проект + исходник можно скачать по Ссылке
Скрин запуска без параметров

Сайт pdftk
Для работы требуются: pdftk.exe и libiconv2.dll. Качаем с сайта PDFtk Free, устанавливаем и извлекаем из папки установки нужные файлы. Потом программу можно удалить.
В итоге мы получаем приложение, для работы которого нужны всего три файла:
pdftk.exe
libiconv2.dl
FoxitReader.exe
Примеры использования
Код:
;~ Обязательны три параметра: путь(пути) к файлам, количество копий, имя принтера(или пустая строка)
;~ Четвертый параметр - печать указанных страниц. Можно указать несколько файлов
;~ Номера страниц указываются через пробел, диапазон через дефис(смотри пример)
;~ Печать выбранных страниц невозможна, если файл имеет ограничения(защиту)
;~ ---------------------Примеры------------------------------------------------
;~ Печать на принтер по умолчанию
RunWait('toprint.exe "C:\новая папка\файл.pdf" 1 ""')
;~ Печать на указанный принтер
RunWait('toprint.exe "C:\новая папка\файл.pdf" 1 "CutePDF Writer"')
;~ Печать нескольких файлов на принтер по умолчанию
RunWait('toprint.exe "C:\новая папка\файл.pdf|C:\новая папка\файл_1.pdf" 1 ""')
;~ Печать выбранных страниц из одного файла
RunWait('toprint.exe "C:\новая папка\файл_3.pdf" 1 "CutePDF Writer" "1 3-7 10"')
;~ Печать выбранных страниц из нескольких файлов
RunWait('toprint.exe "C:\новая папка\файл_3.pdf|C:\новая папка\файл_2.pdf" 1 "" "1 3-7 10"')
;~ -----------------------------------------------------------------------------
Код
Код:
#NoTrayIcon
#include <File.au3>
Opt("MustDeclareVars", 1)
If $CmdLine[0] < 3 Or $CmdLine[0] > 4 Then _Help()
Local $aPFile = StringSplit($CmdLine[1], '|')
For $i = 1 To $aPFile[0]
If Not FileExists($aPFile[$i]) Then Exit MsgBox(16, 'To Print', 'Файлы не найдены')
Next
Local $iCount = Int($CmdLine[2])
If $iCount <= 0 Then Exit MsgBox(16, 'To Print', 'Не указано количество копий')
Local $sPName = $CmdLine[3]
Local $aExP = _PrintMgr_EnumPrinter($sPName)
If @error Or $aExP[0] = 0 Then Exit MsgBox(16, 'To Print', 'Невозможно определить принтер: ' & $sPName)
Local $soutpdf = @TempDir, $stmpP = '', $iRndNm = '', $tmpPdf
Local $sRange = '', $sNF, $sDirpdf, $sFile = '', $sFileTmp
While Sleep(10)
$iRndNm = Random(10, 100000, 1)
If Not FileExists($soutpdf & '\' & $iRndNm) Then
$sDirpdf = $soutpdf & '\' & $iRndNm
DirCreate($sDirpdf)
ExitLoop
EndIf
WEnd
If $CmdLine[0] = 4 Then
$sRange = $CmdLine[4]
If $sRange <> '' Then
For $i = 1 To $aPFile[0]
$sNF = _GetN($aPFile[$i])
$stmpP = _TempFile($sDirpdf & '\', $sNF & '_', '.pdf')
RunWait('pdftk.exe "' & $aPFile[$i] & '"' & ' cat ' & $sRange & ' output "' & $stmpP & '"', '', @SW_HIDE)
If Not FileExists($stmpP) Then
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Ошибка извлечения страниц')
EndIf
$sFile &= ' "' & $stmpP & '"'
Next
If $aPFile[0] > 1 Then
$stmpP = _TempFile($sDirpdf & '\', $sNF & '_', '.pdf')
RunWait('pdftk.exe' & $sFile & ' cat output "' & $stmpP & '"', '', @SW_HIDE)
If Not FileExists($stmpP) Then
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Ошибка формирования временного файла P4')
EndIf
$sFile = ' "' & $stmpP & '"'
EndIf
Else
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Не указан диапазон страниц')
EndIf
ElseIf $CmdLine[0] = 3 Then
If $aPFile[0] = 1 Then
$sFile = ' "' & $aPFile[1] & '"'
Else
For $i = 1 To $aPFile[0]
$sFile &= ' "' & $aPFile[$i] & '"'
Next
$sNF = _GetN($aPFile[1])
$stmpP = _TempFile($sDirpdf & '\', $sNF & '_', '.pdf')
RunWait('pdftk.exe' & $sFile & ' cat output "' & $stmpP & '"', '', @SW_HIDE)
If Not FileExists($stmpP) Then
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Ошибка формирования временного файла')
EndIf
$sFile = ' "' & $stmpP & '"'
EndIf
EndIf
If $iCount > 1 Then
For $i = 1 To $iCount
$sFileTmp &= $sFile
Next
$stmpP = _TempFile($sDirpdf & '\', $sNF & '_', '.pdf')
RunWait('pdftk.exe' & $sFileTmp & ' cat output "' & $stmpP & '"', '', @SW_HIDE)
If Not FileExists($stmpP) Then
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Ошибка формирования временного файла iCount')
EndIf
$sFile = ' "' & $stmpP & '"'
EndIf
RunWait('FoxitReader.exe /t' & $sFile & ' "' & $sPName & '"', '', @SW_HIDE)
If @error Then
DirRemove($sDirpdf, 1)
Exit MsgBox(16, 'To Print', 'Ошибка FoxitReader.exe')
EndIf
DirRemove($sDirpdf, 1)
Func _Help()
MsgBox(64, 'To Print', 'Параметры запуска:' & @LF & '1. Полный путь к файлу или файлам' & @LF & _
'2. Количество копий: 1,2...' & @LF & '3. Имя принтера или "" для указания принтера по умолчанию' & @LF & '4. Диапазон страниц для печати: "1 3 7-10 12"(необязательный параметр)' & @LF & 'Все параметры указываются через пробел' & @LF & _
'Путь к файлу, имя принтера должны быть в двойных кавычках' & @LF & 'Если выбрано несколько файлов, то пути к файлам должны быть без кавычек и разделены знаком "|", а вся строка параметра взята в двойные кавычки' & @LF & _
'Диапазон страниц заключается в двойные кавычки. Номера страниц и диапазоны разделяются пробелом' & @LF & _
'Параметр 4 не работает с файлами, которые имеют ограничения(защиту)')
Exit
EndFunc ;==>_Help
Func _GetN($sString)
Local $icnt = StringInStr($sString, '\', 0, -1)
Return StringTrimLeft($sString, $icnt)
EndFunc ;==>_GetN
Func _PrintMgr_EnumPrinter($sPrinterName = "")
Local $aRet[10], $sFilter, $iCount = 0
Local Const $wbemFlagReturnImmediately = 0x10, $wbemFlagForwardOnly = 0x20
If $sPrinterName <> "" Then $sFilter = StringReplace(" Where Name like '" & $sPrinterName & "'", "*", "%")
Local $oWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
If Not IsObj($oWMIService) Then Return SetError(1, 0, 0)
Local $oPrinters = $oWMIService.ExecQuery("Select * from Win32_Printer" & $sFilter, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)
If Not IsObj($oPrinters) Then Return SetError(1, 0, 0)
For $oPrinter In $oPrinters
$iCount += 1
If $iCount >= UBound($aRet) Then ReDim $aRet[UBound($aRet) * 2]
$aRet[$iCount] = $oPrinter.Name
Next
ReDim $aRet[$iCount + 1]
$aRet[0] = $iCount
Return $aRet
EndFunc ;==>_PrintMgr_EnumPrinter
Утилита написана для моих рабочих нужд. Возможно, кому-то пригодится принцип формирования и печати pdf
Готовый проект + исходник можно скачать по Ссылке
Скрин запуска без параметров

- Автор
- joiner
- Источник
- Ссылка на источник
Последнее редактирование: