调用打印机打印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;
}
}