Java iText PDF坏字符转换

Java iText PDF坏字符转换,java,pdf,itext,Java,Pdf,Itext,我有一个PDF文件要读,这让我崩溃了 pdf文件显示了一位客户的电费单(意大利语),他希望我阅读其中的文字 现在问题来了。当我将粘贴文本从pdf复制到记事本时,我得到了一堆无法理解的字符 经过大量研究,我找到了答案。pdf包含所有字体,但不包含允许导出文本的cmap。我发现它引用了一个旧版本的itext(我使用的是版本5.5.5) 如果可能的话,我想要实现的是将文本从字形代码转换为unicode 我发现了一些关于Cmap的参考资料,但不知道如何使用它们,显然在网上没有任何例子:( 这就是我尝试过

我有一个PDF文件要读,这让我崩溃了

pdf文件显示了一位客户的电费单(意大利语),他希望我阅读其中的文字

现在问题来了。当我将粘贴文本从pdf复制到记事本时,我得到了一堆无法理解的字符

经过大量研究,我找到了答案。pdf包含所有字体,但不包含允许导出文本的cmap。我发现它引用了一个旧版本的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");
在尝试转换之前。此解决方案似乎没有结果

任何帮助都将不胜感激。

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

如果此操作不成功,则您的PDF不允许您从PDF中提取文本,因为文本未正确存储在PDF中。请注意完整的解释

让我们从内部查看您的PDF:

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

iText应该如何解释这些字符?要找到答案,我们需要查看与
/C2_1
对应的字体所使用的编码:

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

但是等一下!当我们使用Adobe Reader查看PDF时,为什么会看到其他字符?嗯,像
I
R
H
等字符都是与“程序”对应的地址指字形。此程序负责在页面上绘制字符。在这种情况下,字符
I
将与字母
I
的字形(或“图形”(如果您喜欢此单词)相对应。您的PDF中没有这种运气


现在,当您使用“带格式复制”时,Adobe会做什么?iText中有很多目前还没有实现的魔法。为什么不呢?嗯……我不知道Adobe的预算,但它可能比iText组的预算要高得多。从包含字体混淆信息的文档中提取文本不在iText组的技术路线图上。

嗯,你的假设是正确的,但是t我能使用“格式复制”功能在Adobe席上,然后成功地过去了。无论如何,我要看视频,请分享PDF,让我们可以看看它。我可以直接发送给U,因为它包含关于我的客户的明智的信息,并且真的不想与他们分享整个网络,没有条理的信息AWAIS工作:这是链接。您使用的文件共享服务的帮助要求我安装Chrome插件。我的政策是不这样做。请使用其他文件共享服务。