Использование Javascript для печати этикеток на клиентском принтере DYMO

#javascript #asp.net #dymo

#javascript #asp.net #dymo

Вопрос:

У меня есть следующий код, после нескольких итераций. Ни один из них не работает. Я получил это на основе примеров непосредственно из DYMO, а также других вопросов, размещенных здесь. По-прежнему ничего не работает. Когда я нажимаю на кнопки, никакой реакции вообще.

 <input id="btnUnitPrint" type="button" value="Print Unit Label" onclick = "printunitLabel()"/><br />
<input id="btnOrderPrint" type="button" value="Print Order Label" onclick = "printorderLabel()"/><br />
<script type="text/javascript">  
    function printunitLabel() {

        var printer = dymo.label.framework.getLabelWriterPrinters()[0].modelName;
        printerName = printer.name; 

        var label = DYMO.Label.Framework.Label.Open("UnitLabel.label");
        var company = document.getElementById('<%= txtcompany.Text %>').value;
        var customer = document.getElementById('<%= txtcustomer.Text %>').value;
        var serial = document.getElementById('<%= txtserial.Text %>').value;
        var unit = document.getElementById('<%= txtunit_manuf.Text   txtunit_model.Text %>').value;
        var warranty = document.getElementById('<%= ddlWarranty.Text %>').value;
        label.SetObjectText("lblcompany", company);
        label.SetObjectText("lblcustomer", customer);
        label.SetObjectText("lblserial", serial);
        label.SetObjectText("lblunit", unit);
        label.SetObjectText("txtWarranty", warranty);

        label.print(printerName);
    }  
    function printorderLabel() {

        var printer = dymo.label.framework.getLabelWriterPrinters()[0].modelName;
        printerName = printer.name;

        var label = DYMO.Label.Framework.Label.Open("OrderLabel.label");
        var company = document.getElementById('<%= txtcompany.Text %>').value;
        var customer = document.getElementById('<%= txtcustomer.Text %>').value;
        var order = document.getElementById('<%= txtorder_id.Text %>').value;
        label.SetObjectText("lblcompany", company);
        label.SetObjectText("lblcustomer", customer);
        label.SetObjectText("lblorder", order);
        label.Print(printer);

        label.print(printerName);
    } 
</script>
  

ОБНОВЛЕНИЕ, эта панель содержит все переменные, которые я хочу передать в шаблон метки.

 <asp:Panel ID="confirmation_panel" runat="server" Height="457px" Style="margin-right: 0px" Width="1040px" BorderStyle="Double" BorderWidth="2px">
    <br />
    <table style="width: 469px; height: 385px;">
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblorder_id" runat="server" Text="Order ID:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtorder_id" runat="server" ReadOnly="True" Width="231px" Height="22px" ></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblunit_id" runat="server" Text="Unit ID:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtunit_id" runat="server" ReadOnly="True" Width="231px" Height="22px" ></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="Label5" runat="server" Text="Company Name:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtcompany" runat="server" ReadOnly="True" Width="231px" Height="22px" NullDisplayText=""></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="Label6" runat="server" Text="Client Name:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtcustomer" runat="server" ReadOnly="True" Width="231px" Height="22px" ></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblunit_manuf" runat="server" Text="Unit Manufacturer:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtunit_manuf" runat="server" ReadOnly="True" Width="231px" Height="22px" ></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblunit_model" runat="server" Text="Unit Model:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtunit_model" runat="server" ReadOnly="True" Width="231px" Height="22px" ForeColor="Red"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblserial" runat="server" Text="Serial Number:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtserial" runat="server" ReadOnly="True" Width="231px" Height="22px" ForeColor="Red"></asp:TextBox>
            </td>
        </tr>
         <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblWUserial" runat="server" Text="Whole Unit Serial Number:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:TextBox ID="txtWUserial" runat="server" ReadOnly="True" Width="231px" Height="22px"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td class="modal-sm" style="width: 1231px">
                <asp:Label ID="lblwarranty" runat="server" Text="Warranty Status:"></asp:Label>
            </td>
            <td style="height: 34px; width: 326px;">
                <asp:DropDownList ID="ddlWarranty" Width="231px" Height="22px" runat="server">
                    <asp:ListItem>Warranty Expired</asp:ListItem>
                    <asp:ListItem>Warranty Active</asp:ListItem>
                    <asp:ListItem>N/A</asp:ListItem>
                </asp:DropDownList>
            </td>
        </tr>
        </table>
</asp:Panel>
  

Комментарии:

1. Нет, не нужно так себя чувствовать. Не могли бы вы добавить HTML с company , customer serial и т.д. на ваш вопрос. И давайте удалим некоторые из этих комментариев, освободив место для новых. 😉

2. Я обновил вопрос с помощью HTML, который вы запрашиваете. Спасибо!

Ответ №1:

Я попытался просмотреть самую последнюю документацию, но ее так мало, и все это кажется очень устаревшим. Ниже я привел пример того, как должна выглядеть ваша форма (в основном), заключенная в <form> элемент.

