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