BIRT 能识别 RTF 标签吗?
Posted
技术标签:
【中文标题】BIRT 能识别 RTF 标签吗?【英文标题】:Does BIRT recognize RTF tags? 【发布时间】:2021-10-08 04:00:37 【问题描述】:我有一个返回 BLOB 字段的数据集(这就是 BIRT 在表中的绑定方式)。在数据库中,数据类型被归类为 Long Raw,所以我需要使用通用 convert 将 二进制数据 转换为 text 功能。
问题是 BIRT 在转换后似乎无法识别嵌入式 RTF 表达式,但可能是我做错了什么。
我使用了一个 Dynamic Text 组件,该组件包含在 Expression Builder 属性中转换的数据。此外,该字段的内容类型设置为 RTF。
这是 BIRT 的显示方式
\rtf1\ansi
\ansicpg1252\deff0\fonttbl\f0\fnil MS
Sans Serif;\f1\fnil\fcharset0 MS Sans
Serif;
\viewkind4\uc1\pard\qc\lang1046\b
\f0\fs16 1 x\f1\'ed\-cara de leite
\par 1 colher de sopa de fermendo em p
\'f3
\par 3 x\'ed\-caras de farinha de trigo
\par 3 x\'ed\-caras de a\'e7\'facar
\par 3 ovos
\par 4 colheres de margarina\b0\f0
\par
如我们所见,文本包含与主要内容混合的 RTF 标签。
这个想法是让 birt 删除标签或能够以某种方式对其进行建模。
这是我期待的输出
1 xícara de leite
1 colher de sopa de fermento
3 xícaras de farinha de trigo
【问题讨论】:
【参考方案1】:经过一些研究,有一个可能的答案,但不是完美的答案,因为目标是以某种方式对 RTF 标签进行建模。这里是:
操作系统转换二进制数据的第一步
function convert( byteArr )
const convertedbyteArr = "";
for(var i = 0; i<byteArr.length;i++)
teste += String.fromCharCode(byteArr[i]);
return convertedbyteArr ;
下一步是使用正则表达式删除所有 RTF 标签。此解决方案基于此帖子:Regular Expression for extracting text from an RTF string。
function removeRTF (str)
var basicRtfPattern = /\\*?\\[^]+;|[]|\\[A-Za-z]+\n?(?:-?\d+)?[ ]?/g;
var newLineSlashesPattern = /\\\n/g;
var ctrlCharPattern = /\n\\f[0-9]\s/g;
return str
.replace(ctrlCharPattern, "")
.replace(basicRtfPattern, "")
.replace(newLineSlashesPattern, "\n")
.replace(/\\'c9/g,"É")
.replace(/\\'cd/g,"Í")
.replace(/\\'ed\\-/g,"í")
.replace(/\\'f3/g,"ó")
.replace(/\\'d3/g,"Ó")
.replace(/\\'fa/g,"ú")
.replace(/\\'fa/g,"ú")
.replace(/\\'da/g,"Ú")
.replace(/\\'e7/g,"ç")
.replace(/\\'e1/g,"á")
.replace(/\\'e1/g,"á")
.replace(/\\'e0/g,"à")
.replace(/\\'c0/g,"À")
.replace(/\\'c1/g,"Á")
.trim();
请务必注意,重音是单独处理的。
【讨论】:
【参考方案2】:BIRT 的旧 ROM 规范表明,曾几何时有计划支持 RTF 格式的文本,但从未实现(也永远不会实现)。
在文本文件中编码的格式化文本的事实标准现在是 html。
【讨论】:
以上是关于BIRT 能识别 RTF 标签吗?的主要内容,如果未能解决你的问题,请参考以下文章