0

我有一个返回BLOB字段的数据集(这就是 BIRT 在表中绑定的方式)。在数据库中,数据类型被分类为Long Raw,因此我需要使用通用转换函数将二进制数据转换为文本。

问题是 BIRT 在转换后似乎无法识别嵌入式 RTF 表达式,但我可能做错了什么。

我使用的是包含在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
4

2 回答 2

0

经过一些研究,有一个可能的答案,但不是完美的答案,因为目标是以某种方式对 RTF 标签进行建模。这里是:

第一步 os 转换二进制数据

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();
}

重要的是要注意重音是单独处理的。

于 2021-08-03T23:39:23.943 回答
0

BIRT 的旧 ROM 规范表明曾有计划支持 RTF 格式的文本,但从未实现(也永远不会实现)。

在文本文件中编码的格式化文本的事实标准现在是 HTML。

于 2021-08-10T09:27:02.997 回答