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


    (一)功能描述在智能终端的系统中,对所有学员的信息要生成带有二维码图片的报到证与准考证的word文档

    (二)实现过程:

                      1.创建报到证与准考证的word模板,在模板中填充相应的变量。

                  

                      2.该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到站位的作用
                      1.创建报到证与准考证的word模板,在模板中填充相应的变量。
                      2.在该模板中存在图片,所以在制作模板中应先在相应的位置放一张图片,调整好大小,起到
                      
                      3.将创建好的模板另存为.xml格式的文件
                      3.此时的.xml格式的文件在图片的位置就会出现base64位图片代码,将此代码删掉,换成相应的变量,保存
                      4.在项目中创建template.ftl,将xml中的代码粘贴过去。
                      4.在该功能中需要用到freemarker-2.3.13.jar架包
                      5.编写后台代码。
                      6.模板样式如下图所示:
    word模板样式
     
     
     
     
     
     
     
     
    (三)后台主要代码实现过程:
    1.查询出报到证与准考证上所要展示的信息,将查询的图片调用工具类HandlImage里面的getImageStr方法,将图片转为base64码的代码,将查询到的数据放到list中,下面是部分代码:
    List list=this.documentService.printProofByMid();//获取报到证与准考证的信息放到list中
     for(int i=0;i<list.size();i++){//通过遍历list,获取list中图片的路径
        User u=(User) list.get(i);
        User uu=new User();
       filePath=request.getRealPath("image2/" + u.getBak1() + "_" + u.getName() + ".png");//获取图片的路径
        uu.setName(u.getName());
        ..........//其他属性同样
        uu.setImage(HandlImage.getImageStr(filePath));//调用HandlImage中的getImageStr方法,将图片转为base64码
        addList.add(uu);//将对象添加到addList中
      }
    Map<String,Object> map=new HashMap<String,Object>();
      if( addList.size()>0){ //对addList进行非空的判断 
      map.put("TED", addList); //将addList放到map中
       DocExportUtils.downLoadDoc(request,map);//调用DocExportUtils下的downLoadDoc方法,生成word文档
      }
    2.下面的方法就是生成word文档的方法,下面是此方法的全部代码:
    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.UnsupportedEncodingException;
    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 DocExportUtils {
     private Configuration configuration = null;
     public DocExportUtils() {
      configuration = new Configuration();
      configuration.setDefaultEncoding("utf-8");
     }
     public static void downLoadDoc(HttpServletRequest request,Map map){
      Configuration configuration = new Configuration();
      configuration.setDefaultEncoding("utf-8");
      configuration.setClassForTemplateLoading(DocExportUtils.class, "/com/ecoinfo/terminal/template");//红色部分存放freemarker模板的路径
      Template t=null;
      try {
       t = configuration.getTemplate("template.ftl");// //template.ftl为要装载的模板
      } catch (IOException e) {
       e.printStackTrace();
      }
      String name=(String)map.get("title");  //生成word文档的名称
      File outFile = new File(request.getRealPath("Word/" + name + ".doc"));// 输出文档路径
      Writer out = null;
      try {
        out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
      } catch (FileNotFoundException e1) {
       e1.printStackTrace();
      } catch (UnsupportedEncodingException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
         try {
       t.process(map, out);
      } catch (TemplateException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
     }
    }
    (四)在生成word中使用到的工具方法:
    描述:在模板中存在图片,所以要将图片转为base64码的图片,只要将图片所存放的路径传到getImageStr中,通过下面方法就可以生成base64码的图片代码,下面就是转为base64码的工具方法的全部代码:
    /**
     * 处理图片
     * HandlImage类,用来将图片转为base64码
     */ 
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import com.ecoinfo.commons.security.BASE64Encoder;
    public class HandlImage{
     
     public static String getImageStr(String filepath){//filepath图片所存放的路径
     
      InputStream in =null;
      try {
       in=new FileInputStream(filepath);
      } catch (FileNotFoundException e1) {
       // TODO Auto-generated catch block
       e1.printStackTrace();
      }
     if(!"".equals(in)&&in!=null){
      byte[]data=null;
       try{
       data=new byte[in.available()];
       in.read(data);
       in.close();
       }catch(IOException e){
        e.printStackTrace();}
       BASE64Encoder encoder=new BASE64Encoder();
       return encoder.encode(data);
     }else{
      return null;
     }
    }
    (五)注意事项:
    1.在模板中,对于图片的list的循环,要将循环图片的位置的代码替换为变量的形式,否则,在word文档中出现的图片都是第一张图片,具体修改如下所示:
    修改图片具体方法

     
     
     
     
     
     
    2.在freemarker中有些特殊的字符是需要转义一下才可以实现,在下面列出需要转义字符的方法代码:
    <#if ted.Name??>${((ted.Name?replace("&","&amp;"))?replace("<","&lt;"))?replace(">","&gt;")}</#if>
  • 相关阅读:
    删除链表的倒数第N个节点
    SVN快速入门(TSVN)
    C# HttpWebRequest提交数据方式浅析
    简单的3个SQL视图搞定所有SqlServer数据库字典
    简单统计SQLSERVER用户数据表大小(包括记录总数和空间占用情况)
    详细讲解Android对自己的应用代码进行混淆加密防止反编译
    PHP之网络编程
    PHP之ThinkPHP模板标签操作
    PHP之ThinkPHP数据操作CURD
    关于数组的取极值和排序
  • 原文地址:https://www.cnblogs.com/spp0152/p/3969926.html
Copyright © 2020-2023  润新知