parsing - 关于解析pdf时没有Unicode映射错误
问题描述
我有一堆 pdf 文件(来自不同的来源),我想从中提取文本(不幸的是无法附加文件)。
当前解析结果:
- Tika 静默返回文本,其中缺少大量所需数据。
- 直接使用 PDFBox 会给出一堆警告(见下文),还会删除它无法识别的数据
- 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);
}
解决方案
推荐阅读
- javascript - 带有 Vue(2) 绑定的 HTML 表格行
- r - 总和特定类别的ggplot条形图
- c++ - 我的主要函数调用可能是什么问题?
- python - 寻找 keras inceptionresnetv2 的图层名称
- angular - 如何检查传递给 POST 命令的令牌是否被授权?
- php - PHP使用页面上块ID找到的链接保存文件
- python - 有什么办法可以加快这个程序吗?Python
- python - 在没有导入操作系统的情况下通过 Python 写入 HTML?(Python 3.8 / Windows)
- swift - 快速迭代时从字典中删除值是否安全?
- ios - Swift,Firebase Cloud Function - INVALID ARGUMENT 错误