Что нового

Файловая система To Print - печать файлов pdf

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Версия 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

Примеры использования
Код:
;~ Обязательны три параметра: путь(пути) к файлам, количество копий, имя принтера(или пустая строка)
;~ Четвертый параметр - печать указанных страниц. Можно указать несколько файлов
;~ Номера страниц указываются через пробел, диапазон через дефис(смотри пример)
;~ Печать выбранных страниц невозможна, если файл имеет ограничения(защиту)
;~ ---------------------Примеры------------------------------------------------
;~ Печать на принтер по умолчанию
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

Готовый проект + исходник можно скачать по Ссылке

Скрин запуска без параметров
Безымянный.jpg
 
Автор
joiner
Источник
Ссылка на источник
Последнее редактирование:
Верх