Печать растрового изображения на всю ширину страницы с помощью ESC / POS

В настоящее время я использую Android PrintService, который может печатать PDF-файлы с помощью термопринтеров. Мне удалось преобразовать PDF в растровое изображение с помощью PDFRenderer, и я даже могу распечатать документ.

Дело в том, что документ (растровое изображение) не на всю ширину страницы.

Я получаю документ с разрешением 297x420 и использую принтер с бумагой 58 мм.

Вот как я обрабатываю документ (написанный на C # с использованием Xamarin):

// Create PDF renderer
var pdfRenderer = new PdfRenderer(fileDescriptor);  

// Open page
PdfRenderer.Page page = pdfRenderer.OpenPage(index);

// Create bitmap for page
Bitmap bitmap = Bitmap.CreateBitmap(page.Width, page.Height, Bitmap.Config.Argb8888);

// Now render page into bitmap
page.Render(bitmap, null, null, PdfRenderMode.ForPrint);

А затем конвертируем растровое изображение в ESC / POS:

// Initialize result
List<byte> result = new List<byte>();

// Init ESC/POS
result.AddRange(new byte[] { 0x1B, 0x33, 0x21 });

// Init ESC/POS bmp commands (will be reapeated)
byte[] escBmp = new byte[] { 0x1B, 0x2A, 0x01, (byte)(bitmap.Width % 256), (byte)(bitmap.Height / 256) };

// Iterate height
for (int i = 0; i < (bitmap.Height / 24 + 1); i++)
{
    // Add bitmapp commands to result
    result.AddRange(escBmp);

    // Init pixel color
    int pixelColor;

    // Iterate width
    for (int j = 0; j < bitmap.Width; j++)
    {
        // Init data
        byte[] data = new byte[] { 0x00, 0x00, 0x00 };

        for (int k = 0; k < 24; k++)
        {
            if (((i * 24) + k) < bitmap.Height)
            {
                // Get pixel color
                pixelColor = bitmap.GetPixel(j, (i * 24) + k);

                // Check pixel color
                if (pixelColor != 0)
                {
                    data[k / 8] += (byte)(128 >> (k % 8));
                }
            }
        }

        // Add data to result
        result.AddRange(data);
    }

    // Add some... other stuff
    result.AddRange(new byte[] { 0x0D, 0x0A });
}

// Return data
return result.ToArray();

Текущий результат выглядит следующим образом:  введите описание изображения здесь

Спасибо всем заранее.


person Filip Matys    schedule 30.05.2018    source источник
comment
Вы хотите распечатать всю страницу?   -  person FreakyAli    schedule 30.05.2018
comment
Да, прости. Исправлен заголовок и текст.   -  person Filip Matys    schedule 30.05.2018


Ответы (1)


В наборе команд ESC / POS нет волшебной команды "scale-to-page-width", вам нужно знать максимальную ширину вашего принтера, доступную в руководстве, а затем вы можете:

  • Удвойте ширину и высоту для некоторых команд вывода изображения - вы используете ESC *, который поддерживает низкую плотность, но высота и ширина изменяются в разных соотношениях.
  • Для начала сделайте PDF шире - сопоставьте размер растрового изображения с шириной страницы принтера, а не с шириной страницы PDF. Та же проблема решается с помощью масштаба настройки PDFrenderer до экрана
  • Вы также можете просто растянуть изображение перед отправкой, если вас устраивает низкое качество. См .: Как изменить размер растрового изображения в Android?

Кроме того, ваша ESC * реализация неверна. Для ширины есть два байта. Обратитесь к руководству ESC / POS для правильного использования или прочитайте правильные реализации на PHP или Python, которые я связал в другом вопросе: ESC Команда POS ESC * для печати растрового изображения на принтере

person mike42    schedule 30.05.2018
comment
Масштабирование помогло, спасибо. Пытался это сделать раньше, но извлекал из принтера случайные символы. Нашел порог, и теперь он отлично печатает :). - person Filip Matys; 30.05.2018