JAVA PrinterJob打印功能(Word模板填充完转PDF,使用PrinterJob打印)适用Linux或window系统

最近做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();
               }
           }
       }
   }
使用PrinterJob类的setPageable()方法设置打印页面时,你可以使用一个实现了Pageable接口的对象来描述打印页面。Pageable接口是Java中用于描述打印页面的标准接口,它包含了多个方法,其中最重要的是getPageCount()和getPage()方法,分别用于获取页面数量和获取指定页面的Printable对象。 为了按照页面顺序打印PDF文件,你可以先使用PDF库将PDF文件加载到内存中,然后创建一个实现了Pageable接口的对象,在getPageCount()方法中返回PDF文件的页数,在getPage()方法中返回PDF文件指定页数的Printable对象。最后,将这个实现了Pageable接口的对象传递给PrinterJob类的setPageable()方法即可。 下面是一个简单的Java代码示例,演示如何使用PrinterJob类和Pageable接口打印PDF文件,并按照页面顺序进行打印: ```java import java.awt.print.*; // 加载PDF文件到内存中 PdfDocument pdfDoc = new PdfDocument(new PdfReader("myPdfFile.pdf")); // 创建Pageable对象 Pageable pageable = new Pageable() { public int getNumberOfPages() { return pdfDoc.getNumberOfPages(); } public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException { // 这里可以设置页面格式,例如页面大小、边距等 return PrinterJob.getPrinterJob().defaultPage(); } public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException { // 获取指定页面的Printable对象 return pdfDoc.getPage(pageIndex + 1).getPrintable(new PDFPageable.PDFPrintable()); } }; // 创建PrinterJob对象 PrinterJob printerJob = PrinterJob.getPrinterJob(); // 设置打印PrintService[] printServices = PrinterJob.lookupPrintServices(); for (PrintService printService : printServices) { if (printService.getName().equals("MyPrinter")) { printerJob.setPrintService(printService); } } // 设置打印页面 printerJob.setPageable(pageable); // 进行打印 printerJob.print(); ``` 需要注意的是,在实际使用中,你需要根据自己的打印需求进行设置,例如打印机选择、页面格式等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心底的光

你的鼓励是专治疑难杂症的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值