高手在哪里,老问题,但现在急用,关于直接操作并口来控制无硬字库的打印机打印汉字的问题。500分,不够再加!(300分)

阿蛮

Unregistered / Unconfirmed
GUEST, unregistred user!
在Epson TM88II无中文字库的打印机中,不通过驱动程序,直接用打印机的POS代码操作并口
来控制打印机,但打印出来的中文是乱码,哪位高手能帮帮忙搞定他,分不够再加。
 
没有硬字库只能发送图形数据,你发ASCII码当然是乱码了。
 
同意楼上的观点
这个好象很困难哦!
 
那么怎么发送图形数据呢?
 
同意2楼的观点
 
呵呵,想不通你想干什么。
Windows下都是由系统产生汉字的图形数据送往打印机的。
你可以安装好驱动程序,让word打印到文件中1.bin,然后:
copy 1.bin prn /b
这个1.bin就是直接送往打印机的图形数据。至于怎么产生的,需要知道ttf字库的算法。
 
我是要打印票据,但通过打印机驱动程序打印出来的票据走纸和裁纸都不精确,相差数厘米,
所以不能通过驱动打印,只能通过打印机的POS直接控制打印机输出,但这样的话,打印机
中没有硬字库,打印出来的中文全成了乱码,哪位富翁能帮帮忙,把我不通过驱动直接打印
中文出来。
 
//这个是我今天中午答别人的,你参考一下:
Assignfile(MyFile,'lpt1');//'com1,com2...'
Rewrite(MyFile);
strTemp := '中国人';
writeln(MyFile, FormatPRNString(strTemp));
System.CloseFile(MyFile);

Function FormatPRNString(str:string):string;
//将要打印的字符串转换成相应打印格式,适应于:EPSON TM300系统列
//刚写的,看看吧
var
ch:char;
i:integer;
chinese:boolean;
begin
chinese:=false;
i:=1;
while i<=length(str)do
begin
ch:=str;
if ch>#127 then
if str[i+1]>#127 then
//一个完整折汉字
begin
if not chinese then
result:=result+#28+#38;
chinese:=true;
result:=result+ch+str[i+1];
inc(i);
end
else
//半个汉字
begin
if chinese then
result:=result+#28+#46;
chinese:=false;
result:=result+#32;
end
else
//ASCII码
begin
if chinese then
result:=result+#28+#46;
chinese:=false;
result:=result+ch;
end;
inc(i);
end;
end;
 
to: mphst
  谢谢你的代码,不过我用你这段代码打印出来的还是乱码。[:(]
我用的是TM88II打印机。
 
to: mphst
楼上代码如果是带硬字库的打印机是可以的,但对于没有硬字库的打印机也一样是打乱码,请问如何对没字库的打印机如何打印汉字???
 
是啊,急Help...
 
TM88II应该也是ESC/P-K或ESC/P-K2指令集,如果是,就可以直接取汉字字模。
用ESC/P-K的指令 ESC 39 42 直接发送图像数据打印。需要注意的是:
图像数据是每列24位,需要分成3个shortint发送。
我是delphi新手,只能提供这么多了,建议你找一本ESC/P-K的指令集的书看看,
一般Epson打印机应该都有的。
你先向打印机直接发送以下数据看看打印出了什么
27,39,42,0,
0,0,63,0,0,127,0,0,255,0,3,255,0,15,255,0,31,255,0,127,255,0,255,255,1,
255,255,3,255,255,7,255,255,15,255,255,31,255,234,31,255,252,31,255,248,
31,255,240,31,255,224,31,255,192,31,255,254,31,255,252,31,255,248,31,255,
240,31,255,224,31,255,192,31,255,0,31,252,0,31,252,0,31,240,0,31,224,0,
31,128,0,31,240,0,31,255,192,28,255,224,28,127,240,28,15,248,31,0,252,
31,0,126,15,128,15,7,192,7,3,240,7,1,254,7,0,255,7,0,127,135,0,31,199,
0,7,231,0,1,247,0,0,255,0,0,127,0,0,63
 
给你说个思路,代码你自己去实现:
一、找一个点阵字库(Ucdos带的就不错)
二、通过汉字的区位码算出汉字在字库的移量
三、从字库中取出汉字的字模
四、把字模用点阵的方式输出到打印机
五、大功告成
我当年就是这样做的,且效果还不错。
 
乡巴佬大哥,你的建议很好,能否具体点吗?帮人帮到底嘛。
 
是啊,帮帮我们这些无辜的劳动人民吧。
 
to topkins:
这段代码打出了好多乱七八糟的东西,我也不知道是什么,我手头上有POS代码,打印
其它的东东还能看得懂,但就是直接发送图像数据这部分看不懂。
 
ESC指令的图像信息是以点阵信息发送的,详细的说就是:
如果想打印“中”
16*16点阵信息为
0000000100000000
0000000100000000
0010000100001000
0011111111111100
0010000100001000
0010000100001000
0010000100001000
0010000100001000
0010000100001000
0011111111111000
0010000100001000
0000000100000000
0000000100000000
0000000100000000
0000000100000000
0000000100000000
如果要按图像打印的话 就要按列从上向下发送点阵信息
也就是说要发送
第1列0.0.0
第2列0.0.0
第3列63.224.0
第4列16.64.0
依次类推 打印16列,就完成一个汉字
关于取得汉字字模问题,在以前的书上(DOS编程)很容易找到,大体思路为:
一个16*16点阵信息需要32字节,按照汉字的区位码(汉字的第1个字节的asc-160=区码
汉字的第2个字节的asc-160=位码 (区码*94+位码)*32=偏移地址,有点记不清了,建议
测试)很容易定位,然后取出32字节就是该汉字点阵信息,需要注意的是:大多数字库的
点阵信息是按行保存的,需要转换成列信息。
 
能用delphi代码写出来吗?
 
没有字库也可以打中文的,像以前旧的Epson fx系列没有中文字库,用word等字处理软件只要驱动安装正确,能打印中文文档。
至于打票据,可考虑用delphi 的Tprinter对象。如果一定要直接控制打印机,要用图形模式,研究一下Epson TM88II的用户手册,
将要打印文字变成图形点阵,然后按照规定的格式送打印机,这样做是很累的。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
顶部