Вам понадобится последняя версия dymo.label.framework.js фреймворка для загрузки функциональности DYMO в браузер.

Приведенный ниже код в основном выполняет то же самое, что и то, что вы пробовали выше, с ключевым отличием, что теперь он асинхронный, что означает, что он не будет блокировать код при попытке вычислить дорогостоящие задачи, что хорошо!

Создание label with dymo.label.framework.open все еще является своего рода предположением. Я видел примеры с dymo.label.framework.openLabelXml и один с изображением, так что вам решать, какой из них подходит для вас. Опять же, с ограниченной документацией трудно понять, что она делает.

Приведенный ниже пример основан на этой статье на сайте разработчиков DYMO. Я надеюсь, что это поможет

 <form id="label-form">
  <input type="text" name="company">
  <input type="text" name="customer">
  <input type="text" name="serial">
  <input type="text" name="unit">
  <input type="text" name="warranty">
  <input id="btnUnitPrint" type="button" value="Print Unit Label"/>
  <input id="btnOrderPrint" type="button" value="Print Order Label"/>
</form>
  
 <!-- Look for the latest dymo.label.framework.js script and place it here -->
<script src="dymo.label.framework.js" type="text/javascript" charset="UTF-8"></script>
<script>
const labelForm = document.getElementById('label-form');
const printUnitButton = document.getElementById('btnUnitPrint');
const printOrderButton = document.getElementById('btnOrderPrint');

function startupCode() {
   
   // Gets all the printers, asynchronously.
   dymo.label.framework.getPrintersAsync().then(function(printers) {

     // Check for available printers.
     if (printers.length === 0) {
       throw Error('No DYMO printers are installed. Install DYMO printers.');
     }
      
     // Select the first printer in the list that has the
     // type of "LabelWriterPrinter" and use that as the printer.
     const printer = printers.find(printer => printer.printerType === "LabelWriterPrinter");

     // Get the name of that printer.
     const printerName = printer.name;

     // Create the label.
     // You'll need to check on your own if this is the way to
     // properly create the label.
     const label = dymo.label.framework.open('OrderLabel.label');

     const printUnit = function printUnit() {
       const formData = new FormData(labelForm);
       const customer = formData.get('customer');
       const company = formData.get('company');
       const serial = formData.get('serial');
       const unit = formData.get('unit');
       const warranty = formData.get('warranty');
       label.setObjectText('lblcompany', company);
       label.setObjectText('lblcustomer', customer);
       label.setObjectText('lblserial', serial);
       label.setObjectText('lblunit', unit);
       label.setObjectText('txtWarranty', warranty);
       label.print(printerName);
     }

     const printOrder = function printOrder() {
       const formData = new FormData(labelForm);
       const customer = formData.get('customer');
       const company = formData.get('company');
       const order = formData.get('order');
       label.setObjectText('lblcompany', company);
       label.setObjectText('lblcustomer', customer);
       label.setObjectText('lblorder', order);
       label.print(printerName);
     }

     // Print unit on printUnitButton click.
     printUnitButton.addEventListener('click', printUnit);
 
     // Print order on printOrderButton click.
     printOrderButton.addEventListener('click', printOrder);   

  });

}

function frameworkInitHelper() {
  dymo.label.framework.init(startupCode);
}
</script>
  

Комментарии:

1. Большое вам спасибо! Я собираюсь попробовать это первым делом утром и обновлю, если это сработает! 🙂

2. Я получаю эти ошибки в консоли. Mixed Content: The page at 'https://localhost:44331/OrderUnitStatus' was loaded over HTTPS, but requested an insecure script 'http://labelwriter.com/software/dls/sdk/js/DYMO.Label.Framework.latest.js'. This request has been blocked; the content must be served over HTTPS. а также Uncaught ReferenceError: printunitLabel is not defined at HTMLInputElement.onclick (OrderUnitStatus:316) и Uncaught ReferenceError: printorderLabel is not defined at HTMLInputElement.onclick (OrderUnitStatus:317) .

3. Я все еще не уверен, правильно ли я поступаю там, где вы сказали <!-- Look for the latest dymo.label.framework.js script and place it here --> . Я заменил этот текст на этот <script src="http://labelwriter.com/software/dls/sdk/js/DYMO.Label.Framework.latest.js type="text/javascript" charset="UTF-8"></script>

4. Удалите http: часть из строки в скрипте. Ваш сайт — HTTPS, что означает, что он требует, чтобы все последующие скрипты также загружались с использованием HTTPS вместо HTTP. Удаление протокола из строки приведет к тому, что браузер проверит, существует ли HTTPS-версия сценария или иным образом вернется к HTTP.

5. В вашем HTML есть 2 onclick атрибута. Удалите их из своих входных данных. Сценарий, который я предоставил выше, использует addEventListener из сценария, чтобы сделать то же самое. Я сделал это, потому что я думаю, что именно так вы должны использовать прослушиватели событий с этого момента. Это позволит разделить ваш HTML и JavaScript и упростит прослушивание событий.