当前位置: 首页 > 编程笔记 >

Java如何调用TSC打印机进行打印详解

冯奇思
2023-03-14
本文向大家介绍Java如何调用TSC打印机进行打印详解,包括了Java如何调用TSC打印机进行打印详解的使用技巧和注意事项,需要的朋友参考一下

前言

最近项目中用到了打印机,最开始的完全不懂,现在弄好了,所以做了总结,该篇包括后台的调用打印(两种方式)跟前端的js的打印,但是只有IE现在支持打印,而且如果想远程连接打印机,二维码的生成和直接由打印机的命令进行操作,就要把修改浏览器的安全配置,下面再做详细的介绍

第一种后台打印:    

使用javax中的PrintServiceLookup类进行打印,可以直接调用默认的打印机,也可以使用下列的方法进行筛选打印: 

 PrintServiceLookup.lookupMultiDocPrintServices(flavors, attributes);

可执行代码如下:

public static void main(String[] args) {
 FileInputStream textStream = null;
 try {
 textStream = new FileInputStream("地址");
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } 
 if (textStream != null) // 当打印内容不为空时
 {
 // 指定打印输出格式
 DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;//SERVICE_FORMATTED.PRINTABLE
 // 定位默认的打印服务
 PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
 // 创建打印作业
 DocPrintJob job = printService.createPrintJob();
 // 设置打印属性
 PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
 // 设置纸张大小,也可以新建MediaSize类来自定义大小
 pras.add(MediaSizeName.ISO_A4);
 DocAttributeSet das = new HashDocAttributeSet();
 // 指定打印内容
 Doc doc = new SimpleDoc(textStream, flavor, das);
 // 不显示打印对话框,直接进行打印工作
 try {
  job.print(doc, pras); // 进行每一页的具体打印操作
 } catch (PrintException pe) {
  pe.printStackTrace();
 }
 } else {
 // 如果打印内容为空时,提示用户打印将取消
 JOptionPane.showConfirmDialog(null,
  "Sorry, Printer Job is Empty, Print Cancelled!",
  "Empty", JOptionPane.DEFAULT_OPTION,
  JOptionPane.WARNING_MESSAGE);
 }
 }

第二种后台打印:

注意:第二种跟第三种打印使用的是打印机的命令进行操作,这里需要jna的jar包,还有jdk要求是32位的,并且要要注册对应的dll,对应不同的系统要在不同的Windows下进行注册DLL,注册成功之后需要win+R ,调用并运行  Regsvr32.exe TSCActiveX.dll 指令

可执行代码如下:

public class JavaDemo {
 public interface TscLibDll extends Library {
 TscLibDll INSTANCE = (TscLibDll) Native.loadLibrary("TSCLIB", TscLibDll.class);
 int about();
 int openport(String pirnterName);
 int closeport();
 int sendcommand(String printerCommand);
 int setup(String width, String height, String speed, String density, String sensor, String vertical, String offset);
 int downloadpcx(String filename, String image_name);
 int barcode(String x, String y, String type, String height, String readable, String rotation, String narrow, String wide, String code);
 int printerfont(String x, String y, String fonttype, String rotation, String xmul, String ymul, String text);
 int clearbuffer();
 int printlabel(String set, String copy);
 int formfeed();
 int nobackfeed();
 int windowsfont(int x, int y, int fontheight, int rotation, int fontstyle, int fontunderline, String szFaceName, String content);
 }
 
 
 public static void main(String[] args) {
 System.setProperty("jna.encoding", "GBK");// 支持中文
 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 String time = df.format(new Date());
 String qrCode = "PD102011";
 TscLibDll.INSTANCE.openport("TSC TTP-244 Pro");//打印机型号
 TscLibDll.INSTANCE.setup("70","40","5","8","0","2","0");
 TscLibDll.INSTANCE.clearbuffer();
 String command = "QRCODE 120,90,Q,8,A,0,M1,S7,\"" + qrCode+"\""; //打印二维码的参数和内容
 TscLibDll.INSTANCE.sendcommand(command); //传送指令
 TscLibDll.INSTANCE.sendcommand("TEXT 300 70 36 0 0 0 arial"+ "办公耗材-标签纸");
 //TscLibDll.INSTANCE.windowsfont(300, 70, 36, 0, 0, 0, "arial", "办公耗材-标签纸");
 TscLibDll.INSTANCE.printlabel("1", "1");
 TscLibDll.INSTANCE.closeport();
 }
}

