Задать вопрос
@romaro

Как передать изображение на принтер TSC?

Использую TSPL2. Код обработчика:

private void button_Click(object sender, RoutedEventArgs e)
        {
            string testFileName = "TEST_PNG.png";

            string testFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), testFileName);

            byte[] bytes = File.ReadAllBytes(testFilePath);
            string hexString = BitConverter.ToString(bytes).Replace("-", "");
            string base64String = Convert.ToBase64String(bytes);

            // DOWNLOAD F - for save to flash memory
            string downloadCmd = $"DOWNLOAD \"{testFileName}\",{new System.IO.FileInfo(testFilePath).Length},{base64String}";

            string putCmd = $"PUTPNG 50,50,\"{testFileName}\"";

            TscLibWrapper.OpenPort("usb");

            TscLibWrapper.SendCommand("DIRECTION 1");
            TscLibWrapper.SendCommand("SET PEEL OFF");
            TscLibWrapper.SendCommand("SET CUTTER OFF");
            TscLibWrapper.SendCommand("SET CUTTER OFF");
            TscLibWrapper.SendCommand("SET PARTIAL_CUTTER OFF");
            TscLibWrapper.SendCommand("SET TEAR ON");
            TscLibWrapper.SendCommand("CODEPAGE 1251");
            TscLibWrapper.SendCommand("SIZE 58 mm,40 mm");
            TscLibWrapper.SendCommand("CLS");
            TscLibWrapper.SendCommand("SIZE 58 mm,40 mm");

            TscLibWrapper.SendCommand(downloadCmd);
            TscLibWrapper.SendCommand(putCmd);

            TscLibWrapper.PrintLabel("1", "1");

            TscLibWrapper.SendCommand($"KILL \"{testFileName}\"");

            TscLibWrapper.ClosePort();
        }


Принтер печатает пустую этикетку. Файл на принтер отправляется (проверяю через DiagTool).Скорее всего я как-то не правильно кодирую PNG-файл (пробовал HEXбез пробелов, Base64).

Если файл загрузить на принтер через его утилиту, то PUTPNG отрабатывает штатно, т.е. с файлом проблем нет.
  • Вопрос задан
  • 41 просмотр
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик игр на Unity
    13 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unity: тариф Базовый
    6 месяцев
    Далее
  • Stepik
    PRO C#. Профессия "Backend разработчик"
    4 месяца
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
base64 тут сломан сразу — принтер получает текстовую строку вместо PNG-байт, поэтому PUTPNG не видит валидного файла.

Команда DOWNLOAD после длины ждёт сырые байты, а SendCommand(string) тут не подходит: нулевые байты в PNG обрежет или перекодирует.

Правильный вариант: склеить ASCII-заголовок и сырые байты, отправить raw-записью:
var bytes = File.ReadAllBytes(path);
var header = Encoding.ASCII.GetBytes($"DOWNLOAD \"{name}\",{bytes.Length},");
var raw = header.Concat(bytes).Concat(new byte[]{0x0D,0x0A}).ToArray();
// WriteFile/BeginDocPrinter, не SendCommand


Если TscLibWrapper не умеет raw-write, либо пиши напрямую в порт, либо конвертируй PNG в PCX и используй downloadpcx.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы