【问题标题】:PDF text extraction issue - font/capitalization inconsistenciesPDF 文本提取问题 - 字体/大写不一致
【发布时间】:2013-07-19 03:45:53
【问题描述】:

我正在尝试从 pdf 书籍中提取文本并继续运行一个问题,即复制的文本部分在粘贴到文本文档时无法保留正确的大写属性。我有权复制这本书,也有使用所有必要字体的许可。起初我认为这个问题是由没有嵌入字体引起的,但我检查了所有字体似乎都是嵌入的子集。在 pdf 中使用了 100 多种字体,它们具有以下属性之一:

TrueType 编码:Ansi TrueType (CID) 编码:Identity-H 类型 1 (CID) 编码:身份-H 类型 1 编码:自定义

书中的语言包括英语、德语、西班牙语和意大利语。在德国,大写是绝对关键的。它往往比小写更容易丢失大写属性。

错误的一个例子是:焊接 -> 焊接

我真的不知道在这里做什么。我已要求书的所有者将他所做的字体嵌入为子集,但问题仍然存在。我尝试将 pdf 文件保存为附言,然后通过蒸馏器运行它,这在很大程度上解决了问题,但在某些情况下,导致文本被替换为不同的字符或数字,显示为头骨。我知道 CID 字体可能会导致该问题,但我遇到过非 CID 字体具有相同结果的实例。

什么可能导致此问题?字体是子集还是完全嵌入的?是否有更好的方法将本机文件 (InDesign) 保存为 pdf 以允许更好的字体提取?它是否与非 unicode 字体有关,如果是,是否有不需要所有者选择不同字体的替代方法?

非常感谢任何和所有的帮助。

【问题讨论】:

  • 不幸的是,您既没有说明使用哪种工具进行文本提取,也没有提供示例 PDF 来说明问题。通常,文本提取中的错误可能是由于字体中的信息不完整或错误造成的。但也有大写/小写字体的情况,可以通过仅嵌入大写字母然后以不同大小显示它们来实现。每个嵌入的字母只有一个 ToUnicode 值,不过...

标签: pdf character-encoding adobe-indesign text-extraction truetype


【解决方案1】:

这确实很有趣。 OP 提供的示例 PDF 确实明显包含大写字符,其中一些仅大写行,一些混合大小写行,由 Adob​​e Reader 提取为小写字符。

你想知道

什么可能导致此问题?

作为一个例子,让我们看看Pelle Più bella

在页面内容中,该短语实际上看起来像大写字母的视觉表示:

/T1_0 1 Tf
-0.025 Tc 12 0 0 12 379.5354 554.8809 Tm
(PELLE PI\331 BELLA)Tj

查看使用的字体 T1_0(一个 DIN-Bold 子集),我们看到它声称使用 WinAnsiEncoding,这也表明对这些字符代码的解释页面流为大写字母

但字体也有一个ToUnicode映射,而这个映射映射

<41> <0061> — 'A' → a
<42> <0062> — 'B' → b
<43> <0043> — 'C' → C
<44> <0044> — 'D' → D
<45> <0065> — 'E' → e
<49> <0069> — 'I' → i
<4C> <006C> — 'L' → l
<4D> <004D> — 'M' → M
<4E> <006E> — 'N' → n
<50> <0050> — 'P' → P
<52> <0072> — 'R' → r
<53> <0053> — 'S' → S
<54> <0074> — 'T' → t
<D9> <00F9> — 'Ù' → ù

(我只从WinAnsiEncoding中代表大写字母的字符代码中提取映射。)

有没有更好的方法将本机文件 (InDesign) 保存为 pdf,以便更好地提取字体?

抱歉,我不是很喜欢 InDesign。但是,如果那是来自 Adob​​e 的软件,如果这是 InDesign 中的错误或其导出为 PDF,我会感到惊讶。是否可能是 InDesign 文件中有一些信息将 PELLE PIÙ BELLA 标记为 Pelle Più bella,然后 InDesign 在 PDF 导出中将其转换为这个 ToUnicode 映射?

