Как напечатать изображение в режиме raw в C #? - PullRequest
0 голосов
/ 03 февраля 2012

Я пытаюсь печатать текст и изображения прямо на принтер, не проходя мимо драйверов Windows.Я должен печатать таким образом, потому что это приложение предназначено для серийных игольчатых принтеров, и если я пытаюсь печатать, используя метод Графика

/*Text Print*/
_printPageEventArgs.Graphics.DrawString(
    _printArray.ElementAt(i).Text,
    _printArray.ElementAt(i).Font,
    Brushes.Black,
    ClientRectangle,
    stringFormat);

/*Image Print*/
printPageEventArgs.Graphics.DrawImage(
   _printArray.ElementAt(i).Image,
    _printArray.ElementAt(i).StartPosX_100Inch,
    _printArray.ElementAt(i).FinalStartPosY_100Inch,
    _printArray.ElementAt(i).ImageWidth_100Inch,
    _printArray.ElementAt(i).ImageHeight_100Inch);

, принтер печатает что-либо навсегда.Поэтому я использую DLL-библиотеку принтера для прямой записи

public static extern UInt32 PrtWrite(IntPtr hPrt, byte[] pbWriteBuffer, 
    UInt32 nNumberOfBytesToWrite, ref UInt32 lpNumberOfBytesWritten);

Но я не могу преобразовать изображение в правильный формат байтов.Пробовал это преобразование, но ни один не работал, все, что я получаю, это искаженный текст:

//TEST 1
UInt32 dwNoOfBytesWritten = 0;
Image img = Image.FromFile(@"c:\zzz.jpg");
ImageConverter converter = new ImageConverter();
byte[] imageToPrint = (byte[])converter.ConvertTo(img, typeof(byte[]));
PrtWrite(_printerPointer, imageToPrint, (UInt32)imageToPrint.Length, 
    ref dwNoOfBytesWritten);

//TEST 2
UInt32 dwNoOfBytesWritten = 0;
Image img = Image.FromFile(@"c:\zzz.jpg");
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] imageToPrint = ms.ToArray();
PrtWrite(_printerPointer, imageToPrint, (UInt32)imageToPrint.Length, 
    ref dwNoOfBytesWritten);

Это API для принтеров Wincor Nixdorf.

В их SDK метод определен как:

extern "C" __declspec(dllimport) DWORD PrtWrite (HANDLE hPRT, 
    LPBYTE pbWriteBuffer, DWORD dwLenWriteBuffer, LPDWORD pdwNoOfBytesWritten);

И это все, что я из их руководства:

Функция PrtWrite записывает в принтер nNumberOfBytesToWrite байтов содержимого pbWriteBuffer.Эта функция может использоваться для отправки данных любого типа, обычных данных печати, а также последовательностей управления принтером.

Обратите внимание, что PrtWrite не обеспечивает сопоставление кодов символов.Таким образом, распечатка зависит от загруженного генератора символов.

hPrt -> Дескриптор принтера, возвращенного PrtOpen.

pbWriteBuffer -> Указатель на буфер, содержащий данные, которые будут записаны на принтер

nNumberOfBytesToWrite -> Указывает количество байтов для записи на принтер

lpNumberOfBytesWritten -> Указатель на переменную, которая получает количество записанных байтов

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Потоковая передача данных в формате JPEG прямо на принтер наверняка не будет работать.Многие старые принтеры работали, выгружая ASCII прямо на принтер и превращая его в символы.Я знаю, что EPSON, например, все еще использовал свой старый протокол, по крайней мере, в конце 90-х.Чтобы получить графику, нужно отправить «escape-последовательности».Это блоки данных, которые начинаются с escape-символа и включают в себя специально отформатированные данные.В 80-е годы это было не так, и это была основная причина, по которой люди начали писать драйверы печати в первую очередь: каждый производитель использовал разные последовательности и / или имел разные ошибки в своих протоколах.

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

0 голосов
/ 28 февраля 2012

В SDK / драйвере принтера Wincor Nixdorf используется принтер CEN / XFS, и его необходимо правильно инструктировать. Вывод произвольных двоичных данных, к сожалению, не даст вам изображение в печатном виде. Если вы хотите сделать что-то подобное, посмотрите драйверы GDI. Они делают перевод между этими мирами.

PrintRaw может использоваться для отправки последовательностей байтов непосредственно на устройство принтера. Строка может содержать известные escape-последовательности принтера или макросы. У меня нет руководства по escape-последовательностям или макросам, но, пожалуйста, свяжитесь с Wincor Nixdorf HQ или с вашим поставщиком и попросите у них документацию CSCW или CSCO. Это должно содержать примеры, которые вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...