场景:由于出于安全机制的考虑,所以通常会把存入数据库中的某些html特殊字符进行转义,例如空格转义后存到数据库就会变成“ ”,但是这些数据库中的字符传到Freemaker页面,然后页面再进行转化成pdf会出现错误,现总结几个解决方法写给大家以供参考:

1、直接在ftl页面的头部进行定义,把ftl页面上可能出现的已经转义过的html特殊字符再重新定义成它们原本所代表的意思,具体实现如下: 
 

<span style="white-space:pre">	</span><!DOCTYPE html[
	<!ENTITY nbsp " ">
	<!ENTITY mdash "—">
	<!ENTITY trade "™">
	<!ENTITY copy "©">
	<!ENTITY reg "®">
	<!ENTITY lt "<">
	<!ENTITY gt ">">
	<!ENTITY times "×">
	<!ENTITY divide "÷">
	<!ENTITY acute "'">
	]>

这样就使得ftl页面上出现html转义后的特殊字符就会自动变换为其原本的意思,例如出现“&nbsp;”就会直接变换为空格。但是这种方式有一个很大的局限性,就是只能变换里面已经定义过的html特殊字符,如果ftl页面上出现未定义的html特使字符,那么转换成pdf时还是会出现错误的。
2、先在后台进行反转义,就是把数据库中查询出来的带有特殊字符的字符串进行反转义,让其变成未转义之前的字符串,然后再传到ftl页面上。java中spring有一个自带的方法HtmlUtils.htmlUnescape(String str)可以直接反转义。但是后来我在转化成pdf的时候出现一个问题:反转义后的字符串传到页面然后在转化成pdf 的过程中还是报错的,不知道是什么原因,后来我又使用freemaker自带的一个方法进行再次转义就可以了,即${x?html}。具体步骤就是

先在后台进行字符串反转义
然后在ftl页面再使用${x?html}进行再次转义
以上两种方法比较简单,肯定还会有其它的方法,希望有的话多多交流!

备注:

org.springframework.web.util.HtmlUtils 可以实现HTML标签及转义字符之间的转换

/** HTML转义 **/  
String s = HtmlUtils.htmlEscape("<div>hello world</div><p> </p>");  
System.out.println(s);  
String s2 = HtmlUtils.htmlUnescape(s);  
System.out.println(s2);

输出的结果如下: 

<div>hello world</div><p> </p>  
  
<div>hello world</div><p> </p>