打印word模板并预览打印

功能需求描述:word文件中有动态数据,需要将动态数据的word文件在jsp或HTML页面预览,最后进行打印、

总体实现过程  制作模板----动态生成word模板文件----word文件转为pdf-----页面使用iframe嵌套预览pdf

 详细实现:1、制作模板文件。打开word文件,先以${test}形式替换文件中每一个需要动态加载的数据:如图(如果word文件是.docx的打开后先另存为word2003版本的.doc格式,方便后续操作),根据自己的需求设定好模板格式,最后打印预览打印都是以此格式展示的。

 

                           

2、替换完成后,将文件另存为xml文件,再将.xml直接修改文件后缀为.ftl格式的标准模板文件,至此模板文件制做完成

3、framemaker加载模板这一步很重要

package com.xwr.app.utils.print;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;


import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

public class DocumentHandler {
	 private Configuration configuration = null;  
	   
	    public DocumentHandler() {  
	        configuration = new Configuration();  
	        configuration.setDefaultEncoding("utf-8");  
	    }  
	   
	    public void createDoc(HttpServletRequest request,Map<String,Object> dataMap,String fileName) throws Exception {  
	        //dataMap 要填入模本的数据文件  
	        //设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,  
	        //这里我的ftl模板是放在WebRoot中的template文件夹中
	    	configuration.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template");
	    	System.out.println(this.getClass());
	    	//configuration.setServletContextForTemplateLoading(ServletActionContext.getServletContext(),"\template");
	    	 
	    	Template t=null;  
	        try {  
	            //lzyjhf.ftl为要装载的模板  
	            t = configuration.getTemplate("lzyjhf.ftl");  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  
	        //输出文档路径及名称  
	        
	        File outFile = new File(fileName);  
	        Writer out = null;  
	        FileOutputStream fos=null;  
	        try {  
	            fos = new FileOutputStream(outFile);  
	            OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");  
	            //这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。  
	            //out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));  
	             out = new BufferedWriter(oWriter);   
	        } catch (FileNotFoundException e1) {  
	            e1.printStackTrace();  
	        }  
	            
	        try {  
	            t.process(dataMap, out);  
	            out.close();  
	            fos.close();  
	        } catch (TemplateException e) {  
	            e.printStackTrace();  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        }  
	           
	        //System.out.println("---------------------------");  
	    } 
}

4、word转为pdf

package com.xwr.app.utils.print;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;

import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;

public class Doc2Pdf {
	 public static boolean getLicense() {
	        boolean result = false;
	        try {
	            InputStream is = Main.class.getClassLoader().getResourceAsStream("/license.xml"); //  license.xml我放在src下
	            License aposeLic = new License();
	            aposeLic.setLicense(is);
	            result = true;
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	        return result;
	    }

	    public static void doc2pdf(String Address) {

	        if (!getLicense()) {          // 验证License 若不验证则转化出的pdf文档会有水印产生
	            return;
	        }
	        try {
	             long old = System.currentTimeMillis();
	            File file = new File("E:/pdf1.pdf");  //新建一个空白pdf文档
	            FileOutputStream os = new FileOutputStream(file);
	            Document doc = new Document(Address);                    //Address是将要被转化的word文档
	            doc.save(os, SaveFormat.PDF);//全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
	            long now = System.currentTimeMillis();
	            System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒");  //转化用时
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
}

5、以上代码测试类

package com.xwr.app.utils.print;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class Main {
	 /** 
     * @param args 
     * @throws UnsupportedEncodingException  
     */ 
    public static void main(String[] args) throws UnsupportedEncodingException {  
    	HttpServletRequest request = null;	
        Map<String, Object> dataMap = new HashMap<String, Object>();  
       

        dataMap.put("deptswj", "AAAAA");  
        dataMap.put("year", "BBBBB");  
        dataMap.put("num", "17");  
        dataMap.put("deptname", "人事处");  
        dataMap.put("username", "CCCCC");  
        dataMap.put("kssj", "2020年10月11日");  
        dataMap.put("jssj", "2020年12月13日");  
        dataMap.put("username", "小明");  
   
        dataMap.put("lzyjnr", "测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");  
        dataMap.put("deptswj", "DDDD");  
        dataMap.put("zfsj", "2020年12月13日");  
   
        DocumentHandler  mdoc = new DocumentHandler ();  
        try {
			mdoc.createDoc(request,dataMap, "E:/20201219.doc");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  
        
      
    	  //加载word示例文档
        Document document = new Document();
        document.loadFromFile("E:/20201219.doc");
 
 
        //保存结果文件
        document.saveToFile("E:/20201219111.pdf", FileFormat.PDF);
        	
    }  
}

6、相关jar包和license文件请在我的资源中下载

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值