它是否与非 unicode 字体有关,如果是,是否有不需要所有者选择不同字体的替代方法?

如果您的示例文档有三种字体,它们都带有 Encoding 条目 WinAnsiEncoding, 它们都是嵌入的子集,但只有两个具有这样的子集有趣的 ToUnicode 映射,DIN-Medium 和 DIN-Bold,而 Helvetica 没有 ToUnicode 映射。所以它在某种程度上与字体有关。具体如何我不能说。

解决方法如果您的示例文档是从字体字典中删除 ToUnicode 映射。

例如使用 Java 和 iText 库,您可以这样做:

PdfReader reader = new PdfReader(INPUT);
for (int i = 1; i <= reader.getXrefSize(); i++)
{
    PdfObject obj = reader.getPdfObject(i);
    if (obj != null && obj.isDictionary())
    {
        PdfDictionary dic = (PdfDictionary) obj;
        if (PdfName.FONT.equals(dic.getAsName(PdfName.TYPE)))
        {
            dic.remove(PdfName.TOUNICODE);
        }
    }
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(OUTPUT));
stamper.close();
reader.close();

在此操作后,Adobe Reader 文本提取结果

PELLE PIÙ BELLA

这显然只适用于示例文档中的情况。

如果在您的其他文档中有混合字体,其中一些需要它们各自的 ToUnicode 映射来进行文本提取,而另一些则类似于上面的问题字体,您可能需要添加一些额外的条件Java 代码仅删除错误字体定义中的地图。

【讨论】:

  • 谢谢你,这是非常有用的信息。您对编码 pdf 以进行字体提取的最佳方法有什么建议吗?似乎有很多类型的编码。我的理解是编码取决于字体的类型。 .ps 文件会比 pdf 更好吗?这是否允许蒸馏器决定如何编码嵌入的字体?
  • 另外,您使用什么工具来获得该信息?我一直在使用许多脚本,但无法收集相同的信息。非常感谢您对此提供的帮助。
  • 关于对 pdf 进行字体提取的最佳编码方式的任何建议 - 我希望 InDesign 能够正确导出为 PDF。因此,您应该首先调查是什么让 InDesign 导出了这些奇怪的映射。我使用的工具是一个 PDF 对象浏览器,在我的例子中是 iText RUPS。显然,有关 PDF 内部的一些知识也很重要。
  • 我刚刚发现的有趣事实。当导出 PDF 并标记另存为标记的选项时,文本会正确提取。当标记选项未标记时,问题继续存在。任何想法为什么?我已经阅读了 Adob​​e 网站上的规格表,但不明白为什么它会影响正确的编码。我理解标记可以更多地处理可访问性和流程。
  • 分析您的新样本我发现在“创建标记的 PDF”的情况下,ToUnicode 映射本身正确地将大写字母映射到大写字母,而没有它则不会。这看起来很奇怪,“标记”选项不应该以这种方式影响 PDF 导出。 额外风险?我不知道,这里的事情太奇怪了,我不敢猜测。 Other item 我认为在 InDesign 眼中改变文本属性并不会改变最初的写作内容;但是由于每个角色的外观都只导出一次,因此只导出了第一个解释......奇怪,奇怪,奇怪。
【解决方案2】:

无需跳过 PDF 圈。它甚至不是一个好的文本交换格式。

有没有更好的方法将本机文件 (InDesign) 保存为 pdf,以便更好地提取字体?

要求文件提供者进行 RTF 导出。这将保留所有使用的字体和格式。

您的 WELD-weld 问题可能是由于字体(如果它包含映射到相同字形的大写和小写字母)、使用了 OpenType 功能(如全大写字母),或者甚至是创建错误的纯文本在 PDF 中流式传输。

【讨论】:

    猜你喜欢
    • 2011-11-15
    • 2014-04-15
    • 1970-01-01
    • 2011-07-15
    • 2016-01-29
    • 1970-01-01
    • 2014-01-17
    • 2023-03-05
    • 2018-08-25
    相关资源
    最近更新 更多