最近做JAVA服务器打印功能记录一下
一:步骤如下
1、Linux或window系统需要添加打印机
2、poi-tl(poi template language)是Word模板引擎用法请查看官网
3、将填充完的word转PDF,用到apache的poi
4、使用PrinterJob用到JDK1.8以上,进行将PDF打印输出
二、开发如下
1、引用Maven仓库包,如下
<!--Word模板引擎-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
<!--word 转PDF工具 -->
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-local</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.documents4j</groupId>
<artifactId>documents4j-transformer-msoffice-word</artifactId>
<version>1.0.3</version>
</dependency>
通过Word模板填充数据生成Word文档,具体用法参考官网例子
/*
* 通过Word模板填充数据生成Word文档
* @param templatePath 项目resources文件下word模板路径文件(static/printer/word.docx)模板文本用{{name}} 图片用{{@image}}
* @param targetPath 目标保存生成Word路径文件(./static/printer/word.docx)
* @param paramMap 替换的文本/图片集合
* */
public static void generateWordForTemplate(Class<?> clazz, String templatePathName,String targetPathName,Map<String, Object> paramMap) throws IOException {
// 读取resources下的 Word 模板文件
InputStream ins = clazz.getClassLoader().getResourceAsStream(templatePathName);
// 使用模板引擎将模板渲染,并传入一个数据映射表 initWordMap()。
XWPFTemplate template = XWPFTemplate.compile(ins).render(paramMap);
// 将模板渲染后保存为新的 Word 文件
template.writeToFile(targetPathName);
}
把Word文档转换成PDF文档
/*
* 把Word文档转换成PDF文档
* @param templatePath 项目resources文件下word模板路径文件(static/printer/word.docx)
* @param targetPath 目标保存生成Word路径文件(./static/printer/word.docx)
* */
public static void convertWordToPDF(String wordPathName,String pdfPathName) throws FileNotFoundException {
// 创建一个转换器实例
IConverter converter = LocalConverter.builder().build();
// 使用转换器将输入文件(docx)转换为输出文件(test.pdf)
converter.convert(new FileInputStream(wordPathName)).as(DocumentType.DOCX).
to(new FileOutputStream(pdfPathName)).as(DocumentType.PDF).execute();
}
使用PrinterJob用到JDK1.8以上,进行将PDF打印输出
/*
* 查找并设置打印机
* @param printerName 打印机名称
* */
public static PrinterJob getPrintServiceJob(String printerName,String PrinterBrand,String ipAddress,int port) throws PrinterException{
PrinterJob printJob = PrinterJob.getPrinterJob();
//获得本台电脑连接的所有打印机
PrintService[] printServices = PrinterJob.lookupPrintServices();
if(printServices == null || printServices.length == 0) {
throw new RuntimeException("打印失败,未找到可用打印机,请检查。");
}
// 遍历查询打印机名称
boolean flag = false;
for (PrintService ps : printServices) {
String psName =ps.getName();
System.out.println("《《《"+psName+"》》》》");
// 选用指定打印机
if (psName.equals(printerName)) {
//检查是否在线
if(StringUtils.isNotEmpty(ipAddress)&& port!=0) {
Integer timeout=3000;
try {
Socket socket=new Socket();
socket.connect(new InetSocketAddress(ipAddress,port),timeout);
socket.close();
}catch (Exception e) {
throw new RuntimeException("打印机离线,请检查");
}
}
flag = true;
printJob.setPrintService(ps);
break;
}
}
if(!flag){
throw new RuntimeException ("打印失败,未找到名称为" + printerName + "的打印机,请检查。");
}
return printJob;
}
/*
* 打印PDF文件
* @param pdfFile PDF文件
* @param printerName 打印机名称
* */
public static void printPDF(File pdfFile ,String printerName,String PrinterBrand,String ipAddress,int port) throws Exception{
PDDocument document = null;
try {
document = Loader.loadPDF(new RandomAccessReadBufferedFile(pdfFile));
PrinterJob printJob =getPrintServiceJob(printerName,PrinterBrand,ipAddress,port);
printJob.setJobName(pdfFile.getName());
//设置纸张及缩放
PDFPrintable pdfPrintable = new PDFPrintable(document, Scaling.ACTUAL_SIZE);
//设置多页打印
Book book = new Book();
PageFormat pageFormat = new PageFormat();
//设置打印方向
pageFormat.setOrientation(PageFormat.PORTRAIT);//纵向
// 获取当前页面
PDPage page = document.getPage(0);
PDRectangle pageSize = page.getMediaBox();
float pdfWidth = pageSize.getWidth();
float pdfHeight = pageSize.getHeight();
pageFormat.setPaper(getPaper(pdfWidth,pdfHeight));//设置纸张
book.append(pdfPrintable, pageFormat, document.getNumberOfPages());
printJob.setPageable(book);
printJob.setCopies(1);//设置打印份数
//添加打印属性
HashPrintRequestAttributeSet pars = new HashPrintRequestAttributeSet();
pars.add(Sides.ONE_SIDED); //设置单双页
printJob.print(pars);
} catch (IOException | PrinterException e) {
throw new RuntimeException (e.getMessage());
}finally {
if (document != null) {
try {
document.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}