我如何用itext阅读pdf?

时间:2018-05-08 10:01:29

标签: java pdf itext

现在我有错误:2018年5月8日下午12:27:47 toUnicode

  

警告:字体中没有CID + 88(88)的Unicode映射   404198E5f54TimesNewRoman

空洞的结果。 如果需要我可以提供文件。

2 个答案:

答案 0 :(得分:2)

您的示例PDF不包含文本提取所需的信息。

该文档使用具有ad-hoc编码的子集字体:页面上使用的相应字体的第一个字形由一些起始值n编码,下一个使用的字形由n+1编码, n+2的下一个使用的不同字形,......

E.g。 enter image description here 对于第一个单词,将十六进制编码为000a 000b 000c 000d 000e 000f 0010,对于第二个单词加上冒号,将0011 0012 0013 000c 000d 0010 0014 0015 0016编码为000c。您可以识别与第一个单词中已使用过的字形对应的第二个单词中的代码000d0010"message"

显然,没有任何额外信息的这种编码不允许文本提取,程序应该如何将这些值映射到Unicode?

PDF格式有选项可以包含从这些编码值到Unicode的映射,但不幸的是,文件中的字体不包含此类映射。

因此,您的文件不允许文本提取,您需要使用OCR。

答案 1 :(得分:1)

带文字的PDF包含在页面上绘制字形的语法。这些字形的形状以字体存储。用于页面的语法使用字符来引用字形。

例如:

12334 54637

可能代表:

Hello World

您有以下映射的地方:

`1` = `H`
`2` = `e`
`3` = `l`
`4` = `0`
` ` = ` `
`5` = `W`
`6` = `r`
`7` = `d`

当您将页面视为人类时,您会看到“Hello World”,但当机器查看页面的语法时,它会看到“12334 54637”,如果您在没有提取内容的情况下也会看到使用toUnicode映射。

我刚刚描述的映射(1 = H2 = e3 = l,...)存储在一个对象中,该对象使用Unicode字符映射页面中使用的字符。如果缺少该地图,则无法正确提取内容。

您提到的错误字体404198E5f54TimesNewRoman 中的CID + 88(88)没有Unicode映射通知您PDF中缺少信息,因此无法获得可靠的结果。您可以用人眼看到正确的文本,但机器无法将文本解析为有用的字符串。

如果此答案不满足您,请分享PDF以便我们证明此答案是正确的。另外:您没有提到您正在使用的iText版本。与较新版本(iText 7.1.2是最新版本)相比,旧版本通常不擅长提取文本。