You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:01:00