Java 读取rtf模板内容然后替换内容,保存为word

Java 读取rtf模板内容 替换变化部分形成 新的rtf文档,参考了一些资料。废话不说,直接上代码。

其中一些代码来自网络。

package com.itext;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

/**
 *
 * @author datas
 *
 */
public class TestRtf {
 private int inext = 0;

 /**
  * 字符串转换为rtf编码
  *
  * @param content
  * @return
  */
 public String strToRtf(String content) {
  char[] digital = "0123456789ABCDEF".toCharArray();
  StringBuffer sb = new StringBuffer("");
  byte[] bs = content.getBytes();
  int bit;
  for (int i = 0; i < bs.length; i++) {
   bit = (bs[i] & 0x0f0) >> 4;
   /*
    * 增加中文支持思路:通过getBytes获取的中文的assii小于0,根据rtf中文的的编码 所以只需要在中文的2个编码
    * 第一个编码前加 第二个编码后加 加了一个变量inext 用来判断中文的assii 前一个和后一个。
    * 这样在rtf中文的乱码就可以解决了。
    */
   if (bs[i] > 0) {
    sb.append("\\'");
   } else {
    if (inext == 0) {
     // 通过写字板创建的rtf模板 add by wde
     // sb.append("\\lang2052\\f1");
     // 通过WPS2009创建的rtf模板 add by wde
     // sb.append("\\lang1033 \\langnp1033 \\langfe2052 \\langfenp2052 \\cf1");
     // 通过MS word创建的rtf模板 add by wde
     sb.append("\\loch\\af2\\hich\\af2\\dbch\\f31505");
     sb.append("\\'");
     inext = 1;
    } else {
     sb.append("\\'");
    }
   }
   sb.append(digital[bit]);
   bit = bs[i] & 0x0f;
   sb.append(digital[bit]);
   if (bs[i] < 0 && inext == 1) {
    // 通过写字板创建的rtf模板 add by wde
    // sb.append("\\lang1033\\f0");
    // 通过WPS2009创建的rtf模板 add by wde
    // sb.append(" \\lang1033\\langnp1033 \\langfe2052\\langfenp2052 \\cf1");
    // 通过MS word创建的rtf模板 add by wde
    sb.append("\\hich\\af2\\dbch\\af31505\\loch\\f2");
    inext = 0;
   }
  }
  return sb.toString();
 }

 /**
  * 字节形式读取rtf模板内容
  */
 public String readByteRtf(String path) {
  String sourcecontent = "";
  try {
   InputStream ins = new FileInputStream(path);
   byte[] b = new byte[1024];
   if (ins == null) {
    System.out.println("源模板文件不存在");
   }
   int bytesRead = 0;
   while (true) {
    bytesRead = ins.read(b, 0, 1024);
    if (bytesRead == -1) {
     System.out.println("读取模板文件结束");
     break;
    }
    sourcecontent += new String(b, 0, bytesRead);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return sourcecontent;
 }

 public void saveFile(String sourcecontent, String targetcontent) {
  /* 构建生成文件名 targetname:12时10分23秒_文书.rtf */
  Date current = new Date();
  SimpleDateFormat sdf = new java.text.SimpleDateFormat(
    "yyyy-MM-dd HH:mm:ss");
  String targetname = sdf.format(current).substring(11, 13) + "时";
  targetname += sdf.format(current).substring(14, 16) + "分";
  targetname += sdf.format(current).substring(17, 19) + "秒";
  targetname += "_文书.doc";
  /* 结果输出保存到文件 */
  try {
   FileWriter fw = new FileWriter(getSavePath() + "\\" + targetname,
     true);
   PrintWriter out = new PrintWriter(fw);
   if (targetcontent.equals("") || targetcontent == "") {
    out.println(sourcecontent);
   } else {
    out.println(targetcontent);
   }
   out.close();
   fw.close();
   System.out.println(getSavePath() + "  该目录下生成文件" + targetname
     + " 成功");
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * 替换文档的可变部分
  *
  * @param content
  * @param replacecontent
  * @param flag
  * @return
  */
 public String replaceRTF(String content, String replacecontent, int flag) {
  String rc = strToRtf(replacecontent);
  String target = "";
  switch (flag) {
  case 0:
   target = content.replace("$1$", rc);
   break;
  case 1:
   target = content.replace("$2$", rc);
   break;
  case 2:
   target = content.replace("$3$", rc);
   break;
  case 3:
   target = content.replace("$4$", rc);
   break;
  case 4:
   target = content.replace("$5$", rc);
   break;
  case 5:
   target = content.replace("$6$", rc);
   break; 
  default:
   target = content.replaceAll("\\$\\d{1,2}\\$", " ");
   break;
  }
  return target;
 }

 /**
  * 获取文件路径
  *
  * @param flag
  * @return
  */
 public String getSavePath() {

  String path = "d:\\";

  File fDirecotry = new File(path);
  if (!fDirecotry.exists()) {
   fDirecotry.mkdirs();
  }
  return path;
 }

 /**
  * 半角转为全角
  */
 public String ToSBC(String input) {
  char[] c = input.toCharArray();
  for (int i = 0; i < c.length; i++) {
   if (c[i] == 32) {
    c[i] = (char) 12288;
    continue;
   }
   if (c[i] < 127) {
    c[i] = (char) (c[i] + 65248);
   }
  }
  return new String(c);
 }

 public void rgModel(String[] content) {

  /* 字节形式读取模板文件内容,将结果转为字符串 */
  String strpath = getSavePath();
  String sourname = strpath + "\\" + "行政处罚部分法律文书格式.rtf";
  // 读取文件
  String sourcecontent = readByteRtf(sourname);
  /* 修改变化部分 */
  String targetcontent = "";
  /**
   * 拆分之后的数组元素与模板中的标识符对应关系
   */
  for (int i = 0; i < content.length; i++) {
   if (i == 0) {
    targetcontent = replaceRTF(sourcecontent, content[i], i);
    inext = 0;
   } else {
    targetcontent = replaceRTF(targetcontent, content[i], i);
   }
  }
  // 保存文件
  saveFile(sourcecontent, targetcontent);
 }

 public static void main(String[] args) {
  TestRtf rt = new TestRtf();
  //一定要加一个空字符串,才能把大于6的$7$等替换的成空。
  String[] content = {"好sss", "人aaas", "hasddsa在", "n3h在", "nssasads2在","dh要assd11"," "};
  rt.rgModel(content);
 }

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值