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

Fonts 无法使用tika从pdf文件中提取文本内容,fonts,ghostscript,apache-tika,postscript,Fonts,Ghostscript,Apache Tika,Postscript,我正在使用Postscript打印机生成一个“.ps”文件,并在我的linux机器上使用“ps2pdf”命令将该.ps文件转换为.pdf。此处生成的文件的内容不可选择且不可复制。此外,当我尝试使用apache Tika从同一pdf文件提取内容时,它返回一个空字符串(意味着无法提取)。我认为某些字体可能有问题,所以我也安装了一些新字体,但仍然不适合我 我无法找出问题所在。是打印机驱动程序或ghostscript(用于将“.ps”转换为“.pdf”)有问题,还是字体或其他问题 在使用tika检索内容

我正在使用Postscript打印机生成一个“.ps”文件,并在我的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


感谢您的帮助。请提前感谢。

如果您没有看到原始PostScript文件和PDF,就无法判断问题所在,或者是否可以解决。您需要将文件发布到公共位置

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

现在,PostScript程序通常被发送到打印机进行打印。因此,如果字体编码和字符代码结合起来在输出时生成预期的字符形状,则使用什么字符代码来表示字形并不重要。因此,绝对不能保证原始应用程序中的“a”可以例如,在纸上打印为“A”的阳离子实际上由字符代码0x41表示。应用程序创建一个子集字体并不少见,该子集字体仅包含实际打印的字形,并且其排列方式使要打印的第一个字符被赋予代码1,第二个字符被赋予代码2等。因此“Hello”将是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包含一个带有CIDFontType 2(TrueType大纲)的嵌入式子集CIDFont。由于PostScript没有提供Unicode信息的定义机制,因此未提供任何机制。如上所述,在遇到字符时会创建“编码”,因此第一个glyph编码为0x01等

其结果是,除了打印和使用OCR之外,没有简单的方法从PostScript文件中提取有意义的文本

可以想象,CIDFont的SFNT包含一个3,0 CMAP子表,该子表将glyph id映射到Unicode值,但是我需要一些时间来检查

然而,即使是这样,Ghostscript的pdfwrite代码目前也没有尝试这一壮举(Acrobat Dilleter也没有,我知道的任何其他PDF创建者附言也没有)


所以,从根本上说,你不能做你想做的事情。为什么不让Cairo生成一个PDF文件而不是PostScript文件呢?我认为它更可能以这种方式工作。当然,这可能意味着你必须看看你的虚拟打印机是如何工作的,如果你使用的是CUPS,我会认为这是可能的,因为PDF是CUPS的现代版本所使用的默认格式。

如果看不到原始PostScript文件和PDF,就无法判断问题所在,或者是否可以解决。您需要将文件发布到公共位置

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

现在,PostScript程序通常被发送到打印机进行打印。因此,如果字体编码和字符代码结合起来在输出时生成预期的字符形状,则使用什么字符代码来表示字形并不重要。因此,绝对不能保证原始应用程序中的“a”可以例如,在纸上打印为“A”的阳离子实际上由字符代码0x41表示。应用程序创建一个子集字体并不少见,该子集字体仅包含实际打印的字形,并且其排列方式使要打印的第一个字符被赋予代码1,第二个字符被赋予代码2等。因此“Hello”将是0x01 0x02 0x03 0x03 0x04

Windows PostScript打印机驱动程序添加了一个非标准G2U表,该表将字形名称映射到Unicode代码点,使用该表可以构造ToUnicode CMap并将其嵌入到