Вход | Регистрация


Нужно распечатать pdf или html файлы из 1С пакетом на определенный принтер

Нужно распечатать pdf или html файлы из 1С пакетом на определенный принтер
Я
   rotting
 
09.05.18 - 12:58
Собственно какие можно придумать решения, желательно без сторонних решений, средствами 1С?
 
 
   d4rkmesa
 
1 - 09.05.18 - 20:40
Без сторонних решений будут костыли.

Печатать pdf можно так (при средней интенсивности печати, желательно, чтобы в системе не было неработающих принтеров с заполненной очередью печати):

// Процедура выполняет попытку напечатать 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Файлов(МассивФайлов, ИмяПринтера = "") Экспорт
   rotting
 
2 - 10.05.18 - 08:29
(1) А зачем 15 сек. на добавление задания, это происходит так долго?
   Azverin
 
3 - 10.05.18 - 08:57
(0) я перед печатью "склеиваю" pdf-файлы в один многострочный файл (Acrobat более 50 файлов за раз не открывает) и печатаю. подойдёт?
   rotting
 
4 - 10.05.18 - 09:07
(3) подойдет, подскажи как
   Azverin
 
5 - 10.05.18 - 09:14
(4) посмотрел код - используется внешняя программка pdftk.exe. подойдёт?
   rotting
 
6 - 10.05.18 - 09:16
(5) да все варианты хочу видеть
   Azverin
 
7 - 10.05.18 - 09:30
(6)  Необходимо получить в строку пути всех файлов через пробел:
ВсеПутиКФайлам = ВсеПутиКФайлам + ИмяВнешнегоФайла + " ";


ВсеПутиКФайлам = "C:\Users\ххх\AppData\Local\Temp\23\2(57).pdf C:\Users\ххх\AppData\Local\Temp\23\3(2).pdf C:\Users\ххх\AppData\Local\Temp\23\3(8).pdf и т.д."

Объединенный pdf-файл открывается, печатается пользователем, после удаляется.

    ПутьДоФайла = ПолучитьПутьТомаХранения()+"PDF"; 
         
        ФайлОбъединения = ПутьДоФайла+"\"+СсылкаНаОбъект.Номер+"_all.pdf";
        
        Скрипт = Новый COMОбъект("WScript.Shell");
        Скрипт.Run("C:\Progra~2\PDFtk\bin\pdftk.exe "+ВсеПутиКФайлам+"output "+ФайлОбъединения,0,1);        
        //ЗапуститьПриложение("C:\Progra~2\PDFtk\bin\pdftk.exe "+ВсеПутиКФайлам+"output "+ФайлОбъединения);

        
        КодВозврата = 0;
        ЗапуститьПриложение(ФайлОбъединения,,Истина,КодВозврата);
        
        МаскаУдаления = "*.pdf";
        МассивФайлов = НайтиФайлы(ПутьДоФайла,МаскаУдаления);
        Для каждого ФайлМ из МассивФайлов Цикл
            Если ФайлМ.ПолучитьТолькоЧтение() Тогда
                ФайлМ.УстановитьТолькоЧтение(Ложь);
            КонецЕсли;    
            Попытка
                УдалитьФайлы(ФайлМ.ПолноеИмя); 
            Исключение
                Сообщить("Ошибка удаления временного файла: " + ОписаниеОшибки(), СтатусСообщения.Обычное);
            КонецПопытки;
        КонецЦикла;


   rotting
 
8 - 10.05.18 - 09:40
(7) спасибо

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует