java实现云端打印

        目前市面上的云端打印集成到打印机,需要生产商提供打印服务,价格成本较高。为了适配目前客户店里常用的小票打印机,用java实现云端控制打印。主要有两部分组成,客户端和服务器端

用户客户端

 JEditorPane渲染html,

JEditorPane可以根据url渲染html,JEditorPane对象可以获取Printable接口对象。继而实现用java打印html的目的。

  Printable printable = editorPane.getPrintable(null, null);

 下面是打印的完整代码 

<pre name="code" class="java">public class PrintHelper {

  private static final Logger logger = LoggerFactory.getLogger(PrintHelper.class);

  public static boolean isSerial(String serialNo) {
    return StringUtil.isAlphaOrDigital(serialNo) && serialNo.length() == 16;
  }



  /**
   * 查找打印机
   *
   * @param flavor
   * @param attrs
   * @return
   */
  private static PrintService getPrintService(DocFlavor flavor, PrintRequestAttributeSet attrs) throws Exception {
    String serverName = System.getProperty("PRINT.SERVER.NAME");
    if (StringUtil.isEmpty(serverName)) {
      throw new Exception("请配置打印机名称。");
    }
    PrintService services[] = PrintServiceLookup.lookupPrintServices(flavor, attrs);
    if (services.length == 0) {
      throw new Exception("未查找到任何打印服务。");
    }
    logger.info("search service list...");
    PrintService service = null;
    for (int i = 0; i < services.length; i++) {
      String printerName=services[i].getName();
      logger.info("{})service name : {}: ", i, printerName);
      if (printerName.contains(serverName)) {
        service = services[i];
        logger.info("find the right printer:{}", printerName);
        break;
      }
    }
    if (StringUtil.isEmpty(serverName)) {
      throw new Exception("请检查配置的打印机名称是否正确。");
    }
    return service;
  }

  /**
   * 根据 url 打印
   *
   * @param url
   * @return
   * @throws IOException
   */
  public static Result printHtml(String url) throws Exception {
    if (StringUtil.isEmpty(url)) return new Result(false, "url can't be null");
    logger.info("print url:{}",url);
    JEditorPane editorPane = new JEditorPane();
    editorPane.setEditable(false);
    editorPane.setSize(200, 400);
    editorPane.setPage(url);
    Printable printable = editorPane.getPrintable(null, null);
    return doPrint(printable);
  }


  public static Result doPrint(Printable printable) throws Exception {
    DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
    PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
    DocAttributeSet dAttrs = new HashDocAttributeSet();
    MediaPrintableArea area = new MediaPrintableArea(0, 0, 150, 150, MediaPrintableArea.MM);
    dAttrs.add(area);
    attrs.add(area);
    PrinterResolution printerResolution = new PrinterResolution(200, 200, PrinterResolution.DPI);
    dAttrs.add(printerResolution);

    Doc doc = new SimpleDoc(printable, flavor, dAttrs);
    PrintService service = getPrintService(flavor, null);
    if (service == null) {
      logger.error("can't find printer");
      return new Result(false, "can't find printer");
    }
    DocPrintJob job = service.createPrintJob();
    try {
      job.print(doc, attrs); // 进行每一页的具体打印操作
    } catch (PrintException pe) {
      pe.printStackTrace();
    }
    return new Result(true,"打印成功。");
  }


  /**
   * 根据文件流打印
   *
   * @param fileName
   * @return
   * @throws PrintException
   * @throws IOException
   * @sample String fileName = "D:\\test.txt";
   */
  public static Result doPrint(String fileName) throws Exception {
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();
    PrintService service = getPrintService(flavor, attrs);
    if (service == null) {
      logger.error("can't find printer");
      return new Result(false, "can't find printer");
    }
    DocPrintJob job = service.createPrintJob();
    DocAttributeSet dAttrs = new HashDocAttributeSet();
    MediaPrintableArea area = new MediaPrintableArea(0, 0, 10, 10, MediaPrintableArea.MM);
    dAttrs.add(area);
    FileInputStream stream = null;
    try {
      stream = new FileInputStream(fileName);
      Doc doc = new SimpleDoc(stream, flavor, dAttrs);
      job.print(doc, attrs);
    } finally {
      stream.close();
    }
    return new Result();
  }
  public static void main(String[]args) throws Exception {
    String url="http://www.baidu.com";
    PrintHelper.printHtml(url);
  }

}


 这样通过服务器给客户端发送打印命令即可,例如通过activeMQ客户端和服务器建立长连接。 
 

你可能感兴趣的:(java实现云端打印)