Имя: Пароль:
1C
 
печать pdf пакетная
0 domanoff2666
 
14.01.19
16:33
есть прикрепленые к докам пдф файлы, надо списком печатать, учитывая последние возможности платформы какие наиболее простые способы решения?
1 d4rkmesa
 
14.01.19
16:46
(0) Через ПолеHTMLДокумента, но достаточно геморойно. Где-то будет работать, где-то нет. "Последние возможности платформы" в этом плане подходящие будут аж в 8.3.14. Через Акробат с отлавливанием и принудительным закрытием просмотрщика тоже не очень красиво будет.
2 d4rkmesa
 
14.01.19
16:49
Вариант через Акробат, работает на клиенте, ограничение - не должно быть неработающих сетевых принтеров с постоянно заполненной очередью печати. Код можно переписать поприличнее, но лень:

// Процедура выполняет попытку напечатать pdf-файлы из списка в фоновом режиме без участия пользователя
// Параметры:
//        МассивФайлов - массив элементов типа "Файл", либо массив структур с ключами "ПолноеИмя" и "Имя"
//        ИмяПринтера  - имя принтера, на который необходимо отправить задание
//
Процедура ФоноваяПечатьPDFФайлов(МассивФайлов, ИмяПринтера = "") Экспорт
    
    WshShell = Новый COMОбъект("WScript.Shell");
    ПутьAdobeReader = WshShell.RegRead("HKCR\Software\Adobe\Acrobat\Exe\");
    Если Не ЗначениеЗаполнено(ПутьAdobeReader) Тогда
        Сообщить("Не найдена программа Adobe Reader! Печать pdf-файлов невозможна.", СтатусСообщения.Важное);
        Возврат;
    КонецЕсли;
    
    oLocator = Новый COMОбъект("WbemScripting.SWbemLocator");
    oService = oLocator.ConnectServer("", "", "", ""); //Задания от всех пользователей
    
    oService.Security_.impersonationlevel = 3; //получаем необходимые права
    oService.Security_.Privileges.AddAsString("SeLoadDriverPrivilege");
        
    Для каждого Файл Из МассивФайлов Цикл
        WshShell.Run(ПутьAdobeReader + " /N /T " + """" + Файл.ПолноеИмя + """" + ?(ЗначениеЗаполнено(ИмяПринтера), " " + """" + ИмяПринтера + """", ""), 0);
        
        ЗаданиеДобавлено = Ложь;
        ТекущееВремя = ТекущаяДата();
        Пока Не ЗаданиеДобавлено И ТекущаяДата() < ТекущееВремя + 15 Цикл // 15 секунд на добавление задания
            ОбработкаПрерыванияПользователя();
            Для каждого ЗаданиеПечати Из oService.InstancesOf("Win32_PrintJob") Цикл
                ОбработкаПрерыванияПользователя();
                ЗаданиеДобавлено = ЗаданиеПечати.Document = Файл.Имя;
            КонецЦикла;    
        КонецЦикла;
        
        Если Не ЗаданиеДобавлено Тогда
            Сообщить("Не удалось отправить на печать файл '" + Файл.Имя + "'.", СтатусСообщения.Важное);
        КонецЕсли;
    КонецЦикла;
    
    // Ожидаем завершения печати
    ТекущееВремя = ТекущаяДата();
    Пока (oService.InstancesOf("Win32_PrintJob").Count > 0)И(ТекущаяДата() < ТекущееВремя + 15) Цикл
    КонецЦикла;
    
    // Получаем имя процесса
    НомерСимвола = Найти(ПутьAdobeReader, "\");
    Пока НомерСимвола > 0 Цикл
        ПутьAdobeReader = Сред(ПутьAdobeReader, НомерСимвола + 1);
        НомерСимвола = Найти(ПутьAdobeReader, "\");
    КонецЦикла;
    // Убиваем процесс
    WshShell.Run("taskkill /f /im " + ПутьAdobeReader, 0);
    
КонецПроцедуры    //ФоноваяПечатьPDFФайлов(МассивФайлов, ИмяПринтера = "") Экспорт
3 spiller26
 
14.01.19
16:53
(2) Пакетная печать pdf-файлов в фоне Adobe Reader
Процедура ПечатьAdobePDF()

    Принтер = "HP LaserJet M1530 MFP Series PCL 6";
    //Принтер = "Adobe PDF";
    
    Попытка
        апп = Новый COMОбъект("AcroExch.App");
        док = Новый COMОбъект("AcroExch.PDDoc");
    Исключение
        Сообщить("ошибка");
        Возврат;
    КонецПопытки;
    
    апп.Hide(); //скрыть приложение
    док.Open("d:\2.pdf");
    дс = док.GetJSOBject();
    пп = дс.GetPrintParams(); //параметры печати
    пп.interactive = пп.constants.interactionLevel.silent; //печать без прогрессора
    пп.printerName = Принтер;
    пп.pageHandling = пп.constants.handling.shrink; //по ширине страницы
    //пп.pageHandling = пп.constants.handling.fit;
    пп.numCopies = 3; //количество копий
    //пп.firstPage = 0;
    //пп.lastPage = дс.numPages-1;
    //пп.tileScale = 1;
    дс.print(пп); //сама печать
    
    док.Close();
    док = Неопределено;
    апп.Exit();
    апп = Неопределено;

КонецПроцедуры
4 domanoff2666
 
15.01.19
10:28
(2) а на свободный принтер нет кода чтоб отправлялось?
5 d4rkmesa
 
15.01.19
10:57
(4) Нет. Там проблема сопоставить имя принтера с данными Win32_PrintJob, если только по DriverName. Да и вообще эти костыли не для высокоинтенсивной печати.
6 domanoff2666
 
16.01.19
10:34
(5) через abobe acrobat pro не работает не та команда чтоль?
7 d4rkmesa
 
16.01.19
10:37
(6) Если есть Pro, то делать надо как в (3). Хотя, может обычный просмотрщик тоже будет работать.
Основная теорема систематики: Новые системы плодят новые проблемы.