Как печатать напрямую на принтер этикеток из Internet Explorer без запроса

У меня есть база данных mysql, содержащая номера upc, которые я хотел бы распечатать на этикетках с помощью принтера Zebra (LP2824). Я хотел бы как-то иметь возможность отправлять эти числа непосредственно на мой принтер этикеток, который не является принтером по умолчанию, без запроса пользователя.

Насколько я могу судить, IE — единственный вариант, так как для этого требуется какой-то элемент управления ActiveX. Я нашел пример прямой печати на meadroid.com с использованием ScriptX, но я не хочу платить лицензионный сбор. Я также нашел пример с использованием VBScript, который отправит страницу на принтер по умолчанию без запроса пользователя. Моя проблема в том, что я не могу понять, как удалить верхний и нижний колонтитулы по умолчанию, присутствующие в IE, и я не могу выбрать, какой принтер использовать.

Мой вопрос:

Есть ли элемент управления ActiveX, который я могу использовать с помощью javascript, аналогичного ScriptX от MeadCo, но без лицензирования, или подход VBScript будет лучше, и в этом случае как человек может удалить верхний и нижний колонтитулы и распечатать на принтере этикеток, который не установлено по умолчанию? Возможность просто отправить серию команд непосредственно на принтер была бы идеальной.

Вот тестовый код, который у меня есть до сих пор:

<head>
<script language='VBScript'>
Sub Print()
       OLECMDID_PRINT = 6
       OLECMDEXECOPT_DONTPROMPTUSER = 2
       OLECMDEXECOPT_PROMPTUSER = 1
       call WB.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER,1)
End Sub
document.write "<object ID='WB' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object>"
</script>

</head>

<body>
Helo!!!
<a href="javascript:window.print();">Print</a>

</body>

person JustinS    schedule 02.01.2010    source источник
comment
stackoverflow.com/questions/18019219/ Я не знаю, может ли это вообще помочь? Проверьте это.   -  person natethenerd    schedule 31.05.2015


Ответы (1)


У меня была точно такая же проблема с веб-системой ERP, когда нам нужно было напечатать этикетки для входящих поставок, прежде чем размещать товары на полках для хранения. Наша первоначальная проблема заключалась в том, что мы не могли заставить IE печатать этикетки указанного размера, который мы настроили для принтера этикеток (Zebra TLP-2844). IE всегда использовал формат A4 принтера по умолчанию. Печать «обычным способом» также привела к большому количеству дополнительных кликов и настроек, которые нужно было сделать только для этой простой задачи, которая требовала всего один клик в приложении на базе Windows (где у вас больше контроля над настройками принтера).

Я провел много исследований и нашел некоторые элементы управления ActiveX, которые могли детально управлять настройками принтера, но, в конце концов, обычный способ печати по-прежнему приводил к ненужному количеству кликов, и клиент хотел, чтобы это было супер просто и супер быстро.

Поскольку у меня есть предыдущий опыт разработки приложений с использованием принтеров этикеток, я знал о внутреннем языке принтера, который можно использовать. В принтерах Zebra это называется EPL/ZPL. Это простой текстовый протокол, который можно использовать через любой из интерфейсов, предлагаемых принтером, например. Параллельный порт, последовательный порт, USB или 10/100 Ethernet. Я только что использовал интерфейс последовательного порта раньше, но в этом проекте мне нужно было иметь возможность печатать через Интернет, через брандмауэр, на принтер Zebra, подключенный к локальной сети в офисе клиента. После некоторых исследований оказалось, что на самом деле это довольно просто, и это оказалось действительно отличным решением для клиента.

Базовый язык EPL имеет свои ограничения, но часто вам нужна довольно простая распечатка, включающая некоторый текст и штрих-коды или что-то в этом роде. Вы ограничены стандартным шрифтом фиксированной ширины в пяти размерах. Можно установить ширину и высоту шрифта кратными исходному размеру. Если вам нужны более сложные распечатки, включая изображения или определенные макеты, шрифты, размеры и т. д., это можно сделать, создав шаблоны в специальном приложении для дизайна этикеток. Шаблоны могут содержать переменные, которые можно использовать при вызове шаблона.

Чтобы полностью понять мой небольшой пример и получить более подробную информацию, я рекомендую вам скачать руководство для программистов EPL. Вам также, возможно, придется настроить принтер, чтобы он мог принимать команды, процедура должна быть описана в руководстве.

