轉:Java生成帶有二維碼圖片的word文檔

(一)功能描述在智能終端的系統中,對全部學員的信息要生成帶有二維碼圖片的報到證與准考證的word文檔java

(二)實現過程:工具

                  1.建立報到證與准考證的word模板,在模板中填充相應的變量。this

              

                  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>
相關文章
相關標籤/搜索