[英]How to print an image in raw mode in C#?
我正在尝试直接将文本和图像打印到打印机,而无需通过Windows驱动程序。 我必须以这种方式进行打印,因为该应用程序适用于串行针式打印机,并且如果我尝试使用Graphics方法进行打印
/*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);
这是Wincor Nixdorf打印机的API。
在他们的SDK中,该方法定义为:
extern "C" __declspec(dllimport) DWORD PrtWrite (HANDLE hPRT,
LPBYTE pbWriteBuffer, DWORD dwLenWriteBuffer, LPDWORD pdwNoOfBytesWritten);
这就是我从他们的手册中得到的全部:
PrtWrite函数将pbWriteBuffer的内容的nNumberOfBytesToWrite字节写入打印机。 该功能可用于发送任何类型的数据,常规打印数据以及打印机控制序列。
请注意,PrtWrite不提供字符代码映射。 因此,打印输出取决于加载的字符生成器。
hPrt->处理由PrtOpen返回的打印机。
pbWriteBuffer->指向包含要写入打印机的数据的缓冲区的指针
nNumberOfBytesToWrite->指定要写入打印机的字节数
lpNumberOfBytesWritten->指向接收写入字节数的变量的指针
毫无疑问,将jpeg数据直接传输到打印机将无法正常工作。 许多较旧的打印机通过将ASCII直接转储到打印机并将其转换为字符来工作。 我知道,例如,EPSON至少在90年代后期仍在使用其旧协议。 为了获得图形,一个发送了“转义序列”。 这些是以转义符开头的数据块,其中包括专门格式化的数据。 这在80年代是原始的,这几乎是人们开始编写打印驱动程序的全部原因:每个制造商使用不同的序列和/或在其协议中存在不同的错误。
因此,您将需要任何可用于打印协议的文档,以便可以实施它,然后您必须解决所有的错误和怪癖,其中至少有一个得到保证。 如果找不到该文档,也许您可以找到一个可以分拆的开源UNIX驱动程序。
Wincor Nixdorf打印机SDK /驱动程序实现了CEN / XFS打印机,需要以正确的方式进行说明。 不幸的是,转储任意二进制数据不会以硬拷贝形式提供图像。 如果您想做类似的事情,请查看GDI驱动程序。 这些在这些世界之间进行翻译。
PrintRaw可用于直接将字节序列发送到打印机设备。 该字符串可以包含打印机已知的转义序列或宏。 我手头没有转义序列或宏的手册,但是请联系Wincor Nixdorf HQ或您的供应商,并要求他们提供CSCW或CSCO文档。 这应该包含您要查找的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.