xls转PDF,部分文字缺少

版本: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
文字缺失是由于缺少字体导致的。如果你确定安装了字体,那么可能是无法找到安装的字体导致文字缺失。你可以参考以下文档配置自定义字体目录。

这两台服务器中已经安装了相同的字体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
设置自定义字体文件夹后,文本可以显示但是字体却变了。是因为没有找到需要的字体,这时字体替代机制生效了,找到了类似的字体进行文本显示。你需要检查文件所用的字体是否全部安装在了自定义字体文件夹。关于字体替代机制,请查看文档。

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

请提供使用建议代码后的日志信息,以便确认是否能正确读取字体文件。我们很快就会检查。

你好,这是我修改后的代码片段:

		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);
            ...