2013-07-11 171 views
2

我试图使用C++中的writePrinter方法将亚洲语言字符打印到行式打印机(EPSON LQ-2090)。使用WritePrinter API将汉字打印到行式打印机

ANSI字符打印质量很好,但是当我把亚洲语言字符放在它上面时,它们就像垃圾一样出来。

请注意,如果我将DocInfo数据类型参数更改为“TEXT”而不是“RAW”,那么亚洲语言字符也不会打印。

有没有办法让亚洲语言或Unicode字符正确打印?

+1

标准C++没有函数writePrinter,所以你可能想告诉/标记你正在使用的库/ API – PlasmaHH

+0

我想你正在使用Windows API writePrinter – witrus

+0

是的,它是Windows API。 – user2572349

回答

2

当您使用WritePrinter()时,您会绕过打印机驱动程序并将打印命令直接写入打印机。这通常会使这种点阵式打印机的输出速度加快lot。但是你会错过Windows内置的支持来渲染任意字体。您将使用内置于打印机固件中的字体。这通常是非常适中的,只支持只有几种风格的西方字形。并需要特殊的转义命令才能激活。

您需要打印机的编程手册来了解如何切换字体。如果固件不支持您需要的字形,那么您可以重新将打印机转换为图形而不是文本模式。使其像打印机驱动程序一样慢,但会增加生成图形绘制命令的麻烦。

+0

谢谢Hans Passant帮助我很多,我需要在90秒内打印60行。其种类的要求,我认为这是不可能的,如果我使用图形模式,而不是文本模式。有什么方法可以更改字体,以便我可以打印亚洲语言字符? – user2572349

+0

你能告诉我吗。是否有任何替代writePrinter API?这将不会绕过打印机驱动程序。我不想使用DrawTextEx API。 – user2572349

+0

不,没有其他选择。我当然会在答案中提到它。 –

0

打印像垃圾这样的亚洲语言字符是一种编码问题,我正在使用EPSON LQ-1600KIIIH,它支持gbk原始缓冲区,正如您所提到的WritePrinter需要LPVOID缓冲区,您需要做的是正确编码缓冲区,例如,用qt QTextCodec来编码UTF-16流进GBK缓冲区,然后WritePrinter:

// Message to print contains chinese "中文" 
QString msg("\u4e2d\u6587") 

// Encoding, from UTF-16 to GBK (my locale encoding) 
QByteArray bmsg = QTextCodec::codecForLocale()->fromUnicode(msg); 

// Write operation 
WritePrinter(m_PrinterHandle,bmsg.data(), bmsg.size(), &dwBytesWritte); 

bmsg.data()的返回GBK编码字符*缓冲器 '\ XD6 \ XD0 \ XCE \ XC4'。

您需要找出EPSON LQ-2090支持哪种编码方式,不同地区和国家出售的打印机可能会有不同的内置编码,希望对您有用。

我的经验是,WritePrinter没有绕过打印机驱动程序,因为如果安装了错误的驱动程序,打印机会出现意外情况。