首先,阐述下rtf,富文本格式文档,目前常用来做模板;
我遇到的问题是rtf中替换后的文本显示是正常的,rtf直接转pdf就不正常了,通过notpad++ 打开后发现rtf本身内容编码是我没有见过的(查资料说时ansi,具体我也不晓得了),我替换后的则是中文显示,这样转换后中文全部乱码;
解决办法如下,直接贴util类分享
package com.ywlqi.util; public class StringToRtfUtil{ public static String chineseStrTortf(String content){ StringBuffer sb = new StringBuffer(""); if (content == null) return null; for (char c : content.toCharArray()) { if(isChinese(c)){ System.out.println(c); sb.append(strToRtf(String.valueOf(c))); }else{ sb.append(c); } } return sb.toString(); } public static void main(String[] args) { System.out.println(chineseStrTortf("1)在合同有效期内,乙方为甲方提供简历库下载的用户名与初始密码")); } public static byte[] charToByte(char c) { byte[] b = new byte[2]; b[0] = (byte) ((c & 0xFF00) >> 8); b[1] = (byte) (c & 0xFF); return b; } public static boolean isChinese(char c) { // return c >= 0x4E00 && c <= 0x9FA5;// 根据字节码判断 Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) { return true; } return false; } public static String strToRtf(String content) { StringBuffer sb = new StringBuffer(""); try { char[] digital = "0123456789ABCDEF".toCharArray(); byte[] bs = null; bs = content.getBytes("GB2312"); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("\'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } public static String byteToRtf(byte[] bs) { StringBuffer sb = new StringBuffer(""); try { char[] digital = "0123456789ABCDEF".toCharArray(); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("\'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } } catch (Exception e) { e.printStackTrace(); } return sb.toString(); } }
在模板替换的时候使用
chineseStrTortf或者strToRtf即可,两者区别在于,你是把所有字符串转成rtf编码还是仅转换中文
rtfTemplate.put("value_taxAddr", StringToRtfUtil.strToRtf(taxAddr));
这样rtf文档显示正常,pdf也是正常的