2015-10-27 1 views
1

Я думаю, что я очень близок к тому, чтобы это печатать. Однако это все еще не так. Нет никакого исключения, и он, похоже, попадает в принтер зебры, но ничего. Его длинный выстрел, поскольку я думаю, что большинство людей находятся в одном и том же положении и я мало знаю об этом. Любая помощь, которую любой может дать независимо от того, насколько мал будет приветствоваться, я теряю желание житьПринтер Zebra - не печать PNG Stream * При условии, что мой собственный ответ *

using (var response = request.GetResponse()) 
      { 
       using (var responseStream = response.GetResponseStream()) 
       { 
        using (var stream = new MemoryStream()) 
        { 
         if (responseStream == null) 
         { 
          return; 
         } 

         responseStream.CopyTo(stream); 
         stream.Position = 0; 

         using (var zipout = ZipFile.Read(stream)) 
         { 
          using (var ms = new MemoryStream()) 
          { 
           foreach (var e in zipout.Where(e => e.FileName.Contains(".png"))) 
           { 
            e.Extract(ms); 
           } 

           if (ms.Length <= 0) 
           { 
            return; 
           } 

           var binaryData = ms.ToArray(); 

           byte[] compressedFileData; 

           // Compress the data using the LZ77 algorithm. 
           using (var outStream = new MemoryStream()) 
           { 
            using (var compress = new DeflateStream(outStream, CompressionMode.Compress, true)) 
            { 
             compress.Write(binaryData, 0, binaryData.Length); 
             compress.Flush(); 
             compress.Close(); 
            } 
            compressedFileData = outStream.ToArray(); 
           } 

           // Encode the compressed data using the MIME Base64 algorithm. 
           var base64 = Convert.ToBase64String(compressedFileData); 

           // Calculate a CRC across the encoded data. 
           var crc = Calc(Convert.FromBase64String(base64)); 

           // Add a unique header to differentiate the new format from the existing ASCII hexadecimal encoding. 
           var finalData = string.Format(":Z64:{0}:{1}", base64, crc); 

           var zplToSend = "~DYR:LOGO,P,P," + finalData.Length + ",," + finalData; 
           const string PrintImage = "^XA^FO0,0^IMR:LOGO.PNG^FS^XZ"; 

           try 
           { 
            var client = new System.Net.Sockets.TcpClient(); 
            client.Connect(IpAddress, Port); 

            var writer = new StreamWriter(client.GetStream(), Encoding.UTF8); 
            writer.Write(zplToSend); 
            writer.Flush(); 
            writer.Write(PrintImage); 
            writer.Close(); 
            client.Close(); 
           } 
           catch (Exception ex) 
           { 
            // Catch Exception 
           } 
          } 
         } 
        } 
       } 
      } 

    private static ushort Calc(byte[] data) 
    { 
     ushort wCrc = 0; 

     for (var i = 0; i < data.Length; i++) 
     { 
      wCrc ^= (ushort)(data[i] << 8); 

      for (var j = 0; j < 8; j++) 
      { 
       if ((wCrc & 0x8000) != 0) 
       { 
        wCrc = (ushort)((wCrc << 1)^0x1021); 
       } 
       else 
       { 
        wCrc <<= 1; 
       } 
      } 
     } 

     return wCrc; 
    } 

ответ

1

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

PrintImage

^XA Start Format Описание команды^XA используется в начале ZPL кода II. Это открывающая скобка и указывает начало нового формата этикетки. Эта команда заменяется одним управляющим символом ASCII STX (control-B, hexadecimal 02). Формат^XA Комментарии. Действительный формат ZPL II требует, чтобы форматы меток начинались с команды^XA и заканчивались командой^XZ.

^FO Field Origin Описание Команда^FO задает начало поля относительно позиции метки (^ LH).^FO устанавливает верхний левый угол области поля, определяя точки вдоль оси x и оси y, не зависящие от вращения. Формат^лисица, у, г

  • х = х-оси местоположение (в точках) Допустимые значения: от 0 до 32000 По умолчанию Значение: 0
  • у = у-оси местонахождения (в точках) Допустимые значения: 0 до 32000 Значение по умолчанию: 0
  • z = обоснование Параметр z только поддерживается в версиях прошивки V60.14.x, V50.14.x или новее. Принятые значения: 0 = выравнивание по левому краю 1 = правое обоснование 2 = автоматическое обоснование (в зависимости от сценария) Значение по умолчанию: последний принял^FW значение или^FW по умолчанию

