繁体   English   中英

如何在C#中以原始模式打印图像?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM