java 连接小票机打印问题

yumendedao 2016-04-01 11:50:21
目标是我的程序和另外一个程序都可以用小票打印机打印东西,另外的程序打印很慢,要在控制面板添加打印机,不用管。
现在是这样
用下面的代码,可以正常打印小票,小票机就是超市哪种,宽48mm,一卷纸,一张小票上有所有商品信息,两个程序都能用一个打印机打印。

但是速度很慢,打印大概10CM,要七八秒,有什么方法解决这种问题吗?可以让打印速度和使用RXTX一样快。
打印机只有一台,端口是COM1。
之前就是用RXTX的方式打印,打印的速度很快,10CM的长度,大概就两秒,不需要在控制面板添加设备。但是还有其他系统要使用打印机,要在控制面板添加打印机设备,占用了COM1端口,我的程序就打印不了了。有没有办法解决这种冲突??



package cn.jiudao.print;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.ArrayList;
import java.util.List;

public class PrintDraw implements Printable {

protected final static int billPrintWidth = 140;
protected final static int fontSize = 9;
protected final static int fontGap = 2;
protected final static int blankHeight = 30;
protected final static ArrayList<String> content = new ArrayList<String>();
protected final static Font defFont = new Font("Default", Font.BOLD, fontSize);


@Override
public int print(Graphics g, PageFormat pf, int page) throws PrinterException {

if (page > 0) {
return NO_SUCH_PAGE;
}

Graphics2D g2d = (Graphics2D) g;
g2d.setFont(defFont);

System.out.println(content.get(0).length());
int indexY = 0;
for (String line : content) {
indexY += fontSize;
g2d.drawString(line, 0, indexY);
indexY += fontGap;
}

return PAGE_EXISTS;
}

public static void print(List<String> list){

content.clear();
content.addAll(list);
int height = content.size() * fontSize;

// 通俗理解就是书、文档
Book book = new Book();
// 打印格式
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);

// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。
Paper p = new Paper();
p.setSize(billPrintWidth, height + blankHeight * 3);
p.setImageableArea(0, 0, billPrintWidth, height + blankHeight * 3);
pf.setPaper(p);

// 把 PageFormat 和 Printable 添加到书中,组成一个页面
book.append(new PrintDraw(), pf);

// 获取打印服务对象
PrinterJob job = PrinterJob.getPrinterJob();
// PrintService[] lookupPrintServices = PrinterJob.lookupPrintServices();
// DocPrintJob createPrintJob = lookupPrintServices[0].createPrintJob();
// createPrintJob.
job.setPageable(book);
try {
job.print();
} catch (PrinterException e) {
System.out.println("=======打印异常");
}

}

}
...全文
352 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yumendedao 2016-04-13
  • 打赏
  • 举报
回复
附上打印文字模式的代码,主要是打印机的参数flavor ,有很多种,要看需求了


protected final static DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
private static PrintService defaultPrintService = PrintServiceLookup.lookupDefaultPrintService();
	
public static void print(List<String> list) {

		printJbo = defaultPrintService.createPrintJob();
		content.clear();
		content.addAll(list);

		String data = "";
		data += '\n';
		data += '\n';
		for (String line : list) {
			data += line + '\n';
		}
		in = new ByteArrayInputStream(data.getBytes());
		
		Doc doc = null;
		doc = new SimpleDoc(in, flavor, null);
		try {
			printJbo.print(doc, null);
		} catch (PrintException e) {
			Util.logError("print fail!", e);
//			e.printStackTrace();
		} finally {
			if(in != null)
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}

	}
yumendedao 2016-04-13
  • 打赏
  • 举报
回复
引用 5 楼 h2plus0 的回复:
[quote=引用 4 楼 yumendedao 的回复:] 有没有办法解除打印机占用的端口,等我的程序用端口COM1,RXTX方法打印后,再让打印机绑定到端口COM1上
这个取决于rxtx程序是否在用完com后关闭COM. 如果rxtx程序不释放COM, 另外的程序是没办法使用COM的。 所以,估计需要修改rxtx程序。 例如:rxtx程序开启一个socket, 其它程序通过socket把需要打印的数据发送给rxtx程序, 由rxtx程序统一打印 [/quote] 另一个程序是不能改的,所以不能使用这种方式。 旧的系统是单独是,不能相互交互。 现在我已经解决这个问题了,还是用打印机的驱动方式,但是修改打印模式,原来默认的是打印图片模式,所以很慢,改成文字模式就快了,网上找的很多打印代码都没有说明,还好自己摸索出来了。 谢谢你的回答
h2plus0 2016-04-01
  • 打赏
  • 举报
回复
引用 4 楼 yumendedao 的回复:
有没有办法解除打印机占用的端口,等我的程序用端口COM1,RXTX方法打印后,再让打印机绑定到端口COM1上
这个取决于rxtx程序是否在用完com后关闭COM. 如果rxtx程序不释放COM, 另外的程序是没办法使用COM的。 所以,估计需要修改rxtx程序。 例如:rxtx程序开启一个socket, 其它程序通过socket把需要打印的数据发送给rxtx程序, 由rxtx程序统一打印
yumendedao 2016-04-01
  • 打赏
  • 举报
回复
有没有办法解除打印机占用的端口,等我的程序用端口COM1,RXTX方法打印后,再让打印机绑定到端口COM1上
yumendedao 2016-04-01
  • 打赏
  • 举报
回复
引用 1 楼 h2plus0 的回复:
如果一个程序正在打开COM1, 其它程序是没有办法再打开COM1的。 除非这个程序使用完了COM1就立刻关闭, 或者把需要打印的任务代理给这个程序,由它打印。 这个程序比较慢的原因,估计是因为java Printable api 是以图片的方式打印的,而 rxtx 是以文字 的方式打印的。。。
如何代理给其他程序?
yumendedao 2016-04-01
  • 打赏
  • 举报
回复
引用 1 楼 h2plus0 的回复:
如果一个程序正在打开COM1, 其它程序是没有办法再打开COM1的。 除非这个程序使用完了COM1就立刻关闭, 或者把需要打印的任务代理给这个程序,由它打印。 这个程序比较慢的原因,估计是因为java Printable api 是以图片的方式打印的,而 rxtx 是以文字 的方式打印的。。。
那有办法解决我现在的问题吗?
h2plus0 2016-04-01
  • 打赏
  • 举报
回复
如果一个程序正在打开COM1, 其它程序是没有办法再打开COM1的。 除非这个程序使用完了COM1就立刻关闭, 或者把需要打印的任务代理给这个程序,由它打印。 这个程序比较慢的原因,估计是因为java Printable api 是以图片的方式打印的,而 rxtx 是以文字 的方式打印的。。。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