无法使用tika从pdf文件中提取文本内容

时间:2016-08-16 07:13:39

标签: fonts ghostscript apache-tika postscript

我正在使用Postscript打印机生成一个' .ps'文件,我正在使用' ps2pdf'将此.ps文件转换为.pdf文件。我的linux机器中的命令。这里生成的文件,它的内容是不可选择和可复制的。当我尝试使用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 个答案:

答案 0 :(得分:2)

如果没有看到原始的PostScript文件和PDF,则无法确定问题是什么,或者是否可以修复。您需要在公共场所发布文件。

你也不能确切地说出' ps2pdf'命令是,有几个使用相同名称的不同实用程序。如果它使用Ghostscript那么它会在运行时说出来。如果是这样,你最好直接运行Ghostscript以避免混淆。您还应该引用您正在使用的Ghostscript版本。

现在,PostScript程序通常用于发送到打印机进行打印。因此,只要字体编码和字符代码组合在输出上产生预期的字符形状,用什么字符代码来表示字形并不重要。所以绝对不能保证一个' A'在您的原始应用程序中,打印为“A'例如,在纸上实际上由字符代码0x41表示。创建子集字体的应用程序并不罕见,该子集字体仅包含实际打印的字形,并且其排列使得要打印的第一个字符被赋予代码1,第二个字符被赋予代码2等。因此&# 39;你好'将是0x01 0x02 0x03 0x03 0x04

Windows PostScript打印机驱动程序添加了一个非标准的G2U表,它将字形名称映射到Unicode代码点,使用它可以构建一个ToUnicode CMap并将其嵌入到PDF文件中。这允许将复杂的编码转换为Unicode值,这意味着搜索和复制/粘贴将起作用。

但是您还没有说过您正在使用哪个系统来创建PostScript程序,而且由于您还没有提供示例,我们根本不知道您的PostScript是如何生成的。< / p>

您的PDF文件似乎正在使用CIDFont,并且不包含ToUnicode CMap。它不太可能产生PDF文件,您可以在其中复制/粘贴内容。当然,这并不是PDF的最初目标,这就是为什么它不能保证是可能的。

很可能根本无法将PostScript文件转换为可编辑的PDF文件,但您还没有提供足够的信息来说明。

[后]

PostScript由Cairo制作,可能来自PDF文件,但这并不完全清楚,它可能只是开罗的工作方式。无论如何...... PostScript包含一个带有CIDFontType 2(TrueType轮廓)的嵌入式子集CIDFont。因为PostScript没有定义的提供Unicode信息的机制,所以没有提供。如上所述,&#39;编码&#39;在遇到字符时创建,因此第一个字形编码为0x01等。

这样做的结果是没有简单的方法从这个PostScript文件中提取有意义的文本,除了当然打印它和使用OCR。

可以想象,CIDFont的sfnts包含一个3,0 CMAP子表,它将字形ID映射到Unicode值,但我需要一些时间来检查。

然而,即使是这种情况,Ghostscript的pdfwrite代码目前还没有尝试这个专长(Acrobat Distiller,也不是我所知道的任何其他PostScript到PDF创建者)

因此,从根本上说,你不能做你想做的事情。为什么不让Cairo生成PDF文件而不是PostScript文件?它更有可能像我想象的那样工作。当然,这可能意味着你必须看看你的虚拟打印机是如何工作的,如果你使用的是CUPS,我应该可以想到,因为PDF是现代版CUPS使用的通用格式。