2

一个应用程序由作为前端的 Flex、作为中间层的 ColdFusion 9 和作为后端的 MySQL 5 组成。

MySQL 表包含一些包含 HTML 格式的字段。因此,如果一个字段具有值字符串“测试记录”,它将被存储 <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 格式存储,因此占用的空间更多,并且无法控制打印文本的字体类型和字体大小。

  1. ColdFusion 9 中是否有任何函数可以将字段的值转换为常规文本(没有 HTML 格式),这样如果“测试记录”无论是存储为字体大小 10 还是字体大小 30,都将打印相同的内容?

  2. 我正在考虑一种方法是在 Flex 应用程序中打印记录,使用 TextArea 控件(在 Flex 中)的 field.text 属性转换为常规文本,然后将转换后的值传递给 ColdFusion 以在 PDF 文档中打印. 还有其他更好的选择吗?

任何建议,将不胜感激。

4

2 回答 2

1

另一种方法是使用像jsoup这样的 HTML 解析器。

如果 HTML 不可预测或可能无效,则特别推荐这样做,因为它将以与浏览器相同的方式处理此问题(而正则表达式只是模式匹配;它实际上并不知道什么是/不是标签)。

<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 目录中,然后重新启动服务器。

于 2012-09-18T22:36:53.230 回答
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>

我在示例的 HTML 中添加了一个附加哈希标记以避免语法错误。从您所说的来看,我认为无论如何这将由数据库查询获取。

另外(现在挑剔!)我建议用新值更新数据库,如果可以的话,摆脱内联样式以支持 CSS ;-)

于 2012-09-18T19:14:55.223 回答