使用功能:读取html文件转换PDF功能
个人错误记录: 生成的PDF又部分文字及符号乱码
使用代码来源:html转pdf(总结五种方法Java)_java html转pdf-CSDN博客
个人思路:1.字体使用问题,2.环境的编码导致的,3.读取html文件编码问题,4.在使用文件IO流过程中出现了问题
1.字体使用问题
c:/Windows/Fonts/simsun.ttc,0
本地使用的是V5.30版本,服务器使用V5.03版本?
2.环境的编码 ,服务器使用windows Server 2008??
系统编码是UTF-8
3.HTML编码为UTF-8
4.使用IO流过程问题
1.因为参考代码中有一个部分为
读取HTML 流文件,并查询当中的 或类似符号直接替换为空格
/**
* 读取HTML 流文件,并查询当中的 或类似符号直接替换为空格
*
* @param inputStream
* @return
*/
private static InputStream readInputStrem(InputStream inputStream) {
// 定义一些特殊字符的正则表达式 如:
String regEx_special = "\\&[a-zA-Z||[^\\s]]{1,10};";
try {
//<1>创建字节数组输出流,用来输出读取到的内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
StringBuilder sb = new StringBuilder();
//<2>创建缓存大小
byte[] buffer = new byte[1024]; // 1KB
//每次读取到内容的长度
int len = -1;
//<3>开始读取输入流中的内容
while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
baos.write(buffer, 0, len); //把读取到的内容写到输出流中
}
//<4> 把字节数组转换为字符串
String content = baos.toString();
// String content = sb.toString();
//<5>关闭输入流和输出流
// inputStream.close();
baos.close();
// log.info("读取的内容:{}", content);
// 判断HTML内容是否具有HTML的特殊字符标记
Pattern compile = Pattern.compile(regEx_special, Pattern.CASE_INSENSITIVE);
Matcher matcher = compile.matcher(content);
String replaceAll = matcher.replaceAll("");
// log.info("替换后的内容:{}", replaceAll);
// 将字符串转化为输入流返回
System.out.print(replaceAll);
log.info("读取的html字符串: " + replaceAll);
InputStream stringStream = getStringStream(replaceAll);
//<6>返回结果
return stringStream;
} catch (Exception e) {
e.printStackTrace();
log.error("html转pdf失败: " , e);
return null;
}finally {
System.gc();
}
}
/**
* 将一个字符串转化为输入流
* @param sInputString 字符串
* @return
*/
public static InputStream getStringStream(String sInputString) {
if (sInputString != null && !sInputString.trim().equals("")) {
try {
ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes());
return tInputStringStream;
} catch (Exception e) {
e.printStackTrace();
log.error("html转pdf失败: " , e);
}
}
return null;
}
出现PDF部分中文符号乱码就是这个部分,该部分代码可不进行调用,
如需调用的,该部分代码可改为
/**
* 将一个字符串转化为输入流
* @param sInputString 字符串
* @return
*/
public static InputStream getStringStream(String sInputString) {
if (sInputString != null && !sInputString.trim().equals("")) {
try {
ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes("UTF-8"));
return tInputStringStream;
} catch (Exception e) {
e.printStackTrace();
log.error("html转pdf失败: " , e);
}
}
return null;
}
字符串转换成为流,但是转换的编码不明确就会按照GBK的进行转换,导致了部分乱码
2. 使用流太麻烦也可以更换为
String html= IOUtils.toString(new FileInputStream(new File(srcPath)),StandardCharsets.UTF_8);
PS:当前为个人问题记录