Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбрать принтер, на кот. печатается страница, выбор принтера для печати JavaScript'ом 
:(
    Опции темы
WIPS
Дата 2.8.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



Задача: необходимо пустить страницу из браузера на печать на определенном принтере. В системе установлено N принтеров.
Крайне не желательна установка каких-либо доп. библиотек или программ. Скорее всего придется использовать ActiveX.
Кому есть, что сказать или показать по этому поводу, милости прошу...
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
WIPS
Дата 4.8.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



Вобщем немного поизвращавшись решение нашлось. Его я опишу позже.
Основная задача свелась к тому, чтобы выводить на печать без появления диалога выбора принтера. Решение с использованием VBScript нашлось здесь, а с использованием JScript здесь. Вариан с JScript у меня все равно выводит диалог выбора принтера, а VBScript нет. Я пошел дальше, получился такой код:
Код

<html>
    <head>
        <!-- WebBrowser ActiveX object. Needed to initiate print w/o window.print(). -->
        <OBJECT ID="WB" WIDTH=0 HEIGHT=0 CLASSID="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></OBJECT>

        <script language="JavaScript">
            // This calls VB function
            function printJsVb()  
            {
                PrintVb();
            }
            // This uses only JS
            function printJs()
            {                
                WB.ExecWB(6, 2, 1);
            }
        </script>
        
        <script language="VBScript">
            // This uses only VB
            Sub PrintVb()
                call WB.ExecWB(6, 2, 1)
            End Sub
        </script>        
    </head>
    <body>
        <form>
            <input type="button" value="print JS + VB" onClick="printJsVb();">
            <input type="button" value="print VB"      onClick="PrintVb();">
            <input type="button" value="print JS"      onClick="printJs();">
        </form>
    </body>
</html>

При вызове printJsVb() и PrintVb() диалога нет, при вызове printJs() есть, почему? На мой взгляд ф-ции PrintVb() и printJs() идентичны. Или я не прав (VBScript не знаю вобще)? Тестил на MSIE6.0.
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 4.8.2006, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Об этом даже в мелкософте вряд ли задумывались, движки VBS и JS разные с нуля.
Держи плюс за решение, осталось нарыть API, что бы принтер выбрать smile

На встречу: а чем окошко браузера для распечатки не понравилось? Со стороны пользователя больше контроля, проще...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
WIPS
Дата 6.8.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



Цитата
осталось нарыть API, что бы принтер выбрать

В принципе уже нарыл. Через Windows Script Host вызываем Shell, потом им в реестре меняем default'ный принтер, печатаем и возвращаем старый default'ный принтер на место. Чуть позже запостю код и полезные ссылки.
Цитата
а чем окошко браузера для распечатки не понравилось? Со стороны пользователя больше контроля, проще... 

Дело в том, что пользователю будет небходимо отправлять на печать по нескольку десятков документов в день, причем в зависимости от "контекста" на разные принтеры. А выбор принтера вручную - лишняя трата времени. К тому же если уж очень хочется напечатать с настройками всегда остается Ctrl+P smile
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
WIPS
Дата 14.8.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 22.5.2006
Где: Украина, Киев

Репутация: 2
Всего: 8



Как обещал выкладываю код, а точнее коды smile
Основной код:
Код

/**
 * This is the code for printing from browser without annoying print dialog with ability to choose printer you 
 * want to print on. Uses ActiveX, i.e. MSIE only compatible. 
 * Also VBScript printVB() function must be in scope, otherwise print dialog is displayed. Print dialog not dispalyed only
 * if using VBScript printVB() function. Why it happens only MS knows :(
 *
 * @author WIPS
 */    
    
    /**
     * We'll save default system printer discriptor here.
     * @var    string
     */
    var defaultPrinter;
    
    /**
     * ActiveX object for working with registry, file system etc.
     * @var    obj
     */    
    var WshShell = new ActiveXObject('WScript.Shell');
    
    /**
     * Default printer registry path in WinNT-like systems.
     * @var    string
     */ 
    var regPathWinNT = "HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\Device";
    
    /**
     * Default printer registry path in Win98-like systems.
     *
     * Note that in Win98-like system to change default printer it is not enough to change only 
     * registry value, you also need to reboot system. There's nothing I can do with it :(
     *
     * @var    string
     */     
    var regPathWin98 = "HKLM\\Config\\0001\\System\\CurrentControlSet\\Control\\Print\\Printers\\Default";
    
    /**
     * Changes default system printer and saves current. Reboot needed in Win98-like systems.
     *
     * Note that value of default printer registry keys in WinNT/Win98 aren't the same. In my case it was 
     * "SomePrinter,winspool,SPrinter:" for WinNT (it means smth like "printer_name, spooler, printer_port") and
     * "SomePrinter" for Win98.
     *
     * @param  string printer_descriptor
     */    
    function changePrinter(printer_descriptor)
    {
        try
        {
        // If WinNT, WinXP etc.
            // Saving current default printer. 
            defaultPrinter = WshShell.RegRead(regPathWinNT);
            // Setting new default printer. 
            WshShell.RegWrite(regPathWinNT, printer_descriptor);
        }
        catch (e) 
        {
            try
            {
            // If Win98 etc.
                // Saving current default printer. 
                defaultPrinter = WshShell.RegRead(regPathWin98);
                // Setting new default printer.                 
                WshShell.RegWrite(regPathWin98, printer_descriptor); 
            }
            catch(e)
            {
            // Failed to get default printer.
                defaultPrinter = false;
                alert("Error: unknown OS!");
            }
        }
    }
    
    /**
     * Prints w/o print dialog using default system printer.
     *
     * @see  printVB()
     */
    function printJS()
    {
        printVB();        
    }

Теперь одна функция на VBScript (зачем VBScrit см. выше):
Код

    ' We call this for printing w/o print dialog
    
    Sub Printt()
        call WBO.ExecWB(6, 2, 1)
    End Sub

И плюс ко всему WebBrowser объект через который мы эту самую печать без дилога и вызываем:
Код

    <!-- WebBrowser object -->
    <object id="WBO" width="0" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>


Добавлено @ 14:31 
А теперь ссылки:
    Здесь было найдено решение для VB.
    Здесь описано как читать из реестра.
    Здесь как в реестр писать и ещё кое что.
    Здесь пути к ключам в реестре. Хочу заметить, что у меня в отличие от того что написано тут, принтер по умолчанию в Win98 прописан по такому пути "HKLM\\Config\\0001\\System\\CurrentControlSet\\Control\\Print\\Printers\\Default". На других 98-х не проверял.
    - Про WebBrowser object читаем MSDN.

Вот и все smile
--------------------
Автопроизводители, машины, марки, модели!
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.