从某些PDF中提取文本时,PDFBox返回乱码。 这是因为Unicode映射丢失或损坏。 我可以在控制台上看到以下警告。 我希望能够检测到这一点,以便将这些PDF标记为损坏。
我正在寻找一种比解析日志更好的解决方案。
感谢您的帮助!
示例控制台日志:
WARNING: No Unicode mapping for CID+32 (32) in font F6
WARNING: Failed to find a character mapping for 32 in TimesNewRoman,Bold
以下提到的帖子也讨论了相同的问题,但没有讨论能够在代码侧检测到此问题并进行相同处理的方法:Issue with reading some unicode characters out of a PDF using PDFBox
答案 0 :(得分:3)
第四种可能性(除了Aaron Digulla给出的三种可能性之外)是在扩展showGlyph()
类时覆盖PDFTextStripper
:
protected void showGlyph(Matrix textRenderingMatrix, PDFont font, int code, String unicode, Vector displacement) throws IOException
{
super.showGlyph(textRenderingMatrix, font, code, unicode, displacement);
if (unicode == null || unicode.isEmpty())
{
// do stuff
}
}
答案 1 :(得分:2)
我看到这些解决方案,两者都有些混乱。
解决方案1:将自己的过滤器安装到记录器。筛选器可以检查日志消息并设置线程本地标志。调用getText()
后检查标志。不要忘记删除该标志,否则您的线程本地地图将被填满。
您可以使用支持MDC的其他方式(例如,登录)来替换公用日志。然后,您可以将标记放在MDC中。
解决方案2:修补PDFbox的来源。在类PDSimpleFont
和PDType0Font
中添加吸气剂:
public boolean hadEncodingProblems() {
return !noUnicode.isEmpty();
}
应该有一种方法可以在调用getText()
之后获取所有字体。
解决方案3:使用反射读取字段值(对mkl表示敬意)。请注意,这可能会因Java新版本而中断,或者在安装SecurityManager或激活默认版本时中断。