简介:
整理了一个打印小票的功能,记录一下,代码如下:
import org.jboss.logging.Logger;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.JobName;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.print.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
/**
* 打印小票功能实现
*/
public class PrintUtil implements Printable {
static Logger log = Logger.getLogger(PrintUtil.class);
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex){
//绘图
Graphics2D graphics2d = (Graphics2D) graphics;
//设置字体
graphics2d.setFont(new Font("宋体", Font.PLAIN,8));
graphics2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
//打印格式
graphics2d.drawString("销售凭证", 45, 25);
graphics2d.drawString("存根联", 95, 25);
graphics2d.drawString("——————————————————————————————————————————————", 1, 30);
graphics2d.drawString("品名 货号 规格 生产厂商", 1, 40);
graphics2d.drawString("批号 数量 单价 金额", 1, 50);
graphics2d.drawString("----------------------------------------------", 1, 60);
graphics2d.drawString("营业员: 2070793", 1, 75);
graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
graphics2d.drawString("交易号:000000000000 ", 70, 70);
graphics2d.drawString("日期:2020-00-00 00:00:00", 70, 80);
graphics2d.setFont(new Font("宋体", Font.PLAIN,8));
graphics2d.drawString("真皮手套 63897 kg 江南皮革厂", 1, 105);
graphics2d.drawString("1000001 1 200 200", 1, 115);
graphics2d.drawString("——————————————————————————————————————————————", 1, 125);
graphics2d.drawString("(兴)代表运动员慎用", 1, 135);
graphics2d.drawString("折扣金额: 0 现金支付: 200", 1, 145);
graphics2d.drawString("收款金额: 200(大写:贰佰元整)", 1, 155);
graphics2d.drawString("收银员: Admin 服务费: 0", 1, 165);
graphics2d.drawString("——————————————————————————————————————————————", 1, 180);
graphics2d.drawString("会员号: 积分: ", 1, 190);
graphics2d.drawString("返券数: ", 1, 200);
graphics2d.drawString("——————————————————————————————————————————————", 1, 210);
graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
graphics2d.drawString("按照规定,除商品质量原因外,商品一经售出,不得退换。", 1, 220);
graphics2d.setFont(new Font("宋体", Font.PLAIN,8));
graphics2d.drawString("交易号: 000000000000", 1, 230);
graphics2d.drawString("交易时间: 2020-00-00 00:00:00", 1, 240);
graphics2d.drawString("门店电话: 888888", 1, 260);
graphics2d.drawString("——————————————————————————————————————————————", 1, 280);
graphics2d.drawString("----------------------------------------------", 1, 280);
// graphics2d.drawImage(new BufferedImage());
graphics2d.setFont(new Font("宋体", Font.PLAIN,6));
graphics2d.drawString("电子发票(E-Invoice)微信或支付宝扫一扫", 1, 290);
graphics2d.drawString("需当日发票当日申请,二维码有效期 30天", 1, 300);
BufferedImage bufferedImage = ZxingCodeUtil.getBufferedImage();
graphics2d.drawImage(bufferedImage, null,1, 310);
graphics2d.drawString("若开票异常,可联系上面门店电话,直接为您核实", 1, 400);
graphics2d.drawString("收银小票是您获取发票的唯一凭证,请妥善保管", 1, 410);
graphics2d.drawString("若有需要, 请联系门店开纸质发票,感谢您的配合!!", 1, 430);
graphics2d.drawString(" ", 1, 450);//尾部留白
return PAGE_EXISTS;
}
public static void printWordDayInfo() {
try {
Book book = new Book();
PageFormat pf = new PageFormat();
pf.setOrientation(PageFormat.PORTRAIT);
Paper p = new Paper();
//设置打印纸的大小一般是158,10000随便设的因为这是一卷纸不像A4纸是规定的
p.setSize(158,500);
//打印区域
p.setImageableArea(0,0, 158,500);
pf.setPaper(p);
book.append(new PrintUtil(), pf);
PrinterJob job = PrinterJob.getPrinterJob();
job.setPageable(book);
job.print();
} catch (Exception e) {
e.printStackTrace();
log.error("打印异常:"+e.getMessage());
}
}
/**
* 根据指定宽度自动换行
* @param g
* @param maxWdith
* @param strContent
* @param loc_X
* @param loc_Y
* @param font
*/
private void drawStringWithFontStyleLineFeed(Graphics g, String strContent,int maxWdith, int loc_X, int loc_Y, Font font){
g.setFont(font);
//获取字符串 字符的总宽度
int strWidth =getStringLength(g,strContent);
//每一行字符串宽度
int rowWidth=maxWdith;
// System.out.println("每行字符宽度:"+rowWidth);
//获取字符高度
int strHeight=getStringHeight(g);
//字符串总个数
// System.out.println("字符串总个数:"+strContent.length());
if(strWidth>rowWidth){
char[] strContentArr = strContent.toCharArray();
int count = 0;
int conut_value = 0;
int line = 0;
int charWidth = 0;
for(int j=0;j< strContentArr.length;j++){
if(conut_value>=rowWidth){
conut_value = 0;
g.drawString(strContent.substring(count,j),loc_X,loc_Y+strHeight*line);
count = j;
line++;
}else{
if(j==strContentArr.length - 1){
g.drawString(strContent.substring(count,j),loc_X,loc_Y+strHeight*line);
}else{
charWidth = g.getFontMetrics().charWidth(strContentArr[j]);
conut_value = charWidth + conut_value;
}
}
}
}else{
//直接绘制
g.drawString(strContent, loc_X, loc_Y);
}
}
private int getStringLength(Graphics g,String str) {
char[] strcha=str.toCharArray();
int strWidth = g.getFontMetrics().charsWidth(strcha, 0, str.length());
System.out.println("字符总宽度:"+strWidth);
return strWidth;
}
private int getStringHeight(Graphics g) {
int height = g.getFontMetrics().getHeight();
//System.out.println("字符高度:"+height);
return height;
}
public static void main(String[] args) {
// System.out.println("Value:"+test());
// 打印pdf的一个方法,首先安装下PDFCreator软件
try {
printFile("D:\\PDF文件\\");
} catch (Exception e) {
System.out.println("打印文件异常:" + e.getMessage());
e.printStackTrace();
}
}
public static void printFile(String path) throws Exception {
File file = new File(path);
File[] fies = file.listFiles();
for (File f : fies) {
System.out.println("file " + f.getName());
String fileExt = f.getName().substring(
f.getName().indexOf(".") + 1, f.getName().length());
if ("pdf".equalsIgnoreCase(fileExt)) {
String filepath = path + File.separator + f.getName();
File pdfFile = new File(filepath);
// 构建打印请求属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new JobName(f.getName(), null));
HashAttributeSet has = new HashAttributeSet();
// has.add(new PrinterName("Officejet J5500 series", null)); // 添加打印机名称
// 设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
// 查找所有的可用打印服务
PrintService printService[] = PrintServiceLookup
.lookupPrintServices(flavor, has);
if (printService[1] != null) {
//获得打印服务的文档打印作业
DocPrintJob job = printService[1].createPrintJob(); // 创建打印任务
DocAttributeSet das=new HashDocAttributeSet();
InputStream fis = new FileInputStream(pdfFile); // 构造待打印的文件流
Doc doc = new SimpleDoc(fis, flavor, das); // 建立打印文件格式
job.print(doc, pras); // 进行文件的打印
}
}
}
}
public static void printFile(InputStream fis) throws Exception {
// 构建打印请求属性集
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(new JobName("as", null));
HashAttributeSet has = new HashAttributeSet();
// has.add(new PrinterName("Officejet J5500 series", null)); // 添加打印机名称
// 设置打印格式,因为未确定文件类型,这里选择AUTOSENSE
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
// 查找所有的可用打印服务
PrintService printService[] = PrintServiceLookup
.lookupPrintServices(flavor, has);
if (printService[1] != null) {
//获得打印服务的文档打印作业
DocPrintJob job = printService[1].createPrintJob(); // 创建打印任务
DocAttributeSet das=new HashDocAttributeSet();
// InputStream fis = new FileInputStream(pdfFile); // 构造待打印的文件流
Doc doc = new SimpleDoc(fis, flavor, das); // 建立打印文件格式
job.print(doc, pras); // 进行文件的打印
}
}
}
此文章为该作者原创,禁止转载。