找回密码
 立即注册

QQ登录

只需一步,快速开始

胡小蛋

注册会员

17

主题

68

帖子

191

积分

注册会员

积分
191
胡小蛋
注册会员   /  发表于:2018-11-13 09:11  /   查看:9000  /  回复:14
导出pdf,Times New Roman字体乱码

14 个回复

倒序浏览
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-11-15 16:24:06
推荐
您好,您的问题已经解决,下面是解决方法:

1、给您共享一个注册字体的示例工程,由于字体文件比较大,因此需要您在百度网盘里下载:

链接:https://pan.baidu.com/s/1Cw33CHC-aE9YmGyhLBlYlw 密码:sq4v

注意,整个工程需要部署到服务器来运行,否则可能访问不到字体文件。

部署方法:

https://blog.csdn.net/u014255803/article/details/73832072


2、我把您的ssjson模板文件引入了Demo,并做了一些适当的调整,附件中是代码和模板文件

index_2.html文件放在上述Demo的根目录下,与index.html路径相同

custom_temp.js文件放在Demo目录下的data文件夹中。

3、启动IIS服务器后,访问index_2.html即可。

index_2.html

5.83 KB, 下载次数: 400

custom_temp.js

57.03 KB, 下载次数: 593

回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-11-13 17:30:23
沙发
您好,导出时候的机器上要有安装过Times New Roman这个字体。不然导出会乱码
回复 使用道具 举报
胡小蛋
注册会员   /  发表于:2018-11-14 09:42:49
板凳
这个字体有安装,
回复 使用道具 举报
胡小蛋
注册会员   /  发表于:2018-11-14 09:53:41
地板
[code]  GC.Spread.Sheets.PDF.PDFFontsManager.fallbackFont = function (font) {
                                var fontInfoArray = font.split(' '), fontName = fontInfoArray[fontInfoArray.length - 1];
                                //if (fontName === 'Times New Roman' || fontName === 'Calibri' || fontName=== '"Roman""') {
                                //    //return fonts.normal;
                                //}

                                if (fontName.contains('Roman')) {
                                    return ["simsun.ttf"];
                                }

                            }
回复 使用道具 举报
胡小蛋
注册会员   /  发表于:2018-11-14 09:53:55
5#
这个方法是怎么用的
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2018-11-14 11:18:51
6#
本帖最后由 DerrickJiao 于 2020-6-15 11:34 编辑

您用的是SpreadJS, 发错专区了。
SpreadJS 需要通过registerFont 注册字体。由于Roman是英文字体,里面有中文就会乱码,你将Roman fallbackFont为宋体的操作是没有问题的。
现在要确认宋体字库已经注册。
https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/pdf/custom-font-export-pdf/purejs

还可以从服务器上直接下载一个ttf字体来注册。
参考
  1.    registerServerFont(['simhei','黑体'], 'normal', 'lib/font/simhei.ttf', false);
  2.          
复制代码
  1. function registerServerFont(name, type, serverPath, isSetFallback) {
  2.             var xhr = new XMLHttpRequest();
  3.             xhr.open('GET', serverPath, true);
  4.             xhr.responseType = 'blob';

  5.             xhr.onload = function (e) {
  6.                 if (this.status == 200) {
  7.                     // get binary data as a response
  8.                     var blob = this.response;

  9.                     //将Blob 对象转换成 ArrayBuffer
  10.                     var reader = new FileReader();
  11.                     reader.onload = function (e) {
  12.                         var fontrrayBuffer = reader.result;
  13.                         
  14.                         if(name instanceof Array){
  15.                             for(var i = 0; i < name.length; i++){
  16.                             var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont(name[i]) || {};
  17.                             fonts[type] = fontrrayBuffer;
  18.                                 GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(name[i], fonts);
  19.                             }
  20.                         }
  21.                         else{
  22.                             var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont(name) || {};
  23.                             fonts[type] = fontrrayBuffer;
  24.                             GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(name, fonts);
  25.                         }

  26.                         if (isSetFallback) {
  27.                             GC.Spread.Sheets.PDF.PDFFontsManager.fallbackFont = function (font) {
  28.                                 // if (font.indexOf(name) < 0) {
  29.                                 //     return fonts.normal;
  30.                                 // }
  31.                                 if (font.indexOf("微软雅黑") >= 0) {
  32.                                     return fonts.normal;
  33.                                 }
  34.                             }
  35.                         }
  36.                     }
  37.                     reader.readAsArrayBuffer(blob);
  38.                 }
  39.             };

  40.             xhr.send();
  41.         }
复制代码

回复 使用道具 举报
胡小蛋
注册会员   /  发表于:2018-11-14 16:33:01
7#
  1. var data = data, fontsObj = fonts;
  2.                         spread.fromJSON(data);

  3.                         //注册字体
  4.                         registerServerFont('宋体', 'normal', '/Content/plugins/SpreadJs/font/simsun.ttf', true);

  5.                         function registerServerFont(name, type, serverPath, isSetFallback) {
  6.                             var xhr = new XMLHttpRequest();
  7.                             xhr.open('GET', serverPath, true);
  8.                             xhr.responseType = 'blob';

  9.                             xhr.onload = function (e) {
  10.                                 if (this.status == 200) {
  11.                                     // get binary data as a response
  12.                                     var blob = this.response;

  13.                                     //将Blob 对象转换成 ArrayBuffer
  14.                                     var reader = new FileReader();
  15.                                     reader.onload = function (e) {
  16.                                         var fontrrayBuffer = reader.result;

  17.                                         if (name instanceof Array) {
  18.                                             for (var i = 0; i < name.length; i++) {
  19.                                                 var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont(name[i]) || {};
  20.                                                 fonts[type] = fontrrayBuffer;
  21.                                                 GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(name[i], fonts);
  22.                                             }
  23.                                         }
  24.                                         else {
  25.                                             var fonts = GC.Spread.Sheets.PDF.PDFFontsManager.getFont(name) || {};
  26.                                             fonts[type] = fontrrayBuffer;
  27.                                             GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(name, fonts);
  28.                                         }

  29.                                         if (isSetFallback) {
  30.                                             GC.Spread.Sheets.PDF.PDFFontsManager.fallbackFont = function (font) {
  31.                                                  if (font.indexOf("宋体") < 0) {
  32.                                                
  33.                                                     return fonts.normal;
  34.                                                 }
  35.                                             }
  36.                                         }
  37.                                     }
  38.                                     reader.readAsArrayBuffer(blob);
  39.                                 }
  40.                             };

  41.                             xhr.send();
  42.                         }                    

  43.                         spread.savePDF(function (blob) {
  44.                             saveAs(blob, title + '.pdf');
  45.                         }, function (error) {
  46.                             console.log(error);
  47.                         }, {
  48.                             title: title,
  49.                             author: '',
  50.                             subject: '',
  51.                             keywords: '',
  52.                             creator: ''
  53.                         });
复制代码



这段代码会出现导出还是乱码,按F12调试导出不会乱码
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-11-14 17:23:24
8#
您上边贴出的代码,第09行,您是用异步的方式来发起请求的,字体文件通常比较大,

您可以换成同步试试,把第09行代码改为:

  1. xhr.open('GET', serverPath, false);
复制代码
回复 使用道具 举报
胡小蛋
注册会员   /  发表于:2018-11-14 17:35:46
9#
这里我只能通过异步处理,同步会报错,目前出现的问题是不是调试,字体导出依旧乱码
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2018-11-14 18:08:52
10#
您好,我这边确实无法重现这个问题,您能否提供一个完整Demo?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部