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

Нужно распечатать 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 или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует