猿问

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

从某些 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字符的问题


心有法竹
浏览 1050回答 2
2回答

郎朗坤

第四种可能性(在Aaron Digulla答案中给出的三种可能性旁边)是在扩展类时覆盖:showGlyph()PDFTextStripperprotected 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    }}

GCT1015

我看到这些解决方案,两者都有点混乱。解决方案#1:将您自己的过滤器安装到记录器。过滤器可以检查日志消息并设置线程本地标志。调用 后检查标志。不要忘记删除标志,否则您的线程本地映射将填满。getText()您可以将共享资源日志记录替换为支持 MDC 的其他内容,例如 logback。然后,您可以将该标志放在 MDC 中。解决方案#2:修补PDFbox的源代码。在类中添加一个 getter:PDSimpleFontPDType0Fontpublic boolean hadEncodingProblems() {    return !noUnicode.isEmpty();}应该有一种方法可以在调用后获取所有字体。getText()解决方案#3:使用反射读取字段值(kudos to mkl)。请注意,这可能会随着新的 Java 版本或 SecurityManager 是安装程序或默认版本被激活而中断。
随时随地看视频慕课网APP

相关分类

Java
我要回答