为了账号安全,请及时绑定邮箱和手机立即绑定

检测 PDF 中缺失/损坏的 Unicode 映射

检测 PDF 中缺失/损坏的 Unicode 映射

心有法竹 2022-08-17 15:55:11
从某些 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下面提到的帖子也讨论了同样的问题,但没有讨论能够在代码端检测到这个问题并处理相同的问题:使用PDFBox从PDF中读取一些Unicode字符的问题
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

第四种可能性(在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

    }

}


查看完整回答
反对 回复 2022-08-17
?
GCT1015

TA贡献1827条经验 获得超4个赞

我看到这些解决方案,两者都有点混乱。


解决方案#1:将您自己的过滤器安装到记录器。过滤器可以检查日志消息并设置线程本地标志。调用 后检查标志。不要忘记删除标志,否则您的线程本地映射将填满。getText()


您可以将共享资源日志记录替换为支持 MDC 的其他内容,例如 logback。然后,您可以将该标志放在 MDC 中。


解决方案#2:修补PDFbox的源代码。在类中添加一个 getter:PDSimpleFontPDType0Font


public boolean hadEncodingProblems() {

    return !noUnicode.isEmpty();

}

应该有一种方法可以在调用后获取所有字体。getText()


解决方案#3:使用反射读取字段值(kudos to mkl)。请注意,这可能会随着新的 Java 版本或 SecurityManager 是安装程序或默认版本被激活而中断。


查看完整回答
反对 回复 2022-08-17
  • 2 回答
  • 0 关注
  • 1049 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号