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;

	}

}

 

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java 调用打印机打印需要借助 Java 提供的打印服务 API。下面是一个简单的示例代码,演示了如何使用 Java 打印服务 API 进行打印: ```java import java.awt.print.PrinterJob; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.MediaSize; import javax.print.attribute.standard.MediaSizeName; import javax.print.attribute.standard.OrientationRequested; import javax.print.attribute.standard.Sides; public class PrinterDemo { public static void main(String[] args) { // 获取默认打印服务 PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); if (printService != null) { try { // 构造打印请求属性集 PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); // 设置打印份数 attributes.add(new Copies(1)); // 设置纸张大小为 A4 MediaSize mediaSize = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A4); attributes.add(mediaSize.getMediaSizeNameAttribute()); // 设置打印方向为纵向 attributes.add(OrientationRequested.PORTRAIT); // 设置双面打印 attributes.add(Sides.DUPLEX); // 获取打印作业 PrinterJob job = PrinterJob.getPrinterJob(); // 设置打印机 job.setPrintService(printService); // 设置打印请求属性集 job.print(attributes); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("没有找到默认打印服务。"); } } } ``` 在上面的示例代码中,我们首先调用 `PrintServiceLookup.lookupDefaultPrintService()` 方法获取默认的打印服务,然后构造打印请求属性集 `PrintRequestAttributeSet`,设置打印份数、纸张大小、打印方向和双面打印等属性。最后,获取打印作业 `PrinterJob`,设置打印机和打印请求属性集,调用 `print()` 方法进行打印。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值