Java Web用Freemarker生成带图片的Word文档

步骤一:模板制作

用world2003做一个导出模板,如果有图片则加入一张图片占位,将world另存为xml,将xml中需要导出的内容用Freemarker标签表示,最后另存为.ftl结尾的模板:

步骤二:后台代码

1、获取导出的数据:

@RequestMapping(value = "/exportDoc")
    public void exportDoc(String resumeId,HttpServletResponse response,HttpServletRequest request) throws Exception{

        User u= SessionUtils.getUser(request.getSession());
        Map<String, Object> dataMap = new HashMap<String, Object>();// 要填入模本的数据文件
        ResumeBasicInformationQueryParam resumeParam=new ResumeBasicInformationQueryParam();

        resumeParam.setUuid(resumeId);
        WorkExperienceParam workExperienceParam=new WorkExperienceParam();
        workExperienceParam.setResumeId(resumeId);

        EducationBackgroundParam educationParam=new EducationBackgroundParam();
        educationParam.setResumeId(resumeId);

        SkillEvaluationParam skillParam=new SkillEvaluationParam();
        skillParam.setResumeId(resumeId);

        ProjectExperienceParam projectParam=new ProjectExperienceParam();
        projectParam.setResumeId(resumeId);

        LanguageabilityParam languageParam=new LanguageabilityParam();
        languageParam.setResumeId(resumeId);

        TrainingExperienceParam trainParam=new TrainingExperienceParam();
        trainParam.setResumeId(resumeId);

        //验证导出用户是否可以看到简历姓名
        ResumeHandleParam handleParam=new ResumeHandleParam();
        handleParam.setResumeIds("‘"+resumeParam.getUuid()+"‘");
        handleParam.setCorpId(SessionUtils.getCorpId(request.getSession()));
        int count = 0;

        count = resumeHandleService.checkEnshrine(handleParam);

        ResumeBasicInformationResp rbIfonResp = new ResumeBasicInformationResp();
        //查询当前登录用户的简历基本信息
        List<ResumeBasicInformationResp> resumeBasicList = resumeBasicInformationService.getResumeBasic(resumeParam);
        if(resumeBasicList.size()>0){
            rbIfonResp = resumeBasicList.get(0);
            //性别
            if("1".equals(rbIfonResp.getGender())){
                rbIfonResp.setGender("男");
            }else{
                rbIfonResp.setGender("女");
            }
            //婚姻状况
            if("1".equals(rbIfonResp.getMaritalStatus())){
                rbIfonResp.setGender("已婚");
            }else if("2".equals(rbIfonResp.getMaritalStatus())){
                rbIfonResp.setGender("未婚");
            }else{
                rbIfonResp.setGender("保密");
            }

            //姓名、邮箱、电话是否可见
            if(count==0){ //没有将该简历放入简历库、没有投递该企业,若简历设置了不可见,则企业看不到
                if("1".equals(rbIfonResp.getNamePrivacy()) && rbIfonResp.getName()!=""){
                    String name = rbIfonResp.getName().substring(0, 1)+" *";
                    rbIfonResp.setName(name);
                }

                if("1".equals(rbIfonResp.getEmailPrivacy()) && rbIfonResp.getEmail()!=""){
                    int pos = rbIfonResp.getEmail().indexOf("@");
                    String result = rbIfonResp.getEmail().substring(pos, rbIfonResp.getEmail().length());
                    rbIfonResp.setEmail("****"+result);
                }

                if("1".equals(rbIfonResp.getTelPrivacy()) && rbIfonResp.getTelephone()!=""){
                    String telephone = rbIfonResp.getTelephone().substring(0, 3) + "****" + rbIfonResp.getTelephone().substring(7, 11) ;
                    rbIfonResp.setTelephone(telephone);
                }
            }
        }

        dataMap.put("rbIfonResp", rbIfonResp);
        //dataMap.put("resumeList", resumeBasicList);

        //工作经历信息
        List<WorkExperienceResp> workExperienceList=workExperienceService.selectWorkExperience(workExperienceParam);
        dataMap.put("workExperienceList", workExperienceList);
        //教育经历信息
        List<EducationBackgroundResp> educationList=educationService.selectEducation(educationParam);
        dataMap.put("educationList", educationList);
        //技能评价信息
        List<SkillEvaluationResp> skillList=skillService.selectSkillEvaluation(skillParam);
        dataMap.put("skillList", skillList);
        //项目经验信息
        List<ProjectExperienceResp> projectList=projectService.selectProject(projectParam);
        dataMap.put("projectList", projectList);
        //语言能力信息
        List<LanguageabilityResp> languageList=languageService.selectLanguage(languageParam);
        dataMap.put("languageList", languageList);
        //培训经历
        List<TrainingExperienceResp> trainList=trainingService.selectTrainingExperience(trainParam);
        dataMap.put("trainList", trainList);

        //作品展示
        WorkAttachmentParam waParam = new WorkAttachmentParam();
        waParam.setResumeId(resumeId);
        waParam.setWorkType("1"); // 类型:1-作品;2-附件
        List<WorkAttachmentResp> workAttachemntList = workAttachmentService.selectWorkAttachment(waParam);

        //作品路径
        String resourceUrl = "";
        //项目路径
        String url = FileManagerUtils.getFilePath(null) + "/"; 

        if(workAttachemntList!=null && workAttachemntList.size()>0){
            for(int i=0;i<workAttachemntList.size();i++){
                resourceUrl = url + workAttachemntList.get(i).getResourceUrl();

                //先将网络图片下载到本地,再将本地图片转换成BASE64字符串
                workAttachemntList.get(i).setResourceUrl(getImageString(resourceUrl));
                workAttachemntList.get(i).setIndex(i);

            }
        }
        dataMap.put("workAttachemntList", workAttachemntList);

        ExportDoc exportDoc = new ExportDoc();
        exportDoc.create(dataMap,response);

    }

