Только бесплатный Acrobat Reader, другие варианты не рассматриваем.
Пока точно работающих нашел 2 варианта:
1. ActiveX - работает. Есть 2 но: для печати нужно выводить на экран (или всё-таки нет?) и выставлять задержку при пакетной печати - не успевает открываться pdf в окне ActiveX
2. Печать через командную строку. Пусть к исполняемому файлу может отличаться от системы к системе. По некоторым сообщениям в форумах процесс ридера остается висеть в памяти.
Есть реально работающий пример без этих недостатков?
Acrobat = Новый COMОбъект("AcroPDF.PDF.1");
Acrobat.Visible = false;
Acrobat.LoadFile(Путь);
Acrobat.printAll();//или Acrobat.printWithDialog();
пакетная печать через венду
Папка = "C:\ывпывыпы";
Shell = Новый COMОбъект("Shell.Application");
Folder = Shell.Namespace(Папка);
colItems = Folder.Items;
Для Каждого Эл Из colItems Цикл
Эл.InvokeVerbEx("Print");
КонецЦикла;
Перевел с vbs поэтому могут быть ошибки
(2) cool.vlad4, а при таком методе разве не остается висеть процесс ридера в памяти после окончания печати? Просто сам интересовался этим вопросом, в результате печатаю через ИЕ.
(8) Причем здесь пакетный вывод из 1С, причем здесь (11) ? Задача была печатать готовые pdf файлы из 1C, Acrobat я так понимаю был выбран, поскольку уже либо стоял на компе, либо полностью поддерживал данный формат pdf(поскольку их несколько, pdf/A и т.д.) . Че лезите-то?
- не подходит, т.к. здесь указывается абсолютный путь. Решение не универсальное.
//упрощенная процедура для формирования ПДФ
Процедура ПолучитьФайлПДФ(Таб,ИмяФайла)
принтер=Новый ComObject("Bullzip.PDFPrinterSettings");
принтер.SetValue("output", ИмяФайла);
принтер.SetValue("ShowSaveAS", "never");
принтер.SetValue("ShowProgress", "no");
принтер.SetValue("ShowProgressFinished", "no");
принтер.SetValue("ShowSettings", "never");
принтер.SetValue("ShowPDF", "no");
принтер.SetValue("ConfirmOverwrite","no");
принтер.SetValue("OwnerPassword","Pass4PDF");
принтер.SetValue("Permissions",61636);
принтер.WriteSettings();
Таб.Автомасштаб=Истина;
Таб.Имяпринтера="Bullzip PDF Printer";
PDFФайл = Новый Файл(ИмяФайла);
Если НЕ PDFФайл.Существует() Тогда
Таб.Напечатать(Истина);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
ТаймерЗадержки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
Используется сторонняя программа, которой может не оказаться.
Пока я остановился на решении:
печать через доп.форму с ActiveX + обязательная задержка (3-5 сек), т.е. нельзя закрывать окно c ActiveX/удалять временный файл пока задание не будет сформировано и отправлено на принтер.
//упрощенная процедура для формирования ПДФ
Процедура ПолучитьФайлПДФ(Таб,ИмяФайла)
принтер=Новый ComObject("Bullzip.PDFPrinterSettings");
принтер.SetValue("output", ИмяФайла);
принтер.SetValue("ShowSaveAS", "never");
принтер.SetValue("ShowProgress", "no");
принтер.SetValue("ShowProgressFinished", "no");
принтер.SetValue("ShowSettings", "never");
принтер.SetValue("ShowPDF", "no");
принтер.SetValue("ConfirmOverwrite","no");
принтер.SetValue("OwnerPassword","Pass4PDF");
принтер.SetValue("Permissions",61636);
принтер.WriteSettings();
Таб.Автомасштаб=Истина;
Таб.Имяпринтера="Bullzip PDF Printer";
PDFФайл = Новый Файл(ИмяФайла);
Если НЕ PDFФайл.Существует() Тогда
Таб.Напечатать(Истина);
Пока НЕ PDFФайл.Существует() Цикл
ОбработкаПрерыванияПользователя();
ТаймерЗадержки;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
На самом деле без разницы, где храниться PDF файл, в ИБ или где то на диске,
главное уметь распечатывать "массово" большой список файлов.
Спасибо за вариант с "Bullzip", попробую.
Вариант с Акробатом не универсальный из за пути, но как вариант "временного" работает :)
Надо научить 1С работать с PDF'ками. Начинаю собирать подписи к Нуралиеву Б. :)
(16) Bullzip - это виртуальный принтер и хоть с его помощью наверняка можно переводить стрелки на реальный принтер, его назначение в другом. У меня были реальные ситуации, когда сделанный с помощью Acrobat pdf, нормально печатал только Acrobat. Насчет Нуралиева, - pdf никакого отношения к 1С и к нему не имеет. Лучше бы он сделал нормальное конвертирование mxl во что-нибудь удобоваримое.
(19) ReTro,
Да , возможно.
Тут на Инфостарте есть описание как выводить любые печатные формы в pdf с помощью
PDFCreator.
Эта программа умеет выводить еще в кучу других форматов, в т.ч. и графические.
Поставить ей формат файла по умолчанию jpg и все...
(19)(20) возможно - на последней платформе сохраняете счет в pdf , затем скачиваете imagick + ghost, при установке ставите галочку ole object, затем пишете код по вызову com объекта imagick, который сохраняет pdf в нужную вам картинку, для платформ 8.1 - делается всякими ВК и т.п. принтерами и тому подобной мурой.
(24) cool.vlad4, так что-же делать с этими файлами pdf, если я хочу их вывести одним листом?
Вроде как PDFCreator имеет функцию типа объединения (merge), только как ее использовать через COM нигде не написано
Можно скопировать функционал из конфигурации CRM. Общие формы -> CRM_ПечатьДокументов и уже подредактировать под собственные нужды, там добавлены кнопки сохранять в pdf и excel.
Некропостну для поисковиков... Столкнулся с аналогичной задачей, вот мое решение:
// Процедура выполняет попытку напечатать 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);
ЗаданиеДобавлено = Ложь;
ТекущееВремя = ТекущаяДата();
Пока Не ЗаданиеДобавлено И ТекущаяДата() < ТекущееВремя + 30 Цикл // 30 секунд на добавление задания
ОбработкаПрерыванияПользователя();
Для каждого ЗаданиеПечати Из oService.InstancesOf("Win32_PrintJob") Цикл
ОбработкаПрерыванияПользователя();
ЗаданиеДобавлено = ЗаданиеПечати.Document = Файл.Имя;
КонецЦикла;
КонецЦикла;
Если Не ЗаданиеДобавлено Тогда
Сообщить("Не удалось отправить на печать файл '" + Файл.Имя + "'.", СтатусСообщения.Важное);
КонецЕсли;
КонецЦикла;
// Ожидаем завершения печати
Пока oService.InstancesOf("Win32_PrintJob").Count > 0 Цикл КонецЦикла;
// Получаем имя процесса
НомерСимвола = Найти(ПутьAdobeReader, "\");
Пока НомерСимвола > 0 Цикл
ПутьAdobeReader = Сред(ПутьAdobeReader, НомерСимвола + 1);
НомерСимвола = Найти(ПутьAdobeReader, "\");
КонецЦикла;
// Убиваем процесс
WshShell.Run("taskkill /f /im " + ПутьAdobeReader, 0);
КонецПроцедуры
(30) Спасибо, всё в точности сделала - печатает. Но после печати 1С перестает реагировать на манипуляции и для дальнейшей работы приходится перезаходить в программу. У вас такого не случалось?
потребовалось из Серча напечатать неопределенное количество доков, нашел неплохую функцию, которая все документы по детали может поместить в указанную папку. Есть 2 "НО". 1-е файлы могут быть внутри папок и все кидается в указанную, т.е. получается вложение папки в папке, ну и 2-е это их может быть дофига
поэтому ищем по расширению и во всех вложенных, на выходе имеем массив с путями, его отправляем на печать.
вариант печати с акробатом хорош, но у меня не установлен, что стоит у юзера не всегда можно угадать, да нафиг сложности, берем вариант (33) и печатаем тем что стоит
Процедура ФоноваяПечатьPDFФайловПросмотрщиком(МассивФайлов) Экспорт
Shell = Новый COMОбъект("Shell.Application");
Для каждого Файл Из МассивФайлов Цикл
Shell.ShellExecute(Файл.ПолноеИмя, "", "", "print", 0);
КонецЦикла;
КонецПроцедуры
40.
IT_PROGRAMMIST
11822.08.14 21:44 Сейчас в теме
(38)
Собственно кому интересно описую в чем была проблема.
Алгоритм печати pdf документа у меня был следующий(скорее всего в (36) такой-же):
1) распечатал pdf
2) удалил его
Проблема была именно с этим. Пока открывался pdf и отправлялся на печать 1с его удаляла.
При том, если отправлял на принтер по-умолчанию все было норм, так как печать была быстрее и за эти миллисикунды 1с не успевала удалять документ.
Нашел эту тему.
(36) farkhod, попробуйте указать и имя сервера (если не проканает - попробовать его расшарить)
Для общих принтеров полное имя должно быть не более 31 символа, и это имя должно содержать имя сервера, как в следующем примере:
\\PRINTER2\PSCRIPT
Если принтер используется совместно с много разных клиентов в сети, используйте для имен принтеров 31 или меньше символов и не включайте в эти имена пробелы или специальные символы.
Если принтер используется совместно с компьютерами MS-DOS, следует использовать более восьми символов для имени общего ресурса для принтера. Можно удлинить такое имя, добавив в период, который следует не более трех символов. Но нельзя использовать пробелы в имени.
42.
IT_PROGRAMMIST
11825.08.14 12:42 Сейчас в теме
Коллеги подскажите в решении следующего вопроса.
Есть pdf документ, который печатается из 1С.
Печатается вот так:
WshShell.Run(ПутьAdobeReader + " /N /T " + НазваниеФайла + ?(ЗначениеЗаполнено(ИмяПринтера), " " + ИмяПринтера, ""), 0);
Возникла необходимость изменить пользовательский масштаб при печати. Как это можно сделать?
Вставил на форму ActiveX Adobe PDF Reader. Далее пользователь выставляет масштаб печати. Но если перезайти в 1С, то надо заново выставлять все параметры.
Можно ли как-то сохранять параметры печати в этом ActiveX Adobe PDF Reader?
Ну или как нибудь по другому выводить на печать.
Народ! А как же задать произвольное количество при печати? Например в групповой печати 1 документ должен быть распечатан 5 раз, а другой 3, после него нужно в третьем 7 копий. Если через активХ или шеллом то только циклом? иначе никак?
Два типа пароля применяются к ограничениям пароля уровня владельца PDF и ограничениям на уровне пользователя. Если файл PDF заблокирован с паролем пользователя, а пароль потерян или вы не знаете пароль, то, возможно, нет законного способа его разблокировать, а опция остается спросить у автора, который создал защищенный паролем PDF.
Если вы знаете пароль файла PDF и хотите удалить пароль навсегда, вы можете сделать это легко с браузером Chrome, открыв PDF-файл в хроме и сохраняя его как новый PDF-файл.
И Если в PDF-формате применяется ограничение уровня владельца, которое ограничивает редактирование, печать, извлечение текстов, вы можете использовать инструмент «Разблокировать PDF». Это легко удалит все типы файлов PDF и ограничения безопасности и пароль.
http://www.pcinfotools.com/ru/разблокировать-pdf-инструмент/
будет выводить на принтер документ без открытия окон.
Настройка тихого режима:
В приложении Foxit Reader - меню "Файл" - "Установки" - раздел "Печать" - Поставить галочку "Не предлагать Foxit Reader при печати в автоматическом режиме"
55.
user679935_artem.ant
26.01.23 18:21 Сейчас в теме
(10) Через Adobe Reader 11.0 с параметрами /o /T печатает, фоновых процессов не оставляет. Оставляет только одно главное окно. Его пользователь закроет и все. Если даже не закроет и снова запустит пакет на печать, то все отработает норм.
Foxit PDF Reader получше - не открывает вообще никаких окон, молча печатает, но есть недостаток - он платный.
Пробовал печатать через ДокументPDF на платформе 1С:Предприятие 8.3 (8.3.22.1750) - наблюдается проблема с ориентацией страницы ландшафт. В окне просмотра 1С отображается нормально, но если послать на печать, то переворачивается в книжную и обрезает часть страницы. Где задать параметры печати не нашел. Когда-нибудь допилят наверное