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

Java使用PDFBox提取HWP转换PDF文本时出现编码乱码如何解决

问题描述

在Java项目中选用PDFBox库实现PDF文本提取功能,待解析PDF由韩国文字编辑软件HWP编辑完成后转换生成,原有实现代码如下:

@RestController
@RequiredArgsConstructor
public class QuestionController {
    private final QuestionParseService questionParseService;

    @GetMapping("/")
    public ResponseEntity<?> parsePDF() throws IOException {
        return ResponseEntity.ok(questionParseService.parsePDF());
    }
}
@Service
public class QuestionParseService {
    public String parsePDF() throws IOException {
        File file = new File("filePath");
        PDDocument document = PDDocument.load(file);
        PDFTextStripper s = new PDFTextStripper();
        String content = s.getText(document);
        return content;
    }
}

接口返回的第1题提取结果存在乱码,数学符号、部分数字无法正常识别,示例乱码内容如下:

  1. 

    ×
     

    의 값은? [2점]
    ①  ②  ③  ④  ⑤ 

需要调整配置或代码,实现编码正常、包含数学公式在内的PDF文本内容提取。

问题根因

HWP转换生成PDF时,内置的数学公式、部分特殊字符使用私有编码的嵌入子集字体,这类字体大多没有附带标准ToUnicode字符映射表,PDFBox默认的PDFTextStripper无法通过内置规则匹配到正确的Unicode字符,就会输出乱码。另外原有代码存在两个明显问题:一是没有释放PDDocument占用的资源,高并发场景下会出现文件句柄泄漏;二是没有开启位置排序,HWP导出PDF的文本块不是按阅读顺序写入,不开排序会出现内容顺序错乱。

解决方案
  • 基础适配:调整PDFTextStripper配置,补充HWP字体映射
    首先开启位置排序和格式化选项,手动加载本地存放的HWP常用字体(含巴塘体、HWP数学公式字体等ttf/otf格式字体文件)作为 fallback 映射,代码调整如下:
@Service
public class QuestionParseService {
    public String parsePDF() throws IOException {
        File file = new File("filePath");
        // 使用try-with-resources自动关闭文档资源,避免句柄泄漏
        try (PDDocument document = PDDocument.load(file)) {
            PDFTextStripper stripper = new PDFTextStripper();
            // 开启按坐标排序,适配HWP导出PDF的文本排版顺序
            stripper.setSortByPosition(true);
            stripper.setAddMoreFormatting(true);
            // 加载本地HWP字体目录下的所有字体作为 fallback
            File hwpFontDir = new File("/your/local/hwp-fonts/path");
            DefaultFontMapper fontMapper = new DefaultFontMapper();
            File[] fontFiles = hwpFontDir.listFiles((dir, name) -> 
                name.endsWith(".ttf") || name.endsWith(".otf")
            );
            if (fontFiles != null) {
                for (File fontFile : fontFiles) {
                    fontMapper.getFonts().put(fontFile.getName(), fontFile.getAbsolutePath());
                }
            }
            return stripper.getText(document);
        }
    }
}
  • 高精度提取适配:纯文本提取+OCR补全
    对数学公式集中、私有编码无法映射的区域,先用PDFRenderer将对应PDF页面渲染为图片,再调用支持韩文、数学公式识别的OCR引擎(如Tesseract搭配韩文训练包、数学公式识别模型)做二次识别,将识别结果和纯文本提取结果拼接修正,解决无映射字体的识别问题。
  • 组件替换:如果适配成本过高,可更换为内置HWP字体映射规则的PDF解析组件,这类组件针对韩系文档做了专项适配,不需要手动配置字体就能正常提取韩文和数学公式内容。

内容的提问来源于stack exchange,提问作者keunhyung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:18:15