[Java]调用打印机实现打印文件或文字的功能
使用java自带的Printable接口,实现接口中的print方法实现打印
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.print.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import static java.awt.print.Printable.PAGE_EXISTS;
public class PrintToolUtils {
static void print(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对象传递给ImageIO.read()方法
// Image image=ImageIO.read(url);
Image image = ImageIO.read(new File(path));//也可以通过file构建一个本地图片File对象传递给ImageIO.read()方法
//将图片绘制到graphics对象中(为什么把需要打印的内容drawImage就可以实现打印自己取看值传递一引用传递的区别)
graphics.drawImage(image,45,0,120,15,null);
// 绘制一段字符串
graphics.drawString("午餐", 85,35);
graphics.drawString("餐厅:土豪餐厅", 20,55);
graphics.drawString("学号:100001", 20,75);
graphics.drawString("姓名:曹总", 20,95);
graphics.drawString("餐费:2700元", 20,115);
graphics.drawString("时间:2000-01-01 12:00:22", 20,135);
// 绘制一个条线条
graphics.drawLine(20,155, 185, 155);
} 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();
// }
// 注释掉printDialog()不显示对话框直接打印
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
}
}