找回密码
 立即注册

QQ登录

只需一步,快速开始

CTI_ELN

中级会员

48

主题

135

帖子

549

积分

中级会员

积分
549
CTI_ELN
中级会员   /  发表于:2023-1-30 13:53  /   查看:1503  /  回复:7
1金币
本帖最后由 Ellia.Duan 于 2023-3-7 14:29 编辑

版本:spredJS   15.2.0
问题:
1、根据提供的例子,使用自定义单元格的方式处理pdf文字显示问题,发现当一个单元格中有多行文字时,转图片会将所有文字转成一行
image.png917127380.png image.png769298095.png
请问有什么方法保持原格式吗?ssjson文件见附件
  1. import GC from '@grapecity/spread-sheets';
  2. import _vue from '@/main';

  3. function RenderHTMLTagCellType(items, size, isHorizontal) {
  4.   this.typeName = 'RenderHTMLTagCellType';
  5.   this.allowOverflow = false;
  6. }

  7. RenderHTMLTagCellType.prototype = new GC.Spread.Sheets.CellTypes.Text();

  8. RenderHTMLTagCellType.prototype.paint = function(
  9.   ctx,
  10.   value,
  11.   x,
  12.   y,
  13.   w,
  14.   h,
  15.   style,
  16.   context
  17. ) {
  18.   // 自定义单元格什么都不用做,只需要隐藏value即可。
  19.   return GC.Spread.Sheets.CellTypes.Text.prototype.paint.apply(this, [
  20.     ctx,
  21.     ' ',
  22.     x,
  23.     y,
  24.     w,
  25.     h,
  26.     style,
  27.     context,
  28.   ]);
  29. };

  30. export function _html2img(spread) {
  31.   try {
  32.     spread.suspendPaint();
  33.     let sheet = spread.getActiveSheet();
  34.     let sels = sheet.getSelections();
  35.     if (!sels || sels.length !== 1) throw new Error('选中区域不合法');
  36.     let range = sels[0];

  37.     for (let r = 0; r < range.rowCount; r++) {
  38.       let row = range.row + r;
  39.       for (let c = 0; c < range.colCount; c++) {
  40.         let col = range.col + c;
  41.         let span = sheet.getSpan(row, col);
  42.         if (span && span.row === row && span.col === col) {
  43.           if (sheet.getText(row, col) && sheet.getText(row, col) !== '') {
  44.             let range = new GC.Spread.Sheets.Range(
  45.               row,
  46.               col,
  47.               span.rowCount,
  48.               span.colCount
  49.             );
  50.             html2ImgByRange(sheet, range);
  51.           }
  52.         }
  53.         if (!span) {
  54.           let range = new GC.Spread.Sheets.Range(row, col, 1, 1);
  55.           html2ImgByRange(sheet, range);
  56.         }
  57.       }
  58.     }
  59.     spread.resumePaint();
  60.   } catch (error) {
  61.     _vue.$alertMessageBox('text2img发生异常!');
  62.     console.log(error);
  63.   }
  64. }

  65. function html2ImgByRange(sheet, range) {
  66.   try {
  67.     let value = sheet
  68.       .getRange(range.row, range.col, range.rowCount, range.colCount)
  69.       .toHtml();
  70.     let style = sheet.getActualStyle(range.row, range.col),
  71.       cell = sheet.getCell(range.row, range.col);

  72.     let svgPattern =
  73.       '<svg xmlns="http://www.w3.org/2000/svg" width="{0}" height="{1}">' +
  74.       '<foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="font:{2}">{3}</div></foreignObject></svg>';

  75.     let w = cell.sheet.getCellRect(cell.row, cell.col).width;
  76.     let h = cell.sheet.getCellRect(cell.row, cell.col).height;
  77.     let data = svgPattern
  78.       .replace('{0}', w)
  79.       .replace('{1}', h)
  80.       .replace('{2}', style.font)
  81.       .replace('{3}', value);
  82.     let doc = document.implementation.createHTMLDocument('');
  83.     doc.write(data);
  84.     // Get well-formed markup
  85.     data = new XMLSerializer().serializeToString(doc.body.children[0]);

  86.     let img = new Image();
  87.     img.src =
  88.       'data:image/svg+xml;base64,' +
  89.       window.btoa(unescape(encodeURIComponent(data))); // 涉及中文时的转码
  90.     cell.tag(img);
  91.     sheet.getCell(cell.row, cell.col).backgroundImage(img.src);
  92.     img.onload = (function(cell, value, img) {
  93.       return () => {
  94.         cell.cellType(new RenderHTMLTagCellType());
  95.         cell.value('');
  96.         cell.backgroundImageLayout(GC.Spread.Sheets.ImageLayout.center);
  97.         console.log(img.src);
  98.         cell.backgroundImage(img.src);
  99.       };
  100.     })(cell, value, img);
  101.   } catch (error) {
  102.     console.log(error);
  103.   }
  104. }
复制代码



2、可不可以通过注册字体,直接解决上下标的问题?比如  arial unicode ms.ttf  字体,纯前端注册字体,发现导出pdf不支持改字体,字体见附件
image.png117405089.png





230929513-20230130095755-1.1.zip

180.69 KB, 阅读权限: 100, 下载次数: 1

arial unicode ms.rar

11.73 MB, 下载次数: 73

7 个回复

倒序浏览
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-1-30 17:27:50
沙发
本帖最后由 Clark.Pan 于 2023-1-30 18:05 编辑

我这边看到,代码中提供了一些方法
这个方法我是了之后最终是给坐标13,28这个单元格添加了一个图片,如下图所示
image.png304721984.png

我不明白的是这个操作跟您前面描述的问题有什么关系,请详细的在描述一下。

回复 使用道具 举报
CTI_ELN
中级会员   /  发表于:2023-1-31 16:59:10
板凳
Clark.Pan 发表于 2023-1-30 17:27
我这边看到,代码中提供了一些方法
这个方法我是了之后最终是给坐标13,28这个单元格添加了一个图片,如下 ...

转成图片主要是解决生成pdf的时候,上下标显示的问题,比如10的3次幂,他的幂在pdf上可能直接显示为□
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-1-31 18:01:08
地板
但是你这个单元格设置背景图片是在13,28这个坐标,跟你所说的第10行并没有什么关系。
回复 使用道具 举报
CTI_ELN
中级会员   /  发表于:2023-2-2 15:45:38
5#
Clark.Pan 发表于 2023-1-31 18:01
但是你这个单元格设置背景图片是在13,28这个坐标,跟你所说的第10行并没有什么关系。

那是我说的有歧义吧,我这边给出的是代码片段,真正的调用是  鼠标选中单元格,然后通过右键菜单调用 _html2img  方法,使用  sheet.getSelections()  获取选中的区域;再将区域转化为图片。

在转换为图片后,我发现单元格中如果是多行文字,转成图片后会变为一行,所以想知道有没有方法解决这个问题,令图片和原单元格文字排版一致
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-2-2 19:27:20
6#
明白了,我这边已经重现问题了,我调研一下给您回复。
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-6 18:01:27
7#
您好,
造成问题的原因是导出HTML的时候没有换行。该问题已经确认为产品bug,后续会进行修复(SJS-16778)本贴改为保留处理,并移至bug反馈板块
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-4-4 10:49:07
8#
该问题预计V16.1.0版本进行修复,目前该版本还未发,目前预计4月底5月初会发布。请您关注一下新版本更新,等V16.1.0发布,您可以下载对应更新进行验证。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部