首页 > 解决方案 > 关于解析pdf时没有Unicode映射错误

问题描述

我有一堆 pdf 文件(来自不同的来源),我想从中提取文本(不幸的是无法附加文件)。

当前解析结果

  1. Tika 静默返回文本,其中缺少大量所需数据。
  2. 直接使用 PDFBox 会给出一堆警告(见下文),还会删除它无法识别的数据
  3. Adobe Acrobat Reader(另存为文本操作)保留原始文档结构,但在有问题的字体位置放置“”

到目前为止,我从 PDFBox 看到的所有警告组合在一起:

Aug 06, 2020 3:10:49 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+51 (51) in font AUDQZE+OpenSans-Identity-H

Aug 06, 2020 3:10:49 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+5 (5) in font HCUDUN+DroidSerif-Identity-H

Aug 06, 2020 3:10:49 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+5 (5) in font AUDQZE+OpenSans-Identity-H

Aug 06, 2020 3:10:49 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+55 (55) in font GFEIIG+OpenSans

Aug 06, 2020 3:10:49 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+5 (5) in font GFEIIF+DroidSerif

Aug 06, 2020 3:10:50 PM org.apache.pdfbox.pdmodel.font.PDType0Font toUnicode
WARNING: No Unicode mapping for CID+5 (5) in font GFEIIG+OpenSans

理想情况下,我想使用 Tika,因为我也希望使用 Word 和 HTML 格式。

问题:所以我想知道是否可以要求 Tika(或 PDFBox)使用不同的字符集映射(如 ASCII),以确保可以使用 Unicode 表的替代方案来解析那些有问题的字体?

在这里,我发现了以下内容:

提取文本时为什么会出现乱码(G38G43G36G51G5)?这是因为 PDF 文档中的字符可以使用自定义编码而不是 unicode 或 ASCII。当您看到乱码文本时,这可能意味着正在使用无意义的内部编码。访问文本的唯一方法是使用 OCR。这可能是未来的增强。

^ 这是否意味着下面的 PDFBox 已经检查了 ASCII 字符集的字体,而我根本不必担心 ASCII?

愚蠢的问题:我可以以某种方式提供缺少的 Unicode 映射到 PDFBox 吗?使用蒂卡?假设我已知的失败 Unicode 映射数量有限,我可以以某种方式将这些信息提供给解析器吗?

我的情况:我已经有一堆文档(因此无法控制创建)我想对其进行搜索,所以我想使用 Tika 创建它们的索引。我认为大多数 pdf 文件都会出现未嵌入字体的问题。所以可能我考虑过使用 Tika 的Metadata.get(UNMAPPED_UNICODE_CHARS_PER_PAGE)属性来决定它们是否需要pdfConfig.setOcrStrategy(OCR_STRATEGY.OCR_ONLY)在 NO_OCR 解析之后由 Tika ( ) 进行 OCR 解析。OCR 的速度要慢 10 倍且精度较低(它还会读取徽标之类的图像并试图理解它,尽管它不是必需的,只是增加了噪音),但我没有看到任何其他选项。

感谢您对此的任何想法,谢谢。

UPD

感谢@mkl 在解析之前注入字体映射的方向。我想知道假设我有构建 pdf 的字体(TTF 文件)是否可以自动执行此操作?

我用于解析的代码片段,如果有帮助的话:

蒂卡:

static void parseAndPrint(String fileName) throws IOException, TikaException {
    Tika tika = new Tika();
    InputStream is = Main.class.getResourceAsStream(fileName);
    System.out.println(tika.parseToString(is));
}

PDF盒子:

static void parseAndPrint(String fileName) throws IOException {
    System.out.println("========= Start File: " + fileName);
    InputStream file = Main.class.getResourceAsStream(fileName);
    PDFTextStripper tStripper = new PDFTextStripper();
    PDDocument document = PDDocument.load(file);
    System.out.print(tStripper.getText(document));
    document.close();
    System.out.println("========= End File: " + fileName);
}

标签: parsingunicodepdfboxapache-tikapdf-parsing

解决方案


推荐阅读