調用列印機列印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;
}
}