一、用java中自带的PrintServiceLookup实现

import javax.imageio.ImageIO;
import javax.print.*;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.InputStream;public class PrintDemo {public static void main(String[] args) {//创建输入流InputStream inputStream = null;try{inputStream=new FileInputStream("D:/data/files/tending/qrcode/2019/11/15/1573801224220.png");}catch (Exception e){e.printStackTrace();}PrintDemo pd=new PrintDemo();pd.printQRCode(inputStream);//打印方法}private void printQRCode(InputStream inputStream){//设置文档类型当前是png图片DocFlavor flavor=DocFlavor.INPUT_STREAM.PNG;assert inputStream != null;//创建一个文档Doc doc=new SimpleDoc(inputStream, flavor, null);//创建属性设置对象PrintRequestAttributeSet attributeSet=new HashPrintRequestAttributeSet();attributeSet.add(new Copies(1));//设置打印份数//设置打印方向//attributeSet.add(OrientationRequested.PORTRAIT);// 设置纸张大小,也可以新建MediaSize类来自定义大小*//*new MediaSize(90,130, Size2DSyntax.MM);MediaSizeExt mediaSize=new MediaSizeExt(90,130, Size2DSyntax.MM);attributeSet.add(mediaSize);*//*//发现可以根据属性设置指令打印格式的打印机PrintService[] services=PrintServiceLookup.lookupPrintServices(flavor, null);//重其中一个打印服务中创建一个打印作业PrintService TscTtp244Pro=null;if (services.length > 0) {for (PrintService service : services) {if(service.getName().equals("TSC TTP-244 Pro"))//选择二维码打印机TscTtp244Pro=service;}}// 显示打印对话框TscTtp244Pro = ServiceUI.printDialog(null, 200, 200, services, TscTtp244Pro, flavor, attributeSet);if(TscTtp244Pro == null) return;DocPrintJob job = TscTtp244Pro.createPrintJob();try {job.print(doc, attributeSet);} catch (PrintException e) {e.printStackTrace();}}
}

二、使用java自带的Printable接口,实现接口中的print方法实现打印

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.print.*;
import java.io.IOException;
import java.net.URL;import static java.awt.print.Printable.PAGE_EXISTS;public class PrintDemo extends JFrame {public static void main(String[] args) {//这里选择一个网络上的图片//纸张大小要一个值一个值的试,比较烦,好像是有一个转化比例PrintQRCodePrint.qrCodePrint("https://csdnimg.cn/pubfooter/images/csdn-kf.png", 222, 334, 222, 334);}
}class PrintQRCodePrint {static void qrCodePrint(String path, int pageWidth, int pageHeight, int showWidth, int showHeight) {// 通俗理解就是书、文档Book book = new Book();// 设置成竖打PageFormat pf = new PageFormat();pf.setOrientation(PageFormat.PORTRAIT);// 通过Paper设置页面的空白边距和可打印区域。必须与实际打印纸张大小相符。Paper p = new Paper();p.setSize(pageWidth,pageHeight);//纸张大小p.setImageableArea(0,0, pageWidth,pageHeight);//打印区域pf.setPaper(p);// 把 PageFormat 和 Printable 添加到书中,组成一个页面book.append((graphics, pageFormat, pageIndex) -> {//通过一个匿名内部内实现Printable接口,不懂的自行查看jdk8的新特性try {URL url = new URL(path);//也可以通过file构建一个本地图片File对象传递给ImageIO.read()方法Image image=ImageIO.read(url);//将图片绘制到graphics对象中(为什么把需要打印的内容drawImage就可以实现打印自己取看值传递一引用传递的区别)graphics.drawImage(image,0,0,showWidth,showHeight,null);} catch (IOException e) {e.printStackTrace();}return PAGE_EXISTS;//返回0(PAGE_EXISTS)则执行打印,返回1(NO_SUCH_PAGE)则不执行打印}, pf);// 获取打印服务对象PrinterJob job = PrinterJob.getPrinterJob();// 设置打印类job.setPageable(book);try {//可以用printDialog显示打印对话框,在用户确认后打印;也可以直接打印boolean a=job.printDialog();if(a){job.print();}else{job.cancel();}} catch (PrinterException e) {e.printStackTrace();}}
}

注意:将inputstream流对象作为参数传递,没有搞懂为什么打印不出来(对象不是空值)

解决:如果有内部类(非匿名内部内不知道会不会),将路径字符串作为参数传递,部传递inputstream对象流,inputstream对象流在具体使用的地方创建

欢迎加群:517413713 讨论

java调用打印机的两种方式相关推荐

  1. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  2. Java格式化倒计时的两种方式

    Java格式化倒计时的两种方式 第一种方式 /*** 入参是一个每秒减小1的秒数* 返回一个格式化的时间* * 该方法具有局限性,他在时间大于1个小时的时候,会返回错误的时间* 因为该方法调用了Dat ...

  3. java操作Excel有两种方式 方式1:jxl操作Excel jxl的API

    java操作Excel有两种方式 方式1:jxl操作Excel 方式2:poi操作Excel 下面介绍jxl API: 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用 ...

  4. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  5. Java 实现抽奖的两种方式

    Java实现抽奖的两种方式 方式一:随机数在哪个区间内返回区间下标 方式二:随机数加入区间点集合排序返回随机数下标 代码示例: ①抽奖入参类型为BigDecimal: package com.cfay ...

  6. C# WPF 调用打印机的两种方法

    C# WPF 调用打印机的两种方法 最近在调试打印机,为了方便测试写了一个小demo.为了更好的判断是打印机硬件的问题还是动态库的问题,设定了定时器不间断打印来进行测试.现来分享记录一下. 需要调用两 ...

  7. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

  8. Java读取证书的两种方式

    关于证书基础以及创建.查看.删除.导入.导出以及其他功能详解请参照:Java使用keytool创建CA证书 Java读取证书有两种方式 1.从文件中读取 public static void main ...

  9. 创建和应用Java包文件的两种方式

    <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package       包是Java提供的文件管理机制.包把功能相似的类,按照Java的名字 ...

最新文章

  1. 一分钟详解Git使用技巧(一)
  2. c++学习笔记之继承和多态
  3. 【最新合集】编译原理习题(含答案)_8-10语法制导翻译_MOOC慕课 哈工大陈鄞
  4. php 删除数组的空元素,php删除数组空元素的方法_后端开发
  5. java手动切换成独立显卡_JAVA设计模式之调停者模式
  6. linuex查看繁忙_[个人笔记] 关于linux的常见问题合集
  7. c 正则去掉html标签,C#用正则表达式去掉Html中的script脚本和html标签
  8. TYVJ1613 不和谐的公司
  9. 在ASP.NET应用启动的时候初始化的几种方法
  10. C++餐厅订餐管理系统
  11. 【C语言】案例四十九 学生档案管理系统
  12. [shell编程] 入门基础总结 (一) (一种豁然开朗的感觉)
  13. 【Linux上分之路】第二篇:Linux硬件、磁盘结构和分区,Linux文件目录结构
  14. 免费 whois 查询 API
  15. 《Java-第十一章》之图书管理系统
  16. 谷歌浏览器崩溃设置崩溃_用浏览器崩溃
  17. 使用记账软件记录生活收支明细,如何防止收支不被他人修改
  18. UsernamePasswordAuthenticationToken
  19. 面试季,各大厂真实面试题拿走不谢
  20. Android设备唯一识别码的获取

热门文章

  1. 阿里开源项目合集,你值得拥有
  2. JS的除法应用 求余,取整,进一法,四舍五入
  3. 锐捷交换机配置MSTP以及VRRP
  4. 视频号无人直播怎么弄?微信视频号无人直播教程【无需软件】
  5. 前端开发常见笔试题(附答案)
  6. python中and怎么计算_Python中 and,or 的计算规则
  7. vue克隆v2ex网站随记
  8. [Tushare]使用分享
  9. WORD批量修改文献引用为上标
  10. 降本提效,贝壳搜索推荐架构统一之路