应用程序包括Flex作为前端,ColdFusion 9作为中间层,MySQL 5作为后端。
MySQL表包含一些包含HTML格式的字段。因此,如果字段具有值字符串“Test Record”,则将其存储为
<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="#0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT>
在MySQL表中
现在,此字段的值将作为
打印在PDF文档中<cfdocument format="pdf" filename="#report_filename_format#" orientation="landscape"
overwrite="yes"
marginbottom="0" marginleft="0" marginright="0" margintop="0"
pagetype="legal">
<tr>
<td width="20%" style="background-color:##CCCCCC; font-weight:bold; text-transform:uppercase; vertical-align:top;">
Value
</td>
<td width="80%">#printrecord.field_value#</td>
</tr>
因为,字段值以HTML格式存储,所占用的空间更多而且没有 控制打印文本的字体类型和字体大小。
ColdFusion 9中是否有任何函数可以将字段的值转换为常规文本(没有HTML格式),这样如果“测试记录”打印相同,无论它是否存储为字体大小10或者字体大小30?
我在考虑一种方法是在Flex应用程序中打印记录,使用TextArea控件的field.text属性(在Flex中) 转换为常规文本,然后将转换后的值传递给ColdFusion以在PDF文档中打印。还有其他更好的选择吗?
任何建议将不胜感激。
答案 0 :(得分:1)
实际上“解决方案”非常简单:
<cfscript>
data = '<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="##0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT>';
regex = "<(.|\n)*?>";
result = reReplaceNoCase(data, regex, "", "all");
writeOutput(result);
</cfscript>
我为我的示例添加了一个添加哈希标记,以避免语法错误。从你所说的,我认为无论如何这将由db查询获取。
另外(现在挑剔!)我建议用新值更新数据库,如果可以的话,摆脱内联样式,转而使用CSS; - )
答案 1 :(得分:1)
另一种方法是使用像jsoup这样的HTML解析器。
如果HTML不可预测或可能无效,则特别推荐这样做,因为它将以与浏览器相同的方式处理此问题(而正则表达式只是模式匹配;它实际上并不知道什么是/ isn不是标签。
<cfset data = '<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="12" COLOR="##0B333C" LETTERSPACING="0" KERNING="0">Test Record<FONT SIZE="8"></FONT></FONT></P></TEXTFORMAT>' />
<cfset jsoup = createObject('java','org.jsoup.Jsoup') />
<cfset text = jsoup.parse(data).text() />
<cfdump var=#text# />
jsoup线可以执行一次并存储在例如应用范围。此外,您需要使用jsoup jar才能使其正常工作 - 对于CF9,您需要将其复制到{coldfusion} / lib目录中,然后重新启动服务器。