^IM Изображение Move Описание^IM-команда выполняет прямое перемещение изображения из области памяти в растровое изображение. Команда идентична команде^XG (Recall Graphic), за исключением параметров калибровки. Формат^IMD: вола

  • д = расположение хранимых объектов Допустимые значения: R :, E :, B :, и А: Значение по умолчанию: поиск приоритет
  • имя объекта о = Допустимые значения: от 1 до 8 буквенно-цифровые символы Значение по умолчанию: если имя не указано, UNKNOWN используется
  • х = расширение Fixed Value: .grf, .PNG

^FS Field Separator Описание команда^FS обозначает конец определения поля. Альтернативно, команда FS также может быть выписана как один управляющий код ASCII SI (Control-O, hexadecimal 0F).Формат^FS

^XZ Конец Формат Описание Команда^XZ - это конечная (закрывающая) скобка. Он указывает конец формата метки. Когда эта команда будет принята, надпись будет напечатана. Эта команда также может быть выписана как один управляющий символ ASCII ETX (Control-C, шестнадцатеричный 03). Формат^XZ Комментарии Форматы меток должны начинаться с команды^XA и заканчиваться командой^XZ для действительного формата ZPL II.

zplToSend

^MN Медиа Tracking Описание Эта команда определяет тип используемого носителя и черной метки смещения в точках. Этот маркированный список показывает типы носителей, связанные с этой командой:

  • Continuous Media - это средства массовой информации не имеют физические характеристик (например, веб, вырезы, перфорация, черная метка) для разделения меток. Длина метки определяется командой^LL.
  • Непрерывные носители с переменной длиной - такие же, как и непрерывные носители, но если части напечатанной этикетки выходят за пределы определенной длины этикетки, размер этикеток будет автоматически расширяться, чтобы содержать их. Это расширение длины метки применяется только к текущей метке. Обратите внимание, что^MNV по-прежнему требует использования команды^LL для определения начальной требуемой длины метки.
  • Непрерывный носитель - этот носитель обладает некоторыми физическими характеристиками (такими как полотно, вырез, перфорация, черная метка) для разделения меток.

Формат^MNa, б

  • а = носитель используется Допустимые значения: N = сплошных сред Y = без сплошных сред веб зондирования D, E W = без сплошных сред веб зондирования д, e M = не непрерывное считывание метки носителя A = автоматическое определение типа носителя во время калибровки d, f V = непрерывный носитель, переменная длина g Значение по умолчанию: значение должно быть введено или команда игнорируется
  • b = черный смещение метки в точках Это устанавливает ожидаемое местоположение знака носителя относительно точки разделения между документами. Если установлено значение 0, ожидается, что метка носителя будет найдена в точке разделения. (то есть перфорация, точка резания и т. д.). Все значения перечислены в точках. Этот параметр игнорируется, если параметр a не установлен на M. Если этот параметр отсутствует, используется значение по умолчанию. Допустимые значения: от -80 до 283 для прямой термопечати только принтеры -240 до 566 на 600 точек на дюйм принтеров -75 до 283 для KR403 принтеров -120 до 283 для всех остальных принтеров Значение по умолчанию: 0

~ DY Загрузка объектов Описание Команда ~ DY загружает графические объекты или шрифты принтера в любом поддерживаемом формате. Эта команда может использоваться вместо ~ DG для большего количества вариантов сохранения и загрузки. ~ DY - предпочтительная команда для загрузки шрифтов TrueType на принтерах с прошивкой позже X.13. Это быстрее, чем ~ DU. Команда ~ DY также поддерживает загрузку файлов беспроводных сертификатов. Формат ~ DYD: е, б, х, т, ш, данные

