Java使用PdfBox读取PDF报U+FB01错误,如何定位该特殊字符
PDF特殊字符U+FB01(fi连字)定位与修复方案
核心问题排查
现有代码错误点
你提供的代码直接将PDF二进制文件当做纯文本文件读取,这种方式完全无法解析PDF结构化格式中存储的文本内容,自然匹配不到目标字符。PDF文件并非纯文本格式,内部文本、字体、版式都是以二进制结构化节点存储的,必须通过专用的PDF解析工具才能读取到真实的文本内容。
常规工具无法定位的原因
大多数桌面PDF阅读器(包括Adobe Reader、Word)会自动将fi这类印刷连字渲染为普通的f+i两个字符,搜索功能也会默认做连字展开映射,因此无法直接搜索定位到原始的U+FB01编码字符。
正确实现方案
你已经在使用PdfBox工具库,直接通过PdfBox的底层文本解析API即可实现字符定位与替换:
1. 字符定位实现代码
通过自定义PDFTextStripper重写字符处理方法,可精准匹配目标字符并获取其所在页码、坐标等位置信息:
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; import java.io.File; import java.io.IOException; public class FindSpecialChar { public static void main(String[] args) throws IOException { File pdfFile = new File("spec.pdf"); try (PDDocument doc = PDDocument.load(pdfFile)) { PDFTextStripper stripper = new PDFTextStripper() { @Override protected void processTextPosition(TextPosition text) { String charStr = text.getUnicode(); // 匹配U+FB01 fi连字 if (charStr != null && charStr.equals("\uFB01")) { System.out.printf("匹配到目标字符,页码:%d,横坐标:%.2f,纵坐标:%.2f%n", getCurrentPageNo(), text.getX(), text.getY()); } super.processTextPosition(text); } }; // 触发全文档文本解析 stripper.getText(doc); } } }
2. 报错规避与字符替换
无法新增字体的场景下,有两种方案可解决PdfBox报错问题:
- 临时规避:添加JVM启动参数
-Dorg.apache.pdfbox.rendering.ignoreMissingGlyphs=true,遇到缺失字形时会自动跳过不抛出异常 - 永久修复:提取文本时统一将
\uFB01替换为普通的fi两个字符,也可通过PdfBox的文本改写接口直接替换PDF原始内容后重新保存
内容的提问来源于stack exchange,提问作者César Castro Aroche
相关产品推荐
相关产品推荐

