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>

总结

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

(0)

相关推荐

  • java控制Pdf自动打印的小例子

    复制代码 代码如下: public byte[] autoPrintPdf(byte[] pdf_byte) { ByteArrayOutputStream bos=null;  try {   PdfReader reader = new PdfReader(pdf_byte);   bos = new ByteArrayOutputStream();   PdfStamper ps = new PdfStamper(reader, bos);   StringBuffer script =

  • Java打印和打印预览机制实例代码

    复制代码 代码如下: import java.awt.BasicStroke;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Component;import java.awt.Dimension;import java.awt.Font;import java.awt.FontMetrics;import java.awt.Graphics;import java.awt.Graphics2D;import

  • JavaWeb实现打印功能

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <script language="javascript"> function printsetup(){ // 打印页面设置 wb.execwb(8,1); } </script> </head> <body> <OBJECT classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" height=0 id=w

  • Java编程打印购物小票实现代码

    简单介绍运行环境: 语言:Java 工具:eclipse 系统:Windows7 (打印设备暂时没有,所以只能提供预览图) 最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时候收银员都会打印一个小票,一般的商城也都需要这样的一个小功能,本文给出的 demo 是在 58mm 的热敏打印机下的例子,如果是其他纸张类型的打印机,调整纸张宽度即可. package test; import java.awt.*; import java.awt.print.*; /** * 打

  • java打印正弦曲线示例

    复制代码 代码如下: /* * 绘制0°到360°的正弦曲线 * 分两种情形,y>0和y<=0进行绘制 * 每种情形中要考虑每行打印两个"*"字符 * 并在打印第二个"*"字符后换行 */package hundred;import java.lang.Math;public class SinTest {    public static void main(String[] args){     //y为列方向,值从1到-1,步长为0.1     f

  • java打印当前方法名示例分享

    在C与C++中可以这样打印当前函数名: 复制代码 代码如下: printf("%s",__func__); 但在Java没有此说法,一切即对象,得从某个对象中去获取,可分为两种方式: 第一种:通过Thread类来获取. 复制代码 代码如下: System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());System.out.println(Thread.currentThread().getS

  • 分享java打印简单图形的实现代码

    我们平时都是使用的画图工具进行简单图形的绘制,今天我们使用java打印一些简单的图形 实现代码如下 package test; /** * * @author hanzel * @打印图形 * */ public class Array { public static void main(String[] args) { //打印长方形 int[] a = new int[10]; for(int i=0 ;i<a.length;i++){ for(int j=0;j<a.length;j++

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

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

  • Java远程调用组件Feign技术使用详解

    目录 一. 概要 二. Feign简介 1. 概念 2. 功能 三. 服务提供者 1. 添加依赖 2. 配置文件 3. 启动类 4. 控制层 5. POJO 四. 服务消费者 1. 添加依赖 2. 配置文件 3. 启动类 4. Feign服务 5. 控制层 五. 测试 1. 测试get请求 2. 测试post请求json数据格式 3. 测试头部中包含信息 一. 概要 我们知道,现在最火且最有技术含量的技术莫过于SpringCloud微服务了,所以今天壹哥就带大家来学习一下微服务的核心的组件之一,

  • java通过AOP实现全局日志打印详解

    目录 几个常用的切点注解,这次使用了@Before和@Around 切Controller打印请求的接口.参数.返回值以及耗时情况. 切Service打印日志,URL,请求方式,IP,类名,方法 总结 几个常用的切点注解,这次使用了@Before和@Around 1.@Before 前置增强(目标方法执行之前,执行注解标注的内容) 2.@AfterReturning 后置增强(目标方法正常执行完毕后,执行) 3.@Around 环绕增强(目标方法执行前后,分别执行一些代码) 4.@AfterTh

  • Java子线程调用RequestContextHolder.getRequestAttributes()方法问题详解

    相信很多开发过程中都用过RequestContextHolder.getRequestAttributes(),没错,我也经常用,但今天出现了问题,获取到的实例是空的 原因是因为我新开了一个子线程,在子线程调用了RequestContextHolder.getRequestAttributes().实际获取到的是空的 然后查看了源码 ThreadLocal获取.一个请求到达容器后,Spring会把该请求Request实例通过setRequestAttributes方法 把Request实例放入该

  • 基于Java class对象说明、Java 静态变量声明和赋值说明(详解)

    先看下JDK中的说明: java.lang.Object java.lang.Class<T> Instances of the class Class represent classes and interfaces in a running Java application. An enum is a kind of class and an annotation is a kind of interface. Every array also belongs to a class tha

  • Java 异常的栈轨迹(Stack Trace)详解及实例代码

    Java 异常的栈轨迹(Stack Trace)详解 捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法.其实除了这个方法,还有一些别的内容也是和栈轨迹有关的. 1.printStackTrace() 首先需要明确,这个方法并不是来自于Exception类.Exception类本身除了定义了几个构造器之外,所有的方法都是从其父类继承过来的.而和异常相关的方法都是从jav

  • Java编程思想对象的容纳实例详解

    Java提供了容纳对象(或者对象的句柄)的多种方式,接下来我们具体看看都有哪些方式. 有两方面的问题将数组与其他集合类型区分开来:效率和类型.对于Java来说,为保存和访问一系列对象(实际是对象的句柄)数组,最有效的方法莫过于数组.数组实际代表一个简单的线性序列,它使得元素的访问速度非常快,但我们却要为这种速度付出代价:创建一个数组对象时,它的大小是固定的,而且不可在那个数组对象的"存在时间"内发生改变.可创建特定大小的一个数组,然后假如用光了存储空间,就再创建一个新数组,将所有句柄从

  • 简单了解Java方法的定义和使用实现详解

    这篇文章主要介绍了简单了解Java方法的定义和使用实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.概念 Java语言中的"方法"(Method)在其他语言当中也可能被称为"函数"(Function).对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到"随时任意使用",那么就可以将这些代码放在一个大括号"{}"当中,并且起一个名字.使用代码的时候,直接找到名

  • java并发编程专题(五)----详解(JUC)ReentrantLock

    上一节我们了解了Lock接口的一些简单的说明,知道Lock锁的常用形式,那么这节我们正式开始进入JUC锁(java.util.concurrent包下的锁,简称JUC锁).下面我们来看一下Lock最常用的实现类ReentrantLock. 1.ReentrantLock简介 由单词意思我们可以知道这是可重入的意思.那么可重入对于锁而言到底意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放.这模仿了 sy

  • java并发编程专题(三)----详解线程的同步

    有兴趣的朋友可以回顾一下前两篇 java并发编程专题(一)----线程基础知识 java并发编程专题(二)----如何创建并运行java线程 在现实开发中,我们或多或少的都经历过这样的情景:某一个变量被多个用户并发式的访问并修改,如何保证该变量在并发过程中对每一个用户的正确性呢?今天我们来聊聊线程同步的概念. 一般来说,程序并行化是为了获得更高的执行效率,但前提是,高效率不能以牺牲正确性为代价.如果程序并行化后, 连基本的执行结果的正确性都无法保证, 那么并行程序本身也就没有任何意义了.因此,

随机推荐