From 2ca158d330878004a937d9a8358b58b46f824fbe Mon Sep 17 00:00:00 2001 From: chenyuan Date: Sat, 17 Oct 2026 00:48:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20word=E8=BD=ACPDF=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E8=A1=A5=E5=85=85Windows=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=AD=97=E4=BD=93=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - setFontsFolders 会替换 aspose 的默认字体源,原配置只有 Linux 路径 (/usr/share/fonts),Windows 服务器上 aspose 找不到任何系统字体, 全部替换为内置 Fanwood(无中文字形),转换出的 PDF 中文全部为方框 - 字体目录加入 C:\Windows\Fonts(保留 Linux 路径兼容),修复后 PDF 正确嵌入宋体子集,中文正常显示 --- .../util/pdfUtils/PDFConvertUtil.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/sztzjy/linkCommerce/util/pdfUtils/PDFConvertUtil.java b/src/main/java/com/sztzjy/linkCommerce/util/pdfUtils/PDFConvertUtil.java index bd3425e..e908cb1 100644 --- a/src/main/java/com/sztzjy/linkCommerce/util/pdfUtils/PDFConvertUtil.java +++ b/src/main/java/com/sztzjy/linkCommerce/util/pdfUtils/PDFConvertUtil.java @@ -11,6 +11,8 @@ import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import org.apache.poi.hslf.usermodel.*; import org.apache.poi.xslf.usermodel.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.awt.*; import java.awt.image.BufferedImage; @@ -32,6 +34,8 @@ import static com.sztzjy.linkCommerce.util.pdfUtils.PDFConvertUtil.TypeEnum.*; */ public final class PDFConvertUtil { + private static final Logger log = LoggerFactory.getLogger(PDFConvertUtil.class); + final private static Map> types = new HashMap<>(); public static enum TypeEnum { @@ -122,14 +126,18 @@ public final class PDFConvertUtil { // 验证License 若不验证则转化出的pdf文档会有水印产生 if (!getLicense()) { + log.warn("word转PDF失败:Aspose License 校验未通过"); return false; } try { //此处处理乱码和小方块 //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 //指定文件库内容路径 + // 字体目录同时包含 Windows 系统字体与 Linux 常见目录: + // setFontsFolders 会替换 aspose 的默认字体源,漏掉 Windows 字体目录时 + // 宋体等中文字体不可见,转换出的 PDF 中文全部变成方框 FontSettings.getDefaultInstance().setFontsFolders( - new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + new String[] {"C:\\Windows\\Fonts", "/usr/share/fonts", "/usr/share/fonts/win"} , true); // 将源文件保存在com.aspose.words.Document中,具体的转换格式依靠里面的save方法 com.aspose.words.Document doc = new com.aspose.words.Document(inputStream); @@ -139,7 +147,7 @@ public final class PDFConvertUtil { System.out.println("word转换完毕"); } catch (Exception e) { - e.printStackTrace(); + log.warn("word转PDF异常", e); return false; }finally { closeOutput(outputStream); @@ -208,7 +216,7 @@ public final class PDFConvertUtil { aposeLic.setLicense(is); result = true; } catch (Exception e) { - e.printStackTrace(); + log.warn("Aspose Words License 加载异常", e); } return result; } @@ -225,8 +233,11 @@ public final class PDFConvertUtil { //此处处理乱码和小方块 //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 //指定文件库内容路径 + // 字体目录同时包含 Windows 系统字体与 Linux 常见目录: + // setFontsFolders 会替换 aspose 的默认字体源,漏掉 Windows 字体目录时 + // 宋体等中文字体不可见,转换出的 PDF 中文全部变成方框 FontSettings.getDefaultInstance().setFontsFolders( - new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + new String[] {"C:\\Windows\\Fonts", "/usr/share/fonts", "/usr/share/fonts/win"} , true); // 原始excel路径 com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook(inputStream); @@ -329,8 +340,11 @@ public final class PDFConvertUtil { //此处处理乱码和小方块 //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 //指定文件库内容路径 + // 字体目录同时包含 Windows 系统字体与 Linux 常见目录: + // setFontsFolders 会替换 aspose 的默认字体源,漏掉 Windows 字体目录时 + // 宋体等中文字体不可见,转换出的 PDF 中文全部变成方框 FontSettings.getDefaultInstance().setFontsFolders( - new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + new String[] {"C:\\Windows\\Fonts", "/usr/share/fonts", "/usr/share/fonts/win"} , true); hslfSlideShow = new HSLFSlideShow(inputStream); @@ -411,8 +425,11 @@ public final class PDFConvertUtil { //此处处理乱码和小方块 //如果在本地运行,此处报错,请注释这个这是字体,主要是为了解决linux环境下面运行jar时找不到中文字体的问题 //指定文件库内容路径 + // 字体目录同时包含 Windows 系统字体与 Linux 常见目录: + // setFontsFolders 会替换 aspose 的默认字体源,漏掉 Windows 字体目录时 + // 宋体等中文字体不可见,转换出的 PDF 中文全部变成方框 FontSettings.getDefaultInstance().setFontsFolders( - new String[] {"/usr/share/fonts", "/usr/share/fonts/win"} + new String[] {"C:\\Windows\\Fonts", "/usr/share/fonts", "/usr/share/fonts/win"} , true); slideShow = new XMLSlideShow(inputStream);