使用 PDFminer 解析 pdf(梵文脚本)会给出错误的输出
Parsing a pdf(Devanagari script) using PDFminer gives incorrect output
我正在尝试解析包含印度选民名单的 pdf 文件,该名单采用印地语(梵文脚本)。
PDF 正确显示所有文本,但是当我尝试使用 PDFminer 将此 pdf 转储为文本格式时,它输出的字符与原始 pdf 字符不同
例如
Displayed/Correct 单词是 सामान्य
但是输出的单词是सपमपनद
现在我想知道为什么会这样以及如何正确解析这种类型的 pdf 文件
我还包括示例 pdf 文件-
此问题与 this answer, and the appearance of the sample document there does also remind of the document here 中讨论的问题非常相似。
就像其他问题中的文档一样,此处文档中使用的 Devanagari 脚本字体的 ToUnicode 映射将多个完全不同的字形映射到相同的 Unicode 代码点。因此,基于此映射的文本提取注定会失败,并且大多数文本提取器都依赖于这些信息,尤其是在没有像此处这样的字体 Encoding 条目的情况下。
一些文本提取器可以使用嵌入字体程序(如果存在)中包含的字形到 Unicode 的映射。但是在此处文档中使用的 Devanagari 脚本字体程序中检查此映射,事实证明它将大多数字形与 U+f020 到 U+f062 相关联,名称为 "uniF020" 等
这些 Unicode 代码点位于 Unicode 私人使用区,即它们没有标准化的含义,但应用程序可以随意使用它们。
因此,使用字体程序中包含的 Unicode 映射的文本提取器也不会立即提供可理解的文本。
尽管如此,有一个事实可以帮助您大多数情况下从该文档中自动提取文本:多个页面上的 Devanagari 脚本字体引用了同一个 PDF 对象, 因此在引用相同 PDF 对象的所有页面上,相同的原始字符标识符或相同的字体程序专用 Unicode 代码点引用相同的视觉符号。对于您的文档,我只计算了 5 个字体副本。
因此,如果您发现文本提取器 returns 字符标识符(忽略所有 toUnicode 映射)或 returns 来自字体程序的专用区域 Unicode 代码点,您可以使用它的输出并仅根据一些映射替换每个条目。
我还没有用过这样的文本提取器,所以在 python 上下文中我不知道。但是谁知道呢,可能可以告诉 pdfminer 或任何其他类似的包(通过某些选项)忽略误导性的 ToUnicode 映射,然后按上面概述的方式使用。
我正在尝试解析包含印度选民名单的 pdf 文件,该名单采用印地语(梵文脚本)。
PDF 正确显示所有文本,但是当我尝试使用 PDFminer 将此 pdf 转储为文本格式时,它输出的字符与原始 pdf 字符不同
例如 Displayed/Correct 单词是 सामान्य
但是输出的单词是सपमपनद
现在我想知道为什么会这样以及如何正确解析这种类型的 pdf 文件
我还包括示例 pdf 文件-
此问题与 this answer, and the appearance of the sample document there does also remind of the document here 中讨论的问题非常相似。
就像其他问题中的文档一样,此处文档中使用的 Devanagari 脚本字体的 ToUnicode 映射将多个完全不同的字形映射到相同的 Unicode 代码点。因此,基于此映射的文本提取注定会失败,并且大多数文本提取器都依赖于这些信息,尤其是在没有像此处这样的字体 Encoding 条目的情况下。
一些文本提取器可以使用嵌入字体程序(如果存在)中包含的字形到 Unicode 的映射。但是在此处文档中使用的 Devanagari 脚本字体程序中检查此映射,事实证明它将大多数字形与 U+f020 到 U+f062 相关联,名称为 "uniF020" 等
这些 Unicode 代码点位于 Unicode 私人使用区,即它们没有标准化的含义,但应用程序可以随意使用它们。
因此,使用字体程序中包含的 Unicode 映射的文本提取器也不会立即提供可理解的文本。
尽管如此,有一个事实可以帮助您大多数情况下从该文档中自动提取文本:多个页面上的 Devanagari 脚本字体引用了同一个 PDF 对象, 因此在引用相同 PDF 对象的所有页面上,相同的原始字符标识符或相同的字体程序专用 Unicode 代码点引用相同的视觉符号。对于您的文档,我只计算了 5 个字体副本。
因此,如果您发现文本提取器 returns 字符标识符(忽略所有 toUnicode 映射)或 returns 来自字体程序的专用区域 Unicode 代码点,您可以使用它的输出并仅根据一些映射替换每个条目。
我还没有用过这样的文本提取器,所以在 python 上下文中我不知道。但是谁知道呢,可能可以告诉 pdfminer 或任何其他类似的包(通过某些选项)忽略误导性的 ToUnicode 映射,然后按上面概述的方式使用。