使用Java将含韩文的docx文件转换为PDF时韩文内容丢失问题
docx转PDF时韩文内容不显示问题
问题复现
实现docx/doc转PDF功能时,待转换文件包含韩文内容(示例为BTS《Friends》歌词):
Friends
BTS
유난히도 반짝였던 서울!
처음 보는 또 다른 세상
땀에 잔뜩 밴 채 만난 넌
뭔가 이상했었던 아이
난 달에서, 넌 별에서
우리 대화는 숙제 같았지
하루는 베프, 하루는 웬수
I just wanna understand
Hello my alien
우린 서로의 mystery
그래서 더 특별한 걸까
언젠가 이 함성 멎을 때 stay, hey
내 옆에 함께 있어줘
영원히 계속 이곳에 stay, hey
네 작은 새끼손가락처럼
일곱 번의 여름과 추운 겨울보다
오래
수많은 약속과 추억들보다
使用的转换代码如下:
String k=null; OutputStream fileForPdf =null; try { String fileName=w; //处理.doc格式文件 if(fileName.endsWith(".doc")) { HWPFDocument doc = new HWPFDocument(new FileInputStream( fileName)); WordExtractor we=new WordExtractor(doc); k = we.getText(); fileForPdf = new FileOutputStream(new File( p)); we.close(); } //处理.docx格式文件 else if(fileName.endsWith(".docx")) { XWPFDocument docx = new XWPFDocument(new FileInputStream( fileName)); XWPFWordExtractor we = new XWPFWordExtractor(docx); k = we.getText(); fileForPdf = new FileOutputStream(new File(p)); we.close(); } Document document = new Document(); PdfWriter.getInstance(document, fileForPdf); document.open(); document.add(new Paragraph(k)); document.close(); fileForPdf.close(); }
代码运行后可正常生成PDF,但文件内所有韩文内容均无法显示。
故障原因
- iText默认内置的Helvetica字体仅支持拉丁字符集,没有韩文字形映射,遇到韩文时无法正常渲染,表现为空白或缺字。
- 当前转换逻辑是先提取Word纯文本再重新写入PDF,完全丢失了原文档自带的字体、排版配置,无法继承原文件的多语言支持能力。
修复方案
- 提前准备支持韩文的字体文件,比如Windows系统自带的
malgun.ttf(清黑体)、batang.ttc(韩文Batang字体),也可以使用开源的Noto Sans KR字体,生产环境建议将字体文件打包到项目资源目录,不要依赖运行环境的本地字体,避免跨系统部署时出现字体缺失。 - 写入PDF内容时显式指定使用支持韩文的字体,开启字体嵌入,核心修改代码如下:
// 替换为你实际存放字体的路径 String fontPath = "src/main/fonts/NotoSansKR-Regular.otf"; // 加载字体,使用IDENTITY_H编码支持东亚字符,EMBEDDED参数将字体嵌入PDF避免跨设备显示异常 BaseFont koreanBaseFont = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); // 设置字体字号 Font contentFont = new Font(koreanBaseFont, 12); // 原有逻辑读取到文本k后,创建段落时传入指定字体 document.add(new Paragraph(k, contentFont));
注意:Linux服务器环境默认不带Windows系统字体,部署时务必将所用字体文件随项目打包,不要直接引用本地系统字体路径,否则会抛出字体找不到的异常,也可以避免不同设备打开PDF时字体替换导致的排版错乱。
修改后重新运行转换逻辑,韩文内容即可正常显示。
内容的提问来源于stack exchange,提问作者jjosjoahu
相关产品推荐
相关产品推荐