Примечание При использовании файлов сертификатов, принтер поддерживает: - Использование Privacy Enhanced Почта (PEM), отформатированные файлы сертификатов. - Использование сертификата клиента и частного ключа в виде двух файлов, каждый из которых загружается отдельно. - Использование экспортируемых файлов PAC для EAP-FAST. - Zebra рекомендует использовать линейный StY

  • D = местоположение файла .NRD и .pac файлы находятся на E: в версиях прошивки V60.15.x, V50.15.x, или позже. Принятые значения: R :, E :, B :, и A: Значение по умолчанию: R:
  • f = имя файла Принимаемые значения: от 1 до 8 буквенно-цифровых символов Значение по умолчанию: если имя не указано, используется UNKNOWN
  • b = формат, загруженный в поле данных .TTE и .TTF поддерживаются только в версиях прошивки V60.14.x, V50.14.x или новее. Принимаемые значения: A = несжатый (ZB64, ASCII) B = несжатый (.TTE, .TTF, двоичный) C = AR-сжатый (используется только для Zebra's BAR-ONE® v5) P = портативная сетевая графика (.PNG) - ZB64 кодируются значение по умолчанию: значение должно быть указано

clearDownLabel

^ID Описание команды^Идентификатор удаляет объекты, графику, шрифты и сохраненные форматы из зоны хранения. Объекты могут быть удалены выборочно или группами. Эта команда может использоваться в формате печати для удаления объектов перед сохранением новых или в отдельном формате для удаления объектов.

Название изображения и расширение поддерживают использование звездочки (*) в качестве дикой карты. Это позволяет легко удалить выбранные группы объектов. Формат^IDD: вола

  • д = расположение хранимых объектов Допустимые значения: R :, E :, B :, и А: значение по умолчанию: Р:
  • Принято
  • о = имя объекта Значения: любой 1 8 символов имя Значение по умолчанию: если имя не указано, UNKNOWN используется
  • х = расширение Допустимые значения: любое расширение в соответствии с соглашениями Zebra Значение по умолчанию: .grf

    const string PrintImage = "^XA^FO0,0,0^IME:LOGO.PNG^FS^XZ"; 
        var zplImageData = string.Empty; 
    
         using (var response = request.GetResponse()) 
         { 
          using (var responseStream = response.GetResponseStream()) 
          { 
           using (var stream = new MemoryStream()) 
           { 
            if (responseStream == null) 
            { 
             return; 
            } 
    
            responseStream.CopyTo(stream); 
            stream.Position = 0; 
    
            using (var zipout = ZipFile.Read(stream)) 
            { 
             using (var ms = new MemoryStream()) 
             { 
              foreach (var e in zipout.Where(e => e.FileName.Contains(".png"))) 
              { 
               e.Extract(ms); 
              } 
    
              if (ms.Length <= 0) 
              { 
               return; 
              } 
    
              var binaryData = ms.ToArray(); 
    
              foreach (var b in binaryData) 
              { 
               var hexRep = string.Format("{0:X}", b); 
               if (hexRep.Length == 1) 
               { 
                hexRep = "0" + hexRep; 
               } 
    
               zplImageData += hexRep; 
              } 
    
              var zplToSend = "^XA" + "^FO0,0,0" + "^MNN" + "~DYE:LOGO,P,P," + binaryData.Length + ",," + zplImageData + "^XZ"; 
    
              var label = GenerateStreamFromString(zplToSend); 
    
              var client = new System.Net.Sockets.TcpClient(); 
              client.Connect(IpAddress, Port); 
    
              label.CopyTo(client.GetStream()); 
              label.Flush(); 
    
              client.Close(); 
    
              var cmd = GenerateStreamFromString(PrintImage); 
    
              var client2 = new System.Net.Sockets.TcpClient(); 
              client2.Connect(IpAddress, Port); 
    
              cmd.CopyTo(client2.GetStream()); 
              cmd.Flush(); 
    
              client2.Close();var clearDownLabel = GenerateStreamFromString("^XA^IDR:LOGO.PNG^FS^XZ"); 
    
              var client3 = new System.Net.Sockets.TcpClient(); 
              client3.Connect(IpAddress, Port); 
    
              clearDownLabel.CopyTo(client3.GetStream()); 
              clearDownLabel.Flush(); 
    
              client3.Close(); 
             } 
            } 
           } 
          } 
         } 
        } 
    
Смежные вопросы