在这个数字化飞速发展的时代,微信流量主的挑战愈发严峻。然而,令人欣慰的是,我们的小程序用户数量终于突破了30大关!感谢每一位支持我们的用户!与此同时,大家期待已久的文档转化功能即将上线,这将为用户的操作带来极大的便利。今天,我们将重点讨论如何在Docker环境中解决SimSun字体缺失的问题,以确保文档转化的顺利进行。
随着小程序功能的不断完善,用户对文档转化的需求也日益增长。目前,我们的系统将支持将Word文档转化为PDF、将PDF转化为图片、以及将Excel表格转化为PDF等多种功能。这意味着,用户可以更加方便地处理各种文档,提高工作效率。然而,在Docker环境中部署时,我们遇到了一个棘手的问题:控制台频繁报错,提示“SimSun字体未找到”。
当我们尝试将Word文档转化为PDF时,控制台输出以下警告信息:
WARN 1 --- [nio-8004-exec-3] org.docx4j.fonts.RunFontSelector : Font 'SimSun' is not mapped to a physical font.
这一系列警告显示,系统无法找到SimSun字体的物理映射。进一步查找资料后,我们发现,字体映射的问题在Docker环境中是常见的障碍。这不仅影响了文档的输出质量,更是阻碍了用户的使用体验。
针对上述问题,我们进行了深入的研究和实践,最终找到了有效的解决方案。以下是我们在Docker环境中解决SimSun字体缺失的具体步骤:
首先,我们需要确保SimSun字体文件已经存在于Docker容器中。通常情况下,我们可以通过以下命令将Windows系统中的字体文件转移到Docker容器中:
docker cp /usr/share/fonts/truetype/dejavu/. eblog:/usr/share/fonts/truetype/chinese/
在此命令中,eblog
是我们的容器名称,而/usr/share/fonts/truetype/dejavu/
则是字体文件的源路径。
尽管字体文件已经成功转移,但仍然面临字体未映射的问题。为了解决这个问题,我们需要在代码中进行字体映射的配置。以下是一个示例代码片段:
try {
// 设置字体映射
fontMapper.put("SimSun", PhysicalFonts.get("/usr/share/fonts/truetype/chinese/SIMSUN.TTC"));
// 检查是否成功
PhysicalFont font = PhysicalFonts.get("SimSun");
if (font == null) {
System.out.println("Failed to map SimSun to physical font.");
} else {
System.out.println("SimSun mapped to " + font.getName());
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Failed to map fonts.");
}
通过上述代码,我们可以将SimSun字体文件映射到系统中,从而有效地解决文档转化时的字体缺失问题。
最后,我们需要将整个项目打包,并在Docker容器中运行。确保在打包时,将字体文件一并打包到资源目录中。在转换文档时,调用字体映射的方法,确保PDF的生成没有乱码。
完整的代码示例如下:
private String convertWordToPdf(String filePath) throws Exception {
FileOutputStream fileOutputStream = null;
try {
// 获取当前时间戳
String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
// 获取文件名(去掉路径和扩展名)
File file = new File(filePath);
String fileName = file.getName().replaceAll("\.docx$", "");
// 创建带时间戳的pdf路径
String pdfPath = fileDir + fileName + "_" + timestamp + ".pdf";
// 进行文件转换
fileOutputStream = new FileOutputStream(new File(pdfPath));
WordprocessingMLPackage mlPackage = WordprocessingMLPackage.load(file);
setFontMapper(mlPackage);
Docx4J.toPDF(mlPackage, fileOutputStream);
System.out.println("PDF转换成功,文件保存为:" + pdfPath);
return fileName + "_" + timestamp + ".pdf";
} catch (Exception e) {
e.printStackTrace();
System.out.println("转换失败");
throw new UnsupportedOperationException("Word 转 PDF 的功能尚未实现: " + filePath);
} finally {
IOUtils.closeQuietly(fileOutputStream);
}
}
通过以上步骤,我们成功解决了Docker环境中SimSun字体缺失的问题,为用户提供了更为顺畅的文档转化体验。希望我们的分享能够帮助到同样在这一领域奋斗的朋友们!如果你对我们的新功能感兴趣,欢迎搜索“Listen Hui帮工办”体验我们的服务。让我们一起期待更美好的明天!
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告