2、将本地、网络图片转换成BASE64字符串

/**
     *
     * @Title: getImageString
     * @Description: 将本地、网络图片转换成BASE64字符串
     * @param @param filename
     * @param @return
     * @param @throws IOException
     * @return String
     * @throws
     */
    public static String getImageString(String imageUrl) throws IOException {

        //InputStream in = null;

        InputStream dis = null;
        byte[] data = null;

        try {

            //方法一、将网络图片导入wolrd
            URL url = new URL(imageUrl);
            //打开网络输入流
            URLConnection conn = url.openConnection();

            //设置超时间为3秒
            //conn.setConnectTimeout(3*1000);
            //防止屏蔽程序抓取而返回403错误
            //conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  

            //得到输入流
            InputStream inputStream = conn.getInputStream();
            //获取自己数组
            data = readInputStream(inputStream); 

            /*
            //方法二、将本地图片导入wolrd,打开本地输入流
            in = new FileInputStream(imageUrl);
            data = new byte[in.available()];
            in.read(data);
            in.close();
            */

        } catch (IOException e) {
            throw e;
        } finally {
            if (dis != null)
                dis.close();
        }

        BASE64Encoder encoder = new BASE64Encoder();

        return data != null ? encoder.encode(data) : "";

    }
/**
     *
     * @Title: readInputStream
     * @Description: 将网络图片流转换成数组
     * @param @param inputStream
     * @param @return
     * @param @throws IOException
     * @return byte[]
     * @throws
     */
    public static  byte[] readInputStream(InputStream inputStream) throws IOException {
        byte[] buffer = new byte[1024];
        int len = 0;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        while((len = inputStream.read(buffer)) != -1) {
            bos.write(buffer, 0, len);
        }
        bos.close();
        return bos.toByteArray();
    }    

    /**
     * @Title: downloadImg
     * @Description: 网络图片下載到本地
     * @param @param imgUrl:网络图片,http开头
     * @param @return 返回下载到本地的图片路径
     * @param @throws Exception
     * @return String
     * @throws
     */
    public String downloadImg(String imgUrl) throws Exception{  

        // 构造URL
        URL url = new URL(imgUrl);
        // 打开连接
        URLConnection con = url.openConnection();
        //设置请求超时为5s
        con.setConnectTimeout(5*1000);
        // 输入流
        InputStream is = con.getInputStream();  

        // 1K的数据缓冲
        byte[] bs = new byte[1024];
        // 读取到的数据长度
        int len;  

        //创建下载路径
        String savePath = "D://download//";
        String filename =  UUIDUtil.getUUID()+".jpg";
        String returnUrl = savePath+filename;

        File sf = new File(savePath);
        if(!sf.exists()){
            sf.mkdirs();
        }  

        // 输出的文件流
        OutputStream os = new FileOutputStream(sf.getPath()+"\\"+filename);
        // 开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        // 完毕,关闭所有链接
        os.flush();
        os.close();
        is.close();   

        return returnUrl;
    }