Ниже вы найдете простой пример для ASP.NET 2.0 (C#). Поскольку я изначально сделал консольное приложение для тестирования, есть некоторая обработка ошибок, которую я только что прокомментировал. Пример основан на полностью функциональном клиентском решении, но я исключил и переписал некоторые части, чтобы сделать пример более понятным. Я протестировал базовые функции, и возвращаемые строки выглядят нормально, но я не тестировал печать на принтере Zebra, поскольку в данный момент у меня нет к нему доступа, поэтому помните о непредвиденных ошибках. :) Но это должно быть нормально.

Удачи!

Ресурсы:

Zebra — библиотека ресурсов

Примечание. Вам необходимо зарегистрироваться, чтобы иметь возможность загрузить Руководство программиста EPL.

Пример кода:

<%@ Import Namespace = "System.Data" %>
<%@ Import Namespace = "System.Text" %>
<%@ Import Namespace = "System.Net.Sockets" %>
<%@ Import Namespace = "System.IO" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script language="C#" runat="server">
    public String strPrintOutput;

    void Page_Load(Object sender,EventArgs e)
    {
        // Build output string - Example - Printer Settings
        //strPrintOutput = BuildString1();

        // Build output string - Example - Print Label with Barcode and some text (Prints two labels)
        strPrintOutput = BuildString2("123456", "2010-01-02", "1234567890", "123", "Harddrive", "D31", "123456", "2");

        // Print output to HTML-page
        txtPrintout.Text = strPrintOutput;

        // Send output to Zebra Printer
        // xxx.xxx.xxx.xxx = The IP of the Zebra printer
        // 9100 = The default printer port, but that could be changed on the printer
        // For external access (e.g. through the internet) you need to use the IP/domain name of the router/firewall and also open a port in the firewall and forward the traffic to the internal IP and port set on the printer
        // Note that for external access appropriate security measures should be added in some way.
        Connect("xxx.xxx.xxx.xxx", 9100, strPrintOutput);
    }

  public void Connect(String ip, Int32 port, String strMessage)
  {
    try
    {
      // Convert String to Byte Array with encoding Windows-1252
      //Byte[] data = System.Text.Encoding.ASCII.GetBytes(strMessage);
      Byte[] data = System.Text.Encoding.GetEncoding(1252).GetBytes(strMessage);

      // Create connection to printer
      TcpClient printer = new TcpClient(ip, port);

      // Get stream object of printer
      NetworkStream strm = printer.GetStream();

      // Write message to stream
      strm.Write(data, 0, data.Length);

      // Status Message
      //Console.WriteLine("Sent: {0}", strMessage);

      // Close stream
      strm.Close();

      //Close connection to printer
      printer.Close();

    } // end try

    catch (ArgumentNullException e)
    {
        //Console.WriteLine("ArgumentNullException: {0}", e);
    }

    catch (SocketException e)
    {
        //Console.WriteLine("SocketException: {0}", e);
    }

    //Console.WriteLine("\n Press Enter to continue...");
    //Console.Read();
  }

  /*
   * \n = LF (Line Feed)
   * \r = CR (Carriage Return)
   * \r\n = CrLf
   * Printer ignores CR when sent
   * CR cannot be used in place of LF
  */
  public String BuildString1()
  {
    StringBuilder sb = new StringBuilder();

    //Clears out printer buffer
    sb.Append("\n");

        //Print the current printer configuration
    sb.Append("U\n");

    return sb.ToString();
  }

  public String BuildString2(String strBarCode, String strDate, String strArticleNumber, String strPurchaseOrderNumber, String strArticleName, String strLocation, String strOrderNumber, String strNoOfLabels)
  {
    StringBuilder sb = new StringBuilder();

    //Clears out printer buffer
    sb.Append("\n");

    //Clears out the image buffer
    sb.Append("N\n");

    //Set 8-bit, CodePage Windows 1252 (Latin 1), KDU Sweden (Printer with display)
    sb.Append("I8,A,046\n");

        // Create Print Objects
    sb.Append("B35,5,0,3C,3,6,60,N,\"" + strBarCode + "\"\n");
    sb.Append("A35,75,0,3,1,1,N,\"Article No:\"\n");
    sb.Append("A35,100,0,3,1,1,N,\"Article Name:\"\n");
    sb.Append("A35,125,0,3,1,1,N,\"Location:\"\n");
    sb.Append("A35,150,0,3,1,1,N,\"Order:\"\n");

    sb.Append("A205,75,0,3,1,1,N,\"" + strArticleNumber + "\"\n");
    sb.Append("A205,100,0,3,1,1,N,\"" + strArticleName + "\"\n");
    sb.Append("A205,125,0,3,1,1,N,\"" + strLocation + "\"\n");
    sb.Append("A205,150,0,3,1,1,N,\"" + strOrderNumber + "\"\n");

    sb.Append("A432,49,0,3,1,1,N,\"" + strDate + "\"\n");
    sb.Append("A530,75,0,3,1,1,N,\"" + strPurchaseOrderNumber + "\"\n");
    sb.Append("P" + strNoOfLabels + "\nN\n\n");

    return sb.ToString();
  }

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Print to Zebra Label Printer</title>
</head>
<body>
    <form id="form1" runat="server">
      <asp:Panel runat="server">
        <asp:TextBox id="txtPrintout" TextMode="MultiLine" runat="server" BackColor="LightBlue" Width="100%" Height="800px"></asp:TextBox>
      </asp:Panel>
    </form>
</body>
</html>
person Octadrone    schedule 03.01.2010