java打印技术实例

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;
import javax.swing.JOptionPane;
/**
 * java定位打印,把打印内容打到指定的地方
 * @author edz
 *
 */
public class throwadv implements Printable {
          private int PAGES=0;
          private String printStr;
          /*
           * Graphics指明打印的图形环境;PageFormat指明打印格式(页面大小以点为计量单位;page指明页号
           */
          public int print(Graphics gp,PageFormat pf,int page) throws PrinterException{
              Graphics2D g2=(Graphics2D)gp;
              g2.setPaint(Color.black);
              if(page>=PAGES){//当打印页号大于需要打印的总页数,打印工作工作结束
                  return Printable.NO_SUCH_PAGE;
              }
              g2.translate(pf.getImageableX(), pf.getImageableY());//转化坐标,确定打印边界
              Font font=new Font("宋体",Font.PLAIN,24);
              g2.setFont(font);
              //打印当前页面
              int printFontCount=printStr.length();//打印字数
              int printFontSize=font.getSize();//font的磅值大小
              float printX=595/2;//给定字符点阵,X页面正中
              float printY=843/2;//给定字符点针,Y页面正中
              float printMX=printX-(printFontCount*printFontSize/2);//打印到正中间
              float printMY=printY-printFontSize/2;//打印到正中间
              g2.drawString(printStr, printMX, printMY);//具体打印每一行文本,在指定位置
              g2.drawString(printStr, printMX-printFontSize*printFontCount, printMY+printFontSize);//具体到打印每一行文本
              g2.drawString(printStr, printMY, printMY+printFontSize*2);
              g2.drawString(printStr, printMY, printMY+printFontSize*2);
              g2.drawString(printStr, printMX, printMY+printFontSize*2);
              return Printable.PAGE_EXISTS;//存在打印页时,继续打印工作
              }
             //打印内容到指定位置
          public void printContent(){
              printStr="打印测试内容";//获取需要打印的目标文本
              if(printStr!=null&&printStr.length()>0){//当打印内容不为空时
                  PAGES=1;//获取打印总页数
                  //指定打印输出格式
                  DocFlavor flavor=DocFlavor.SERVICE_FORMATTED.PRINTABLE;
                  //设置打印属性
                  PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
                 //设置纸张大小,也可以新建MediaSize类来自定义大小
                  pras.add(MediaSizeName.ISO_A4);
                  DocAttributeSet das=new HashDocAttributeSet();
                  //指定打印内容
                  Doc doc=new SimpleDoc(this,flavor,das);
                  //定位默认的打印服务
                  PrintService printService=null;
                  printService=PrintServiceLookup.lookupPrintServices(flavor, pras)[0];
                  System.out.println(printService);
                  //创建打印作业
                  DocPrintJob job=printService.createPrintJob();
                  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);
                  
              }
          }
          public static void main(String[]args){
              throwadv ip=new throwadv();
              ip.printContent();
          }
          
}

原文地址:https://www.cnblogs.com/zhouzetian/p/8574065.html