iText PDF不良字符转换

时间:2015-03-27 12:08:51

标签: java pdf itext

我有一张PDF来阅读这让我感到很沮丧。

pdf支付客户的电费(用意大利语),他希望我从中读取文字。

现在问题。当我将文本从pdf复制到记事本时,我得到了一堆难以理解的字符......

经过大量研究后我找到了答案。 pdf包含所有字体,但不包括ontiene对应的cmap允许导出文本。我发现this link指的是较旧版本的itext(我使用的是版本5.5.5)。

如果可能的话,我想要实现的是将文本从字形代码转换为unicode。

我发现了一些对Cmap的引用 - 但不知道如何使用它们,显然网上没有例子:(

这是我试过的

PdfReader reader = new PdfReader("MyFile.pdf");
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
PrintWriter out = new PrintWriter(new FileOutputStream(txt));
TextExtractionStrategy strategy;
strategy = parser.processContent(1, new SimpleTextExtractionStrategy());
String text = strategy.getResultantText();
String cmapFile="UnicodeBigUnmarked";
byte[] text = encodedText.getBytes();
String cid = PdfEncodings.convertToString(text, cmapFile);

Cid是一个非常日本的字符序列

还有:

FontFactory.registerDirectory("myDirectoryWithAllFonts");

在尝试转换之前。这个解决方案似乎没有结果

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

你说:当我将文本从pdf复制到记事本时,我得到了一堆难以理解的字符。我假设您正在谈论在Adobe Reader中选择文本并尝试将其粘贴到文本中编辑器。

如果这不成功,您将拥有一个不允许您从PDF中提取文本的PDF,因为该文本未正确存储在PDF中。请查看this video以获取完整说明。

让我们从内部看一下你的PDF:

enter image description here

我们看到文本对象的开头(它表示BT代表Begin Text)。字体/C2_1定义为字体大小1.初看起来,这可能看起来很奇怪,但字体将在转换中缩放到6.9989大小。然后我们看到一些文本数组包含双字节字符串,例如I R H E Z M W M S R I H I P

iText如何解读这些字符?为了找到答案,我们需要查看用于与/C2_1对应的字体的编码:

enter image description here

Aha,存储在内容流中的Unicode字符与我们需要的实际字符相对应:IRHE ZMWMSRI HIP等等。这正是我们使用iText将PDF转换为文本时所看到的。

但等一下!为什么我们在使用Adobe Reader查看PDF时会看到其他字符?好吧,IRH等字符是与字形“程序”对应的地址。该程序负责在页面上绘制字符。人们可以预期,在这种情况下,字符I将对应字母I的字形(或者如果您喜欢这个字的“图纸”)。你的PDF中没有这样的运气。

现在,当您使用“格式化复制”时Adobe会做什么? iText目前还没有实现大量的魔力。为什么不?嗯......我不知道Adobe的预算,但它可能远远高于iText集团的预算。从包含有关字体的混乱信息的文档中提取文本不在iText Group的技术路线图中。