3、导出模板

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 *
 * @ClassName:ExportDoc
 * @Description: 导出简历模板
 * @author:
 * @date:2015-6-25 下午3:52:12
 * @version 1.0
 */
public class ExportDoc {

    private Configuration configuration = null;

    public ExportDoc() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
    }

    /**
     *
     * @Title: create
     * @Description: 注意dataMap里存放的数据Key值要与模板中的参数相对应
     * @param @param dataMap
     * @param @param response
     * @param @throws Exception
     * @return void
     * @throws
     */
    public void create(Map<String, Object> dataMap, HttpServletResponse response)
            throws Exception {

        // 模板放在com.canyou.template包下面,通过classpath装载
        configuration.setClassForTemplateLoading(this.getClass(), "/com/***/ftl"); //自己在项目中放入模板位置
        Template template = configuration.getTemplate("resume.ftl");// 设置要装载的模板

        String fileName = String.valueOf(Math.random()*10000);
        File outFile = new File(fileName.replace(".", "")+".doc");

        if (!outFile.exists()) {
            outFile.createNewFile();
        }

        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
        template.process(dataMap, out);
        out.close();

        //导出时有界面,可选择下载路径
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(outFile.getName().getBytes("utf-8"), "utf-8"));
        response.setContentType("application/msword");

        OutputStream out1 = null;
        InputStream in = null;

        try {
            in = new FileInputStream(outFile);

            out1 = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(in);
            BufferedOutputStream bos = new BufferedOutputStream(out1);

            byte[] buff = new byte[20480];
            int bytesRead;
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);
            }
            bis.close();
            bos.flush();
            bos.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

        finally {
            if (out1 != null)
                out1.close();
            if (in != null)
                in.close();
        }

    }

}
时间: 2024-11-03 16:13:39

Java Web用Freemarker生成带图片的Word文档的相关文章

java 在MySQL中存储文件,读取文件(包括图片,word文档,excel表格,ppt,zip文件等)

转自:https://blog.csdn.net/u014475796/article/details/49893261 在设计到数据库的开发中,难免要将图片或文档文件(如word)插入到数据库中的情况.一般来说,我们可以通过插入文件相应的存储路径,而不是文件本身,来避免直接向数据库里插入的麻烦.但有些时候,直接向MySQL中插入文件,更加安全,而且更加容易管理. 首先,先要在数据库中建表.我在名为test的数据库下建立了一个叫pic的表.该表包括3列,id, caption和img.其中id是

图片转Word文档的转换方法有哪些?

图片转Word文档的方法很简单,图片中有时候会有一些内容,我们需要将这些图片上的内容转换成Word文档的形式,将图片转换成Word文档,下面就让小编给大家简单介绍一下. 步骤一:我们需要将文件准备好,然后通过在浏览器上的搜索迅捷PDF在线转换器进入到在线网站中去:步骤二:找到导航栏中的图片文字识别中的图片转Word,然后点击进入即可:步骤三:然后将文件寻找直接拖动到界面或是点击文件进行选择到界面中即可:步骤四:文件上传完成即可自动进行转换,文件转换是需要一定的时间的,我们需要耐心的等待一段时间:

转:Java生成带有二维码图片的word文档

(一)功能描述:在智能终端的系统中,对所有学员的信息要生成带有二维码图片的报到证与准考证的word文档 (二)实现过程: 1.创建报到证与准考证的word模板,在模板中填充相应的变量. 2.该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到站位的作用 1.创建报到证与准考证的word模板,在模板中填充相应的变量. 2.在该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到 3.将创建好的模板另存为.xml格式的文件 3.此时的.xml格式的文

如何提取pdf中的文字图片转为word文档

大家都知道图片形式的PDF文件中的文字是无法直接复制的,可是很多时候我们必须得将PDF里面的文本转成Word文档格式,如何才能实现呢?其实不难,首先你要保证PDF里面的图片文字足够清晰,然后利用专业的PDF文件转换工具即可. 什么是PDF转换器?所谓的PDF转换器指的是可方便的将各种流行的文件格式(Word,Excel,TXT等)转换成PDF文件,也可以将PDF文件转换为各种流行文件格式的转换工具.以迅捷PDF转换器为例,它是一款功能强大,界面简洁,功能稳定,操作简单的转换软件.作为专业的PDF

整理图片文件,图片转word文档的方法

在日常的工作中,我们可能会遇见上级给我们的整理图片的工作,但是这些工作是在原有的工作基础上添的,由于图片转文字很浪费时间,职场人遇到这样的问题都很头疼.众所周知,图片是很难直接进行编辑的一种文件格式,那我们如何才能快速的把图片上的文字识别出来呢?下面就跟着小编一起去探索一些图片转文字.图片文字识别的方法吧.图片转文字的工具选择:想快速的实现图片转文字,那就要借助第三方软件了,比如说"迅捷OCR文字识别软件"为例,便是一个很好的图片转文字工具,功能齐全,可以实现图片转word.图片转TX

Java 添加、读取、修改、删除Word文档属性

Word文档属性包括常规.摘要.统计.内容.自定义等,其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目,通过设置这些摘要信息或自定义属性可方便对文档的管理.本文中将主要介绍对文档摘要信息的添加,以及读取或者编辑.删除文档中已设置的摘要信息或自定义文档信息.下面将通过Java代码详细介绍.使用工具:Free Spire.Doc for Java (免费版)Jar文件获取及导入:方法1:通过官网下载.下载后,解压,将lib文件夹下的Spire.Doc.jar文件导入java程序.方

csdn的blog可以直接导入内含图片的word文档吗?

目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写博客需要在第三方博客平台注册帐号,且需要第三方博客平台提供API接口.目前的有的博客平台均已关闭博客接口,所以无法使用Word来发布博客. 2.发布到博客或公众号平台的图片无法转载.由于所有博客平台,公众号平台(如微信)开启了图片防盗链功能,作者发布到这些平台上的图片则无法转载到其它的网站中,这限制

向Docx4j生成的word文档添加图片和布局--第一部分

原文标题:Adding images and layout to your Docx4j-generated word documents, part 1 原文链接:http://blog.iprofs.nl/2012/10/22/adding-images-and-layout-to-your-docx4j-generated-word-documents-part-1/ 原文作者:lvdpal 发表日期:2012年10月22日 注:由于我对docx4j也不是很熟悉,所以很多专业名词不会翻译,

word 文档导出 (freemaker+jacob)--java开发

工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶段 1,.首先 是 先了解 java 通过什么方式 来操作word的导出工作.就有了下面这个帖子了: java 操作 word 的方法 :https://www.cnblogs.com/lcngu/p/5247179.html .新手可以先看看了解下. 2. 根据需求:操作word很复杂: 1.有图