无法使用 tika 从 pdf 文件中提取文本内容
Posted
技术标签:
【中文标题】无法使用 tika 从 pdf 文件中提取文本内容【英文标题】:Unable to extract the text content from pdf file using tika 【发布时间】:2016-08-16 07:13:39 【问题描述】:我正在使用生成“.ps”文件的 Postscript 打印机,并且我正在使用 linux 机器中的“ps2pdf”命令将此 .ps 文件转换为 .pdf。此处生成的文件,其内容不是可选择和可复制。此外,当我尝试使用 apache Tika 从同一个 pdf 文件中提取内容时,它返回一个空字符串(意味着无法提取)。我认为某些字体可能有问题,所以我也安装了一些新字体但是仍然对我不起作用。
我无法找出问题所在。无论是打印机驱动程序还是 ghostscript(用于将 '.ps' 转换为 '.pdf')还是字体或其他问题 -否则。
在使用 tika 检索内容时,它会打印一些警告(不是错误),如下所示。
WARN No Unicode mapping for CID+1 (1) in font WKQJKU+ArialNarrow-Identity-H
WARN No Unicode mapping for CID+2 (2) in font WKQJKU+ArialNarrow-Identity-H
WARN No Unicode mapping for CID+3 (3) in font WKQJKU+ArialNarrow-Identity-H
WARN No Unicode mapping for CID+4 (4) in font WKQJKU+ArialNarrow-Identity-H
WARN No Unicode mapping for CID+5 (5) in font WKQJKU+ArialNarrow-Identity-H
....
任何帮助表示赞赏。在此先感谢。
【问题讨论】:
【参考方案1】:如果不查看原始 PostScript 文件和 PDF,则无法真正判断问题所在,或者是否可以修复。您需要将文件发布到公开的地方。
您也没有确切说明“ps2pdf”命令是什么,有几个不同的实用程序使用相同的名称。如果它使用 Ghostscript,那么它会在运行时这样说。如果是这样,您最好直接运行 Ghostscript 以避免混淆。您还应该引用您正在使用的 Ghostscript 版本。
现在 PostScript 程序通常用于发送到打印机进行打印。因此,使用什么字符代码来表示字形并不重要,只要字体编码和字符代码结合起来在输出时产生预期的字符形状。因此,绝对不能保证原始应用程序中的“A”(在纸上打印为“A”)实际上由字符代码 0x41 表示。应用程序创建子集字体的情况并不少见,它只包含实际打印的字形,并且被安排为要打印的第一个字符被赋予代码 1,第二个被赋予代码 2 等等。因此,“你好” ' 将是 0x01 0x02 0x03 0x03 0x04
Windows PostScript 打印机驱动程序添加了一个非标准 G2U 表,它将字形名称映射到 Unicode 代码点,使用它可以构建一个 ToUnicode CMap 并将其嵌入到 PDF 文件中。这允许将复杂的编码转换为 Unicode 值,这意味着搜索和复制/粘贴将起作用。
但是您没有说明您使用哪个系统来创建 PostScript 程序,而且由于您没有提供示例,我们根本不知道您的 PostScript 是如何生成的。
您的 PDF 文件似乎使用了 CIDFont,并且不包含 ToUnicode CMap。这不太可能产生一个您可以复制/粘贴内容的 PDF 文件。当然,这不是 PDF 的最初目标,这就是为什么它不能保证是可能的。
很可能根本无法将 PostScript 文件转换为可编辑的 PDF 文件,但您没有提供足够的信息来说明。
[稍后]
PostScript 由 Cairo 制作,可能来自 PDF 文件,但这并不完全清楚,它可能只是 Cairo 的工作方式。无论如何.... PostScript 包含一个嵌入的子集 CIDFont 和 CIDFontType 2(TrueType 轮廓)。因为 PostScript 没有定义提供 Unicode 信息的机制,所以没有提供任何机制。如上所述,“编码”是在遇到字符时创建的,因此第一个字形编码为 0x01 等。
这样做的结果是,没有简单的方法可以从此 PostScript 文件中提取有意义的文本,当然只能打印它并使用 OCR。
可以想象,CIDFont 的 sfnt 包含一个 3,0 CMAP 子表,它将字形 ID 映射到 Unicode 值,但我需要一些时间来检查。
但是,即使是这种情况,Ghostscript 的 pdfwrite 代码目前也没有尝试实现这一壮举(Acrobat Distiller 和我所知道的任何其他 PostScript to PDF 创建器也没有)。
所以,从根本上说,你不能做你想做的事。为什么不让 Cairo 生成 PDF 文件而不是 PostScript 文件?它更有可能按照我的想法工作。当然,这可能意味着您必须查看虚拟打印机的工作原理,如果您使用的是 CUPS,我应该会想到,因为 PDF 是现代版本 CUPS 使用的内部格式。
【讨论】:
嗨@KenS,非常感谢您的快速回复,在我的问题中,'ps2pdf' 是 ghostscript 实用程序,打印机在 linux 机器上。我不知道如何在此处上传文件以供参考.如果您分享您的邮件 ID,我也可以将文件发送给您。 这里不能发文件,最好放到DropBox什么的,发个网址在这里,我以外的人可以看。你使用的是什么版本的 Ghostscript,你从哪里得到它(包,自己从源代码构建等)?如果您绝对必须使用电子邮件,您可以在 spamcop dot net 上发送给 ken(不想在此处放置明显的电子邮件地址) 嗨@KenS,我的ghostscript 版本是9.16。我在这里分享postscript 和pdf 文件的dropbox 链接。 dropbox.com/s/jq5m4dkz175o0nk/… , dropbox.com/s/y8jo3whu2kw12sr/… 我相信这些帖子中有 32k 的硬性限制。对于手写的后记,它通常可以放在一个代码块中。对于生成的 ps,文件通常太大,但前 20 行左右通常包含关键信息。因此,在代码块中添加head sthg.ps
的输出有助于更快地获得答案。以上是关于无法使用 tika 从 pdf 文件中提取文本内容的主要内容,如果未能解决你的问题,请参考以下文章