前端解决前端英文Chrome 浏览器出现的生成PDF吃字及超链接显示问题

224 阅读1分钟

通常情况下,报表由文本内容组成,浏览器通过使用glyphs来渲染的字体形状。字体资源包含将字符编码映射到代表这些字符的字形的信息。因此,浏览器需要访问字体资源,才能够按照预期显示文本。 当 ActiveReportsJS 渲染报表时,它将这些字体属性翻译成font-family, font-style、font-style 和 font-weight 和font-weightCSS样式属性,并依靠浏览器来解析相关的字体资源,提取所需的字形。浏览器有两种方式来访问字体资源它们可能安装在浏览器运行的系统中,也可能是可下载的。

但经常在浏览器为英文或者其他设置的情况下会出现富文本框右侧吃字,超链接显示不全等问题。 究其原因还是字体未正确的读取,导致ActiveReportsJS 测量字的时候测量错误,计算空间失误导致无法正确显示字体。

image.png

解决方法:

  1. 添加 fontsConfig.json文件及对应应用的字体文件,注意 fontConfig.json 中顶部的 name字段必须存在,否则报错。
{
        "name": "",
        "path": "",
        "descriptors": [
        
                {
                        "name": "ABC",
                        "source": "fonts/Chinese.ttf"
                },
                        
                {
                        "name": "CBC",
                        "source": "fonts/Chinese.ttf"
                },
                {
                        "name": "黑体",
                        "source": "fonts/Chinese.ttf"
                }
        ]
}
  1. 调用GC.ActiveReports.Core.ARJS.FontStore.registerFonts() ,该API 也会返回Promise对象
 ARJS.FontStore.registerFonts("./fonts/fontsConfig.json")
      .then(function(){
        return fetch("./fonts/fontsConfig.json");
      })
      .then(function (e) { 
        return e.json();
      })
      .then(function (fonts) {

        const settings = {
          info: {
            title: 'Invoice List',
            subject: 'This is the Invoice List',
            author: 'John K',
            keywords: 'PDF; import; export',
          },
          fonts: fonts,
        };
        const lang = 'HK';
        function blob2base64(blob) {
          return new Promise((resolve, reject) => {
            var reader = new FileReader();
            reader.onloadend = () => {
              resolve(reader.result);
            };
            reader.onerror = () => {
              reject(reader.err);
            };
            reader.readAsDataURL(blob);
          });
        }

  1. 设置定时器,等字体加载完成后在进行渲染
  function exportDocumentOnViewerReady() {
    var exportInterval = setInterval(function () {
      if (!window.arjsViewerInitialized) {
        return;
      }

      window.generateProposal('超链接吃字.rdlx-json');

      clearInterval(exportInterval);

    }, 300);
  }