Рейтинг@Mail.ru
+7(495) 775-81-02
+7(903) 263-81-81
Корзина пока пуста
товаров: 0,  сумма 0 р.

Статьи

Печать на принтере сенсорного киоска без диалоговых окон

26.07.16

Печать на принтере сенсорного киоска без диалоговых окон

К нам часто обращаются с вопросами как организовать печать на принтере сенсорного информационного киоска, когда решение (программное обеспечение) в виде HTML кода и запускается в обычном или специализированном браузере. При этом основная трудность это как сделать печать без диалоговых окон операционной системы.

Получив около дюжины запросов с такими запросами, мы решили выложить все информацию на сайте. Поэтому рассчитываем, что вопросы типа:

Как использовать скрип для печати html без вызова диалогового окна?
Как отправить на печать страницу без диалогового окна?
Как печатать из браузера в режиме киоска без вывода диалоговых окон?
Вывод на печать html страницы без диалоговых окон операционной системы?
Быстрая печать на принтер по умолчанию и без диалоговых окон?
Как по нажатию на кнопку распечатывать ранее подготовленный контент без промежуточных диалоговых окон?
Как выводить на печать без появления диалога выбора принтера?

более мы не услышим)



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


Выделить всёРазвернуть кодРазметка HTML
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
<html>
    <head>
        <!-- WebBrowser ActiveX object. Needed to initiate print w/o window.print(). -->
        <OBJECT ID="WB" WIDTH=HEIGHT=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(621);
            }
        </script>
        
        <script language="VBScript">
            // This uses only VB
            Sub PrintVb()
                call WB.ExecWB(621)
            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() есть.

Теперь API, что бы принтер выбрать. Через Windows Script Host вызываем Shell, потом им в реестре меняем default'ный принтер, печатаем и возвращаем старый default'ный принтер на место.

А теперь основной код:

Основной код:
Выделить всёРазвернуть кодкод Javascript
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
/**
 * 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 см. выше):
Выделить всёкод Visual Basic
1:
2:
3:
4:
5:
    ' We call this for printing w/o print dialog
    
    Sub Printt()
        call WBO.ExecWB(621)
    End Sub

И плюс ко всему WebBrowser объект через который мы эту самую печать без дилога и вызываем:
Выделить всёРазметка HTML
1:
2:
    <!-- WebBrowser object -->
    <object id="WBO" width="0" height="0" classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>


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

Вот и все smile

Комментировать

Разделы / ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ДЛЯ СЕНСОРНЫХ СИСТЕМ
Работает на: Amiro CMS