iText PDF 错误字符转换

iText PDF bad character conversion

我有一个让我发疯的 PDF 阅读。

pdf 显示了客户的电费单(意大利语),他要我阅读其中的文字。

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

经过大量研究,我找到了答案。 pdf 包含所有字体,但不包含允许导出文本的对应的 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");

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

任何帮助将不胜感激。

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

如果这不成功,则您的 PDF 不允许您从 PDF 中提取文本,因为文本未正确存储在 PDF 中。观看 this video 了解完整说明。

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

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

iText 应该如何解释这些字符?要找出答案,我们需要查看与 /C2_1:

对应的字体所使用的编码

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

但是等一下!为什么我们用Adobe Reader看PDF的时候会看到其他字符?那么,IRH等字符就是对应字形"program"的地址。该程序负责在页面上绘制字符。人们会期望在这种情况下,字符 I 会对应于字母 I 的字形(或者 "the drawing",如果你喜欢这个词)。你的 PDF 就没有这样的运气。

现在,当您使用 "Copy with formatting" 时,Adobe 会做什么? iText 中目前尚未实现的大量魔法。为什么不?嗯...我不知道 Adob​​e 的预算,但它可能比 iText Group 的预算高很多很多。从包含令人困惑的字体信息的文档中提取文本不在 iText Group 的技术路线图上。