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题提取结果存在乱码,数学符号、部分数字无法正常识别,示例乱码内容如下:
-
×
의 값은? [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
相关产品推荐
相关产品推荐

