版本:23.6
编程语言:java
问题截图:
image.jpg (108.5 KB)
源文件:
鑫华医院项目(1).zip (23.9 KB)
目前有两个服务器,一个可以正常转换,另一个转换后缺少文字。
两个服务器的simsun.ttf字体完全一致,CPU型号不同。
正常服务器CPU:ntel(R) Xeon(R) Gold 5220R CPU @ 2.20GHz Linux版本:Linux 3.10.0-957.el7.x86_64
缺少文字的服务器CPU:Montage Jintide(R) C5220R Linux版本:Linux 3.10.0-1160.el7.x86_64
请问CPU和Linux版本是否影响了xls文件的转换。以及是否有哪些解决方式。
@ZhonghaoSun
文字缺失是由于缺少字体导致的。如果你确定安装了字体,那么可能是无法找到安装的字体导致文字缺失。你可以参考以下文档配置自定义字体目录。
Class Libraries & REST APIs for the developers to manipulate & process Files from Word, Excel, PowerPoint, Visio, PDF, CAD & several other categories in Web, Desktop or Mobile apps. Develop & deploy on Windows, Linux, MacOS &...
这两台服务器中已经安装了相同的字体simusn,并且使用的同一套代码
@ZhonghaoSun
可能由于权限问题或者其他原因无法找到字体,所以你可以通过设置自定义字体文件夹来解决问题,设置前请确保有权限访问自定义的字体文件夹。
我使用了以下代码设置字体
static {
setFont();
}
private static void setFont() {
try {
FolderFontSource sourceFolder = new FolderFontSource("./resources/fonts", false);
FontConfigs.setFontSources(new FontSourceBase[]{sourceFolder});
logger.info("成功执行完Aspose-cells自定义字体文件夹设置");
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
转换后文字没有缺少,但是字体变了,原文件中字体是宋体,转换后的文件,字体为:FZKTJW–GB1-0
转换后的文件:
鑫华医院项目(0618).zip (159.9 KB)
字体文件夹中包含有宋体(simsun.ttf):
image.png (71.6 KB)
@ZhonghaoSun
设置自定义字体文件夹后,文本可以显示但是字体却变了。是因为没有找到需要的字体,这时字体替代机制生效了,找到了类似的字体进行文本显示。你需要检查文件所用的字体是否全部安装在了自定义字体文件夹。关于字体替代机制,请查看文档。
Class Libraries & REST APIs for the developers to manipulate & process Files from Word, Excel, PowerPoint, Visio, PDF, CAD & several other categories in Web, Desktop or Mobile apps. Develop & deploy on Windows, Linux, MacOS &...
image.jpg (117.1 KB)
xls文件中使用的字体为宋体,而且服务器中已经安装有宋体字体,并且指定的自定义字体文件夹中也包含有宋体。
@ZhonghaoSun ,
请把2个服务器生成的pdf文件(一个是正常转换的pdf,一个是缺少文字的pdf)提供给我们分析。
另外,请把服务器的simsun.ttf字体文件提供给我们
正常转换的pdf:
鑫华医院项目(1) (正常).zip (140.7 KB)
缺少文字的PDF:
鑫华医院项目(1) (乱码).zip (526.4 KB)
字体文件:
simsun.zip (5.4 MB)
@ZhonghaoSun ,
您分享的“simsun.ttf”字体没有问题,可以正常输出文字。
为了排除由于字体权限导致的问题,请在创建workbook的地方,添加如下代码,以确认安装的字体文件“simsun.ttf"能够被正常读取:
try(FileInputStream fs = new FileInputStream("/usr/share/fonts/qiyuesuofonts/simsun.ttf"))
{
//try to read some data and log
if(fs.read() != -1)
{
//log
}
}
另外,请分享下您创建workbook并转换pdf的代码。
好的,这是我们使用的代码:
public static byte[] convert2PdfMonitor(byte[] excel) throws Exception {
logger.info("使用新版本aspose Monitor");
ByteArrayOutputStream pdf = new ByteArrayOutputStream();
LoadOptions opt = new LoadOptions();
opt.setMemorySetting(MemorySetting.MEMORY_PREFERENCE);
Workbook workbook = new Workbook(new ByteArrayInputStream(excel), opt);
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
// 缩放到一个页面(如果列太多,太长)
pdfSaveOptions.setAllColumnsInOnePagePerSheet(true);
//设置为true,自动适应高度为auto的行
for (Object worksheet : workbook.getWorksheets()) {
((Worksheet)worksheet).autoFitRows(true);
}
workbook.save(pdf, pdfSaveOptions);
return pdf.toByteArray();
}
@ZhonghaoSun
peyton.xu:
您分享的“simsun.ttf”字体没有问题,可以正常输出文字。
为了排除由于字体权限导致的问题,请在创建workbook的地方,添加如下代码,以确认安装的字体文件“simsun.ttf"能够被正常读取:
try(FileInputStream fs = new FileInputStream("/usr/share/fonts/qiyuesuofonts/simsun.ttf"))
{
//try to read some data and log
if(fs.read() != -1)
{
//log
}
}
另外,请分享下您创建workbook并转换pdf的代码。
请提供使用建议代码后的日志信息,以便确认是否能正确读取字体文件。我们很快就会检查。
你好,这是我修改后的代码片段:
Workbook workbook = new Workbook(excel, opt);
String fontPath = "/usr/share/fonts/qiyuesuofonts/simsun.ttf";
try (FileInputStream fs = new FileInputStream(fontPath)) {
//try to read some data and log
if (fs.read() != -1) {
//log
logger.info("font:{},fs.read() != -1", fontPath);
} else {
logger.info("font:{},fs.read() == -1", fontPath);
}
} catch (Exception e) {
logger.error("{}字体检测异常:",fontPath);
logger.error(e.getMessage(), e);
}
String fontPath2 = "./resources/fonts/simsun.ttf";
try (FileInputStream fs = new FileInputStream(fontPath2)) {
//try to read some data and log
if (fs.read() != -1) {
//log
logger.info("font:{},fs.read() != -1", fontPath2);
} else {
logger.info("font:{},fs.read() == -1", fontPath2);
}
} catch (Exception e) {
logger.error("{}字体检测异常:",fontPath2);
logger.error(e.getMessage(), e);
}
PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
// 缩放到一个页面(如果列太多,太长)
pdfSaveOptions.setAllColumnsInOnePagePerSheet(true);
但是执行完成后,并没有相关日志输出
@ZhonghaoSun
你是否没有执行到你提供的代码?你的代码里每个分支都有输出日志的语句。你能调试代码查看为何没有日志信息吗?查看日志信息输出位置并把日志信息反馈给我们,我们很快就会检查。
你好,这是最新的执行结果:
check Fonts
/usr/share/fonts/qiyuesuofonts/simsun.ttf字体检测异常:
/usr/share/fonts/qiyuesuofonts/simsun.ttf (No such file or directory)
java.io.FileNotFoundException: /usr/share/fonts/qiyuesuofonts/simsun.ttf (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.(FileInputStream.java:138)
at java.io.FileInputStream.(FileInputStream.java:93)
at net.qiyuesuo.common.excel.ExcelUtils.checkFonts(ExcelUtils.java:159)
at net.qiyuesuo.common.excel.ExcelUtils.convert2PdfMonitor(ExcelUtils.java:149)
at net.qiyuesuo.common.excel.ExcelUtils.convert2PdfMonitor(ExcelUtils.java:140)
at com.qiyuesuo.convert.impl.WordConvertToPdfServiceImpl.convertExcel(WordConvertToPdfServiceImpl.java:136)
font:./resources/fonts/simsun.ttf,fs.read() != -1
并且我已经设置了自定义字段文件夹:
try {
FolderFontSource sourceFolder = new FolderFontSource("./resources/fonts", false);
FontConfigs.setFontSources(new FontSourceBase[]{sourceFolder});
logger.info("成功执行完Aspose-cells自定义字体文件夹设置");
} catch (Exception e) {
logger.error(e.getMessage(), e);
}```
@ZhonghaoSun
通过你的日志信息,你已经正常读取了自定义文件夹下的字体文件。请提供一下代码运行后生成的PDF文件,我们很快就会检查。
另外,请将设置自定义字体文件夹的代码放在读取Workbook的前面,以便后面的代码可以使用设置的自定义字体文件夹。
这是运行后的文件:
鑫华医院项目(1) (字体乱码测试).zip (160.0 KB)
其中,设置自定义字体文件夹的代码,是放在静态代码块中,项目启动时就已经设置,
具体代码如下:
static {
setLicence();
setFont();
}
private static void setFont() {
try {
FolderFontSource sourceFolder = new FolderFontSource("./resources/fonts", false);
FontConfigs.setFontSources(new FontSourceBase[]{sourceFolder});
logger.info("成功执行完Aspose-cells自定义字体文件夹设置");
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
@ZhonghaoSun
查看你提供的PDF结果文件,我们没有发现乱码。请查看附件。result.png (267.9 KB)
如果你依然有疑问,请提供截图并高亮显示错误地方,我们很快就会检查。
抱歉,我备注的文字有误,设置了自定义字体目录后,没有出现文字乱码。
但是字体和xls文件的字体不一致:
https://forum.aspose.com/t/xls-pdf/285466/5?u=zhonghaosun
原xls文件中的字体为:宋体
转换后的PDF中字体:
image.png (279.1 KB)
@ZhonghaoSun
在所用的模板文件中,默认字体是随着系统语言的变化而变化的,请检查您的java程序运行时使用的语言是否和你在excel中打开这个文件时excel使用的语言一致。或者您可以在代码中指定语言加载workbook看看是否能得到期望的结果:
LoadOptions lopts = new LoadOptions();
lopts.setRegion(CountryCode.CHINA);
Workbook wb = new Workbook("..xls", lopts);
...