首先,闡述下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也是正常的