iText PDF坏字符转换

Posted

技术标签:

【中文标题】iText PDF坏字符转换【英文标题】:iText PDF bad character conversion 【发布时间】:2015-05-31 18:14:20 【问题描述】:

我有一个 PDF 要阅读,这让我很抓狂。

pdf 表示客户的电费单(意大利语),他希望我从中读取文本。

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

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

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

我找到了一些对 Cmap-something 的参考,但不知道如何使用它们,而且网上显然没有示例:(

这是我尝试过的

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】:

您说:当我将粘贴文本从 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 转换为文本时所看到的。

但是等一下!当我们使用 Adob​​e Reader 查看 PDF 时,为什么会看到其他字符?嗯,IRH 等字符是与字形的“程序”相对应的地址。该程序负责在页面上绘制字符。人们会期望在这种情况下,字符I 将对应于字母I 的字形(或“绘图”,如果您更喜欢这个词)。您的 PDF 中没有这样的运气。

现在,当您使用“带格式复制”时,Adobe 会做什么?目前 iText 中没有实现的大量魔法。为什么不?嗯...我不知道 Adob​​e 的预算,但它可能比 iText Group 的预算高得多。从包含令人困惑的字体信息的文档中提取文本不在 iText Group 的技术路线图中。

【讨论】:

嗯,您的假设是正确的,但我可以在 adobe XI 中使用“按格式复制”功能,然后成功通过。反正我要看视频 请分享 PDF 以便我们查看。 我可以直接发送给你吗,因为它包含有关我的客户的敏感信息,并且真的不想与整个网络共享它们 没关系,剥离明智的信息总是有效的:/这是链接filedropper.com/bollettaanonima。坦克寻求帮助 您使用的文件共享服务要求我安装 Chrome 插件。我的政策是不这样做。请使用其他文件共享服务。

以上是关于iText PDF坏字符转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 Itext 将 Pdf 页面转换为字节数组

iText7 将 HTML 转换为 PDF“System.NullReferenceException”。

使用 iText 将 SVG 转换为 PDF,SVG 未在 PDF 中完全显示

如何使用 iText 将 HTML 转换为 PDF [重复]

iText 7 将 HTML 转换为 PDF - 如何查看整个宽表?

如何使用iText的HTML转换为PDF