注意:这种打印方式,需要USB连接(ttp-244 pro),如果想在线生成,远程连接,需要使用第三种方式

第三种JS打印

在使用JS进行打印的时候要主要浏览器的限制,目前只有IE浏览器进行支持,在进行打印时,控制台出现Automation 服务器不能创建对象的,请调节浏览器的安全中的自定义级别中的ActiveX中相关的设置为启用,代码如下:

<script type="text/javascript">
 
function printQRcode(){
 
 var TSCObj = new ActiveXObject("TSCActiveX.TSCLIB");//打印机使用的dll
 //TSCObj.ActiveXabout(); // 打印机信息
 TSCObj.ActiveXopenport ("TSC TTP-244 Pro");//打印机名称,不能写错
 //TSCObj.ActiveXdownloadpcx ("D:/myeclipseproject/filesManager/trunk/doc/02-参考资料/03-二维码打印机/01-开发帮助/PHP调用范例/TSCActiveX.DLL-PHP-Example/","123.PCX");
 TSCObj.ActiveXsetup("70","40","4","15","0","2.5","0");//打印机设置
 //TSCObj.ActiveXsetup("标签宽度","标签高度","打印速度","打印浓度(0-15)","感应器类别字串型,0 表示使用垂直間距感測器(gap sensor), 1 表示使用黑標感測器(black mark senso)","Gap/Black mark垂直间距(mm)","Gap/Black mark偏移距离(mm)");
 //TSCObj.ActiveXformfeed();
 //TSCObj.ActiveXnobackfeed();
 TSCObj.ActiveXsendcommand("DIRECTION 1"); //设置标签方向 ,DIRECTION 1 左上角 (x,y)={0,0};DIRECTION 0 右下角 (x,y)={0,0};
 TSCObj.ActiveXsendcommand ("SET TEAR ON");
 TSCObj.ActiveXclearbuffer();
 //TSCObj.ActiveXsendcommand ("PUTPCX 0,0,\"123.PCX\"");
 /*
 1、ActiveXprinterfont采用机器内置编码通常用来打英文。
 2、ActiveXwindowsfont可以输出汉字,但是必须是系统中存在的字体。
 TSCObj.ActiveXprinterfont ("a","b","c","d","e","f","g");
 a:字符串,文字X方向起始点,以点表示。
 b:字符串,文字Y方向起始点,以点表示。
 c:內建字型名称,共12种(1: 8*12 dots 2: 12*20 dots 3: 16*24 dots 4: 24*32 dots 5: 32*48 dots TST24.BF2: 繁體中文 24*24 TST16.BF2: 繁體中文 16*16 TTT24.BF2: 繁體中文 24*24 (電信碼) TSS24.BF2: 簡體中文 24*24 TSS16.BF2: 簡體中文 16*16 K: 韓文 24*24 L: 韓文 16*16 )
 d:字符串,旋转角度
 e:字符串,X方向放大倍率1-8
 f:字符串,Y方向放大倍率1-8
 g:字符串,打印内容
 ActiveXwindowsfont(a,b,c,d,e,f,g,h)
 说明:使用Windows TTF字体打印文字。
 参数:
 a:整数类型,文字X方向起始点,以点表示。
 b:整数类型,文字Y方向起始点,以点表示。
 c:整数类型,字体高度,以点表示。
 d:整数类型,旋转角度,逆时针方向旋转。0-旋转0°,90-旋转90°,180-旋转180°,270-旋转270°。
 e:整数类型,字体外形。0:标签;1:斜体;2:粗体;3:粗斜体。
 f:整数类型,下划线,0:无下划线;1:加下划线。
 g:字符串类型,字体名称。如:Arial,Times new Roman。
 h:字符串类型,打印文字内容。
 */
// TSCObj.ActiveXwindowsfont (500, 200, 48, 90, 0, 0, "Arial", "\u7f16\u7801");
 TSCObj.ActiveXwindowsfont (260, 60, 60, 0, 2, 0, "Arial", "XX专用");
 
 //var cmd = 'QRCODE 条码X方向起始点,条码Y方向起始点,纠错级别,二维码高度,A(A和M),旋转角度,M2(分为类型1和类型2),S1 (s1-s8,默认s7),\"1231你好2421341325454353\"';
 var cmd = 'QRCODE 80,80,H,7,A,0,M2,S1,\"'+"123456789"+'\"';
 
 TSCObj.ActiveXsendcommand(cmd);
 TSCObj.ActiveXwindowsfont (280, 150, 40, 0, 0, 0, "Arial", "123456789");
 TSCObj.ActiveXwindowsfont (180, 260, 30, 0, 0, 0, "Arial", "XXXXXXXX");
 TSCObj.ActiveXprintlabel ("1","1");//(打印份数,每页打印张数)
 TSCObj.ActiveXclearbuffer();//清除
 TSCObj.ActiveXcloseport();//关闭打印端口
}
</script>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 问题内容: 使用Java,我需要在未本地安装的网络打印机上进行打印。我只知道打印机名称。我看过的所有教程都以类似以下内容开始: 问题是可能没有安装打印机,因此在这种情况下服务将为空。我需要直接设置打印机名称,而不仅仅是通过可见的打印机枚举。 问题答案: 如果Java AWT Printing未向运行打印应用程序的Windows / Active Directory用户注册,则无法通过路径找到打印机

  • 问题内容: Java中有一种简单的方法可以执行以下操作吗? 连接到打印机(将是本地打印机,并且是连接到机器的唯一打印机)。 在2个不同的打印机纸盘中打印2页的页面。 获取当前的打印队列计数,即我有100项要打印的项目和34项当前已打印,则打印机队列现在应显示为66。 问题答案: 一些快速提示: 从Java打印:请参阅基本打印程序 打印作业的状态:您可以使用PrintJobListener获得一些有

  • 我需要发送一个pdf文件打印在一个网络应用程序的服务器端,打印机完全支持pdf打印等,它是网络以及服务器。pdf也存储在服务器上。 我尝试的是点击一个按钮,打印出pdf文件,目前我有以下代码: 但我有几个问题,我如何将pdf放入输入流以打印出来,我可以选择诸如双面打印之类的选项,以及如何从JSF web应用程序中调用它 谢谢

  • 问题内容: 我正在为具有内置行式打印机的Android设备开发应用程序。我必须与此打印机进行交互,并使用它来打印收据上的详细信息,然后使用裁纸器自动剪切该收据。我已经在其中看到了一些ESC命令,但是我不知道如何执行这些ESC命令。 关于Casio设备打印机,我有三个主要问题: 1.我已经使用了内置打印机的打印代码,但是打印后切纸刀没有激活 2.我不知道如何在android中将ESC命令发送到打印机

  • 问题内容: 我想使用PDFBox打印 由iText创建的 PDF文件 。我已经使用PDDocument类及其方法print()成功尝试了此操作。您可以在此处找到文档: http //pdfbox.apache.org/apidocs/。 (我正在使用此代码:) 方法print()很好用,但是 有一个问题:当我需要打印多个文件时,该方法要求我为每个文档选择打印机。 有什么办法只能设置一次打印机吗?

  • 我在标签打印机上打印时遇到了问题。下面的代码在一个上打印4个“标签”(附标签图片)。 下面的代码打印到兄弟QL-500标签打印机上。它打印到3.5"乘1.1"标签上。 如果有人能帮我更好地理解代码,那也太好了。 下面是它打印的内容: