Я пытаюсь печатать текст и изображения прямо на принтер, не проходя мимо драйверов 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 -> Указатель на переменную, которая получает количество записанных байтов