天天看點

java調用列印機

調用列印機列印pdf等檔案,支援列印份數,雙面列印

package com.gehouse.smartdevice.config;

import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Maps;

/**
 * 全局配置類
 * 
 */
public class Global {

	/**
	 * 目前對象執行個體
	 */
	private static Global global = new Global();

	/**
	 * 儲存全局屬性值
	 */
	private static Map<String, String> map = Maps.newHashMap();

	/**
	 * 屬性檔案加載對象
	 */
	private static PropertiesLoader loader = new PropertiesLoader("system.properties");

	/**
	 * 對/錯
	 */
	public static final String TRUE = "true";
	public static final String FALSE = "false";

	/**
	 * 擷取目前對象執行個體
	 */
	public static Global getInstance() {
		return global;
	}

	/**
	 * 擷取配置
	 * 
	 * @see ${fns:getConfig('adminPath')}
	 */
	public static String getConfig(String key) {
		String value = map.get(key);
		if (value == null) {
			value = loader.getProperty(key);
			map.put(key, value != null ? value : StringUtils.EMPTY);
		}
		return value;
	}

	/**
	 * 頁面擷取常量
	 * 
	 * @see ${fns:getConst('YES')}
	 */
	public static Object getConst(String field) {
		try {
			return Global.class.getField(field).get(null);
		} catch (Exception e) {
			// 異常代表無配置,這裡什麼也不做
		}
		return null;
	}

	/**
	 * 擷取A4紙列印機
	 */
	public static String getPrinterA4() {
		return getConfig("printer.A4");
	}
}
           

配置檔案 system.properties

設定預設列印機名稱

#A4\u6253\u5370\u673a
printer.A4=NPI82AACC (HP LaserJet M1536dnf MFP)
           

列印檔案 

package com.gehouse.smartdevice.tools;

import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

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.Copies;
import javax.print.attribute.standard.Sides;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang3.StringUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.printing.PDFPageable;

import com.gehouse.smartdevice.config.Global;

/**
 * 調用列印機列印檔案
 * @author 寇航艇
 *
 */
public class PrintFile {
	
	/**
	 * 調用列印機進行列印(列印pdf的列印參數沒起作用)
	 * @param printFilePath 列印檔案路徑
	 * @param printFilePath 列印參數
	 */
	public void print(String printFilePath, Map<Object, Object> map) {
		
		try {
			// 建構列印請求屬性集
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
			// 設定列印格式,因為未确定檔案類型,這裡選擇AUTOSENSE
			DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
			// 查找所有的可用列印服務
			// [發送至 OneNote 2013, NPI82AACC (HP LaserJet M1536dnf MFP), Microsoft XPS Document Writer, Fax, CutePDF Writer]
			PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
			// 定位預設的列印服務
			PrintService defaultService = null;
			// 擷取列印機
			String printer = (String)map.get("printer");
			// 判斷列印機是否為空
			if (StringUtils.isBlank(printer)) {
				// 擷取預設配置檔案列印機
				printer = Global.getPrinterA4();
			}
			
			for (int i = 0; i < printService.length; i++) {
				if (printService[i].getName().contains(printer)) {
					defaultService = printService[i];
					break;
				}
			}
			
			if (defaultService != null) {
				
				PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
				// 建立列印作業
				DocPrintJob job = defaultService.createPrintJob();
				// 構造待列印的檔案流
				FileInputStream fis = new FileInputStream(printFilePath);
				DocAttributeSet das = new HashDocAttributeSet();
				// 建立列印檔案格式
				Doc doc = new SimpleDoc(fis, flavor, das);
				//A4紙張
				//attr.add(MediaSize.A4);
				// 列印份數
				if (map.get("Copies") != null) {
					attr.add(new Copies((int) map.get("Copies")));
				}
				//雙面列印
				//attr.add(Sides.DUPLEX);
				if (map.get("duplex") != null) {
					if ((boolean)map.get("duplex")) {
						attr.add(Sides.DUPLEX);
					}
				} else {
					attr.add(Sides.DUPLEX);
				}
				// 進行檔案的列印
				job.print(doc, attr);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (PrintException e) {
			e.printStackTrace();
		}
	}
	
	/**
     * 調用列印機,設定列印份數,列印起始位置結束位置,雙面列印
     * Prints using custom PrintRequestAttribute values.
     */
	public void printWithAttributes(String printFilePath, Map<Object, Object> map) {
    	
    	try {
    		System.out.println("開始列印檔案: " + printFilePath);
			PrinterJob job = PrinterJob.getPrinterJob();
			PDDocument document = PDDocument.load(new File(printFilePath));
			job.setPageable(new PDFPageable(document));
			
			// 建構列印請求屬性集
			PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
			// 設定列印格式,因為未确定檔案類型,這裡選擇AUTOSENSE
			DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
			// 查找所有的可用列印服務
			// [發送至 OneNote 2013, NPI82AACC (HP LaserJet M1536dnf MFP), Microsoft XPS Document Writer, Fax, CutePDF Writer]
			PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);
			// 定位預設的列印服務
			PrintService defaultService = null;
			// 擷取列印機
			String printer = (String)map.get("printer");
			// 判斷列印機是否為空
			if (StringUtils.isBlank(printer)) {
				// 擷取預設配置檔案列印機
				printer = Global.getPrinterA4();
			}
			
			for (int i = 0; i < printService.length; i++) {
				if (printService[i].getName().contains(printer)) {
					defaultService = printService[i];
					break;
				}
			}
			
			if (defaultService != null) {
				// 設定列印機
				job.setPrintService(defaultService);
				// 設定列印機屬性
				PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
				
				// 列印範圍,第幾頁到第幾頁
				// attr.add(new PageRanges(1, 1));
				// 列印份數
				// attr.add(new Copies(1));
				if (map.get("Copies") != null) {
					attr.add(new Copies((int) map.get("Copies")));
				}
				// 紙張大小
				// attr.add(MediaSize.ISO.A4);
				// 雙面列印
				if (map.get("duplex") != null) {
					if ((boolean)map.get("duplex")) {
						attr.add(Sides.DUPLEX);
					}
				} else {
					attr.add(Sides.DUPLEX);
				}
				
				job.print(attr);
				document.close();
				
				System.out.println("列印完成: " + printFilePath);
			}
		} catch (NullPointerException e) {
			e.printStackTrace();
		} catch (InvalidPasswordException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (PrinterException e) {
			e.printStackTrace();
		}
    	
    }
	
	/**
	 * 擷取列印參數
	 * @param request
	 * @return
	 */
	public Map<Object, Object> getPrintParams(HttpServletRequest request) {
		
		// 檔案已生成則根據檔案路徑列印檔案
		Map<Object, Object> map = new HashMap<Object, Object>();
		// 擷取所請求的列印機
		String printer = request.getParameter("printer");
		if (printer != null && !"".equals(printer)) {
			map.put("printer", printer);
		}
		// 擷取列印份數
		String pages = request.getParameter("printPages");
		if (pages != null && !"".equals(pages)) {
			map.put("Copies", Integer.valueOf(pages));
		}
		// 擷取雙面列印
		String Sides = request.getParameter("printSides");
		if (Sides != null && !"".equals(Sides)) {
			map.put("Sides", Integer.getInteger(Sides));
		}
		
		return map;

	}

}