3

我目前正在使用 tm 包中的 readPDF() 函数从几个 PDF 中抓取一些文本数据。这一切都很好,在大多数情况下,编码似乎是“latin1” - 然而,在某些情况下,它不是。R中是否有检查字符编码的好方法?我在 tau 包中找到了函数 is.utf8() 和 is.local() ,但这显然只能让我到目前为止。

谢谢。

4

2 回答 2

1

我对 R 了解不多。但我现在对 CRAN 进行了一些研究,看看提到的tmtau包是什么。

所以tm用于文本挖掘,而对于 PDF 阅读,它需要并依赖于pdftotextPoppler 的实用程序。起初我有[明显错误]的印象,您提到的readPDF()函数正在对 PDF 文件中的 PDF 对象进行一些基于库的低级访问……我错了!结果它“只”查看pdftotext命令行工具的文本输出。

现在这解释了为什么您可能无法成功阅读任何使用比“简单”Latin1 更复杂的字体编码的 PDF。

恐怕,您的问题的原因是目前 Popplerpdftotext根本无法处理这些问题。

也许您最好向tm维护人员询问功能请求::-)

  • 您希望他们尝试 + 为他们的tm包添加支持,以获得更强大的第三方 PDF 文本提取工具,例如 PDFlib.com 的TET英文版),它肯定是地球上最好的文本提取实用程序(比Adobe自己的工具,顺便说一句)。
于 2012-07-05T21:29:47.507 回答
1

PDF 规范为拉丁文本定义了这些简单字体(每种字体最多可包含 256 个字符形状)的编码,这些编码应在任何符合标准的阅读器中预定义:

  • /StandardEncoding
    (适用于Type 1拉丁文本字体,但不适用于TrueType字体)
  • /MacRomanEncoding
    (Mac OS 标准编码,适用于TrueTypeType1字体)
  • /PDFDocEncoding
    (仅用于文档内容流之外的文本字符串;通常不用于显示字体中的文本)
  • /WinAnsiEncoding
    (Windows 代码页 1252 编码,适用于TrueTypeType1字体)
  • /MacExpertEncoding
    (名称具有误导性——编码不是特定于平台的;但是只有少数字体具有适当的字符集来使用这种编码)

然后有 2 种特定的符号字体编码:

  • 符号编码
  • ZapfDingBats 编码

此外,字体可以具有内置编码,这可能会偏离其创建者想要的标准编码的任何方式(当嵌入标准字体被子集化时,fe 也用于差异编码)。

因此,为了正确解释 PDF 文件,您必须查找所使用字体的每种字体编码,并且还必须考虑到任何/Encoding使用/Differences数组的情况。

但是,对于简单的字体,总体任务仍然相当简单。PDF 查看器程序只需将“我看到的用于表示文本字符串的字节序列中的每一个”按1:1 映射到“我可以在编码表中查找的确切一个字形”


对于复合,CID 键控字体(可能包含数千个字符形状),查看器程序的查找/映射“这是我看到的字节序列,我应该将其绘制为文本”“这是要绘制的字形形状的序列”不再是 1:1。在这里,需要对一个或多个字节的序列进行解码,以从 CIDFont中选择每个字形。

为了帮助这个 CIDFont 解码,周围需要有CMap结构。CMap 定义了从 Unicode 编码到字符集合的映射。PDF 规范为中文、日文和韩文字体定义了至少 5 打 CMap 及其标准名称。这些预定义的 CMap 不需要嵌入到 PDF 中(但符合要求的 PDF 阅读器需要知道如何正确处理它们)。但是(当然)也有自定义 CMap,当创建 PDF 的应用程序写出 PDF 时,这些 CMap 可能已经“即时”生成。在这种情况下,需要将 CMap 嵌入 PDF 文件中。

官方 PDF-1.7 规范中规定了有关这些复杂性的所有细节。

于 2012-07-05T16:47:12